Python机器学习——Agglomerative层次聚类

层次聚类(hierarchical clustering)可在不同层次上对数据集进行划分,形成树状的聚类结构。AggregativeClustering是一种常用的层次聚类算法。 
??其原理是:最初将每个对象看成一个簇,然后将这些簇根据某种规则被一步步合并,就这样不断合并直到达到预设的簇类个数。这里的关键在于:如何计算聚类簇之间的距离? 
??由于每个簇就是一个集合,因此需要给出集合之间的距离。给定聚类簇Ci,CjCi,Cj,有如下三种距离:

  • 最小距离:

    dmin(Ci,Cj)=minx? i∈Ci,x? j∈Cjdistance(x? i,x? j)dmin(Ci,Cj)=minx→i∈Ci,x→j∈Cjdistance(x→i,x→j)

    它是两个簇的样本对之间距离的最小值。

  • 最大距离:

    dmax(Ci,Cj)=maxx? i∈Ci,x? j∈Cjdistance(x? i,x? j)dmax(Ci,Cj)=maxx→i∈Ci,x→j∈Cjdistance(x→i,x→j)

    它是两个簇的样本对之间距离的最大值。

  • 平均距离:

    davg(Ci,Cj)=1|Ci||Cj|∑x? i∈Ci∑x? j∈Cjdistance(x? i,x? j)davg(Ci,Cj)=1|Ci||Cj|∑x→i∈Ci∑x→j∈Cjdistance(x→i,x→j)

    它是两个簇的样本对之间距离的平均值。

??当该算法的聚类簇采用dmindmin时,称为单链接single-linkage算法,当该算法的聚类簇采用dmaxdmax时,称为单链接complete-linkage算法,当该算法的聚类簇采用davgdavg时,称为单链接average-linkage算法。

??下面给出算法:

  • 输入:

    • 数据集D=D={x? 1,x? 2,...,x? Nx→1,x→2,...,x→N}
    • 聚类簇距离度量函数
    • 聚类簇数量KK
  • 输出:簇划分C=C={C1,C2,...,CKC1,C2,...,CK}
  • 算法步骤如下:
    • 初始化:将每个样本都作为一个簇

      Ci=[x? i],i=1,2,...,NCi=[x→i],i=1,2,...,N

    • 迭代:终止条件为聚类簇的数量为K。迭代过程如下: 
      • 计算聚类簇之间的距离,找出距离最近的两个簇,将这两个簇合并。


    Python实战



    ??AgglomerativeClustering是scikit-learn提供的层级聚类算法模型,其原型为:
class sklearn.cluster.AgglomerativeClustering(n_clusters=2, affinity=’euclidean’, memory=None, connectivity=None, compute_full_tree=’auto’, linkage=’ward’, pooling_func=<function mean>)
  • 1

参数

  • n_clusters:一个整数,指定分类簇的数量
  • connectivity:一个数组或者可调用对象或者None,用于指定连接矩阵
  • affinity:一个字符串或者可调用对象,用于计算距离。可以为:’euclidean’,’l1’,’l2’,’mantattan’,’cosine’,’precomputed’,如果linkage=’ward’,则affinity必须为’euclidean’
  • memory:用于缓存输出的结果,默认为不缓存
  • n_components:在 v-0.18中移除
  • compute_full_tree:通常当训练了n_clusters后,训练过程就会停止,但是如果compute_full_tree=True,则会继续训练从而生成一颗完整的树
  • linkage:一个字符串,用于指定链接算法 
    • ‘ward’:单链接single-linkage,采用dmindmin
    • ‘complete’:全链接complete-linkage算法,采用dmaxdmax
    • ‘average’:均连接average-linkage算法,采用davgdavg
  • pooling_func:一个可调用对象,它的输入是一组特征的值,输出是一个数

属性

  • labels:每个样本的簇标记
  • n_leaves_:分层树的叶节点数量
  • n_components:连接图中连通分量的估计值
  • children:一个数组,给出了每个非节点数量

方法

  • fit(X[,y]):训练样本
  • fit_predict(X[,y]):训练模型并预测每个样本的簇标记


from sklearn import cluster
from sklearn.metrics import adjusted_rand_score
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets.samples_generator import make_blobs

"""
    产生数据
"""
def create_data(centers,num=100,std=0.7):
    X,labels_true = make_blobs(n_samples=num,centers=centers, cluster_std=std)
    return X,labels_true

"""
    数据作图
"""
def plot_data(*data):
    X,labels_true=data
    labels=np.unique(labels_true)
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    colors=‘rgbycm‘
    for i,label in enumerate(labels):
        position=labels_true==label
        ax.scatter(X[position,0],X[position,1],label="cluster %d"%label),
        color=colors[i%len(colors)]

    ax.legend(loc="best",framealpha=0.5)
    ax.set_xlabel("X[0]")
    ax.set_ylabel("Y[1]")
    ax.set_title("data")
    plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

这里写代码片
"""
    测试函数
"""
def test_AgglomerativeClustering(*data):
    X,labels_true=data
    clst=cluster.AgglomerativeClustering()
    predicted_labels=clst.fit_predict(X)
    print("ARI:%s"% adjusted_rand_score(labels_true, predicted_labels))

"""
    考察簇的数量对于聚类效果的影响
"""
def test_AgglomerativeClustering_nclusters(*data):
    X,labels_true=data
    nums=range(1,50)
    ARIS=[]
    for num in nums:
        clst=cluster.AgglomerativeClustering(n_clusters=num)
        predicted_lables=clst.fit_predict(X)
        ARIS.append(adjusted_rand_score(labels_true, predicted_lables)) 

    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    ax.plot(nums,ARIS,marker="+")
    ax.set_xlabel("n_clusters")
    ax.set_ylabel("ARI")
    fig.suptitle("AgglomerativeClustering")
    plt.show()   

"""
    考察链接方式对聚类结果的影响
"""
def test_agglomerativeClustering_linkage(*data):
    X,labels_true=data
    nums=range(1,50)
    fig=plt.figure()
    ax=fig.add_subplot(1,1,1)
    linkages=[‘ward‘,‘complete‘,‘average‘]
    markers="+o*"
    for i,linkage in enumerate(linkages):
        ARIs=[]
        for num in nums:
            clst=cluster.AgglomerativeClustering(n_clusters=num,linkage=linkage)
            predicted_labels=clst.fit_predict(X)
            ARIs.append(adjusted_rand_score(labels_true, predicted_labels))
        ax.plot(nums,ARIs,marker=markers[i],label="linkage:%s"%linkage)

    ax.set_xlabel("n_clusters")
    ax.set_ylabel("ARI")
    ax.legend(loc="best")
    fig.suptitle("AgglomerativeClustering")
    plt.show()
centers=[[1,1],[2,2],[1,2],[10,20]]
X,labels_true=create_data(centers, 1000, 0.5)
test_AgglomerativeClustering(X,labels_true)
plot_data(X,labels_true)
test_AgglomerativeClustering_nclusters(X,labels_true)
test_agglomerativeClustering_linkage(X,labels_true)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59

可以看到当n_clusters=4时,ARI指数最大,因为确实是从四个中心点产生的四个簇。
  • 1
  • 2

 可以看到,三种链接方式随分类簇的数量的总体趋势相差无几。但是单链接方式ward的峰值最大

原文地址:https://www.cnblogs.com/jfdwd/p/9251242.html

时间: 2024-10-09 02:05:38

Python机器学习——Agglomerative层次聚类的相关文章

机器学习之层次聚类

层次聚类 聚类是将样本进行归类形成K个簇,层次聚类是其中的一种方法.它将数据组成一棵聚类树,过程可以是凝聚形式或分裂形式. 核心思想 凝聚是一开始将每个样本当做一个聚类,接着通过计算将距离最近的两个聚类合并,成为新聚类,每次合并聚类总数减少一个,不断循环合并操作,直到所有聚类合并成一个聚类或当聚类数量到达某预定值或当聚类直接距离达到某阀值后停止合并.而分裂则与凝聚相反,一开始将所有样本当做一个聚类,每次分裂一个聚类,直到满足某条件. 算法步骤 计算n个样本两两之间的距离 构造n个簇 找到最近距离

python实现一个层次聚类方法

层次聚类(Hierarchical Clustering) 一.概念 层次聚类不需要指定聚类的数目,首先它是将数据中的每个实例看作一个类,然后将最相似的两个类合并,该过程迭代计算只到剩下一个类为止,类由两个子类构成,每个子类又由更小的两个子类构成.如下图所示: 二.合并方法 在聚类中每次迭代都将两个最近的类进行合并,这个类间的距离计算方法常用的有三种: 1.单连接聚类(Single-linkage clustering) 在单连接聚类中,两个类间的距离定义为一个类的所有实例到另一个类的所有实例之

【机器学习】--层次聚类从初识到应用

一.前述 聚类就是对大量未知标注的数据集,按数据的内在相似性将数据集划分为多个类别,使类别内的数据相似度较大而类别间的数据相似度较小. 数据聚类算法可以分为结构性或者分散性,许多聚类算法在执行之前,需要指定从输入数据集中产生的分类个数. 1.分散式聚类算法,是一次性确定要产生的类别,这种算法也已应用于从下至上聚类算法. 2.结构性算法利用以前成功使用过的聚类器进行分类,而分散型算法则是一次确定所有分类. 结构性算法可以从上至下或者从下至上双向进行计算.从下至上算法从每个对象作为单独分类开始,不断

吴裕雄 python 机器学习——K均值聚类KMeans模型

import numpy as np import matplotlib.pyplot as plt from sklearn import cluster from sklearn.metrics import adjusted_rand_score from sklearn.datasets.samples_generator import make_blobs def create_data(centers,num=100,std=0.7): X, labels_true = make_b

Python机器学习--聚类

K-means聚类算法 测试: # -*- coding: utf-8 -*- """ Created on Thu Aug 31 10:59:20 2017 @author: Administrator """ ''' 现有1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主 要变量数据,这八个变量分别是:食品. 衣着. 家庭设备用品及服务. 医疗 保健. 交通和通讯. 娱乐教育文化服务. 居住以及杂项商品和服务. 利用已 有数据

机器学习--聚类系列--层次聚类

层次聚类 层次聚类(Hierarchical Clustering)是聚类算法的一种,通过计算不同类别数据点间的相似度来创建一棵有层次的嵌套聚类树.在聚类树中,不同类别的原始数据点是树的最低层,树的顶层是一个聚类的根节点.创建聚类树有自下而上合并和自上而下分裂两种方法. 作为一家公司的人力资源部经理,你可以把所有的雇员组织成较大的簇,如主管.经理和职员:然后你可以进一步划分为较小的簇,例如,职员簇可以进一步划分为子簇:高级职员,一般职员和实习人员.所有的这些簇形成了层次结构,可以很容易地对各层次

机器学习-层次聚类(划分聚类)

层次聚类(划分聚类) 聚类就是对大量未知标注的数据集,按照数据内部存在的数据特征将数据集划分为多个不同的类别,使类别内的数据比较相似,类别之间的数据相似度比较小:属于无监督学习. 算法步骤 1.初始化的k个中心点 2.为每个样本根据距离分配类别 3.更新每个类别的中心点(更新为该类别的所有样本的均值) 4.重复上面两步操作,直到达到某个中止条件 层次聚类方法对给定的数据集进行层次的分解,直到满足某种条件为止,传统的层次聚类算法主要分为两大类算法: 凝聚的层次聚类 AGNES算法==>采用自底向上

机器学习(6)之聚类算法(k-means\Canopy\层次聚类\谱聚类)

目录 1 聚类的定义 1.1 距离公式(相似度) 1.2 聚类的思想 2 K-means算法 2.1 K-means算法的思考 2.2 总结 3 二分K-Means算法 4 K-Means++算法 4.1 K-Means||算法 5 Canopy算法 5.1 应用场景 6 Mini Batch K-Means算法 7 层次聚类方法 7.1 AGNES算法中簇间距离 7.2 层次聚类优化算法 8 密度聚类 8.1 DBSCAN算法 8.1.1 基本概念 8.1.2 算法流程 8.1.3 DBSCA

Python爬虫技术(从网页获取图片)+HierarchicalClustering层次聚类算法,实现自动从网页获取图片然后根据图片色调自动分类—Jason niu

网上教程太啰嗦,本人最讨厌一大堆没用的废话,直接上,就是干! 网络爬虫?非监督学习? 只有两步,只有两个步骤? Are you kidding me? Are you ok? 来吧,follow me, come on! 第一步:首先,我们从网上获取图片自动下载到自己电脑的文件内,如从网址,下载到F:\File_Python\Crawler文件夹内,具体代码请查看http://www.cnblogs.com/yunyaniu/p/8244490.html 第二步:我们利用非监督学习的Hierar