Agglomerative Hierarchical Clustering-聚合层次聚类

目录

 

算法描述

簇间距离

数据比较

聚合层次聚类的问题

Question

学习来源


算法描述

  聚合层次聚类是一种自下而上的算法,首先将每个样本都视为一个簇,然后开始按一定规则,将相似度高的簇进行合并,最后所有样本都形成一个簇或达到某一个条件时,算法结束。

  确定簇与簇之间相似度是该算法的要点,而这里的相似度是由簇间距离来确定的,簇间距离短(小)的相似度高,簇间距离长(大)的相似度低。

簇间距离

MIN
  MIN,又称为“单链”,即取两个簇之间距离最近的两个点的距离(两个簇间的最小边长)。

                                                            d(u,v)=min(dist(u[i],v[j]))
  单链技术适合处理非椭圆形状的簇,但是对于噪声和离群点十分敏感。

MAX
  
MAX,又称为“全链”,即取两个簇之间距离最远的两个点的距离(两个簇间的最大边长)。

                                                           d(u,v)=max(dist(u[i],v[j]))
  全链技术生成的簇形状偏向于圆形,且不易受到噪声和离群点的影响,但是容易使大的簇破裂。

组平均
  组平均,这里简单介绍两种。
  一是非加权组平均(UPGMA)

                                                         d(u,v)=\sum_{ij}(\frac{dist(u[i],v[j])}{(|u|*|v|)})
  其中|u|和|v|分别表示簇u和簇v的元素个数。
  二是加权组平均(WPGMA)
                                                       d(u,v)=\frac{dist(s,v)+dist(t,v)}{2}
  其中u是由s和t合并形成的。
  通常情况下非加权更为可靠,除非由于重采样等原因,导致需要考虑样本权值时,才会使用加权。

质心距离
  质心距离,指的是簇质心与簇质心之间的距离。这里简单描述两种质心距离。
  一种是UPGMC,即                     
                                                      dist(u,v)=||c_{u}-c_{v}||_{2}
  其中c_{u}c_{v}分别为簇u和簇v的聚类中心;
  另一种是WPGMC,即新簇质心取合并的两个簇的质心均值(取质心的方法不同)。
  使用质心距离计算簇间相似度的方法,与其他方法有一个明显的区别,就是用于计算距离的数据,可能是不存在于样本的数据。简而言之,使用其他方法计算簇间距离,都是基于簇中某个样本去跟另一个簇的某个样本计算,而合并后,计算的基础也还是簇中的样本,而使用质心距离,簇合并后,质心数据是会发生变化的,质心变化后,质心数据就可能不存在于样本数据里。
  因而,在簇不断合并的过程中,其他方法计算簇间距离,簇间距离是递增的,而使用质心距离计算,簇间距离不一定递增。举个例子:在第K-1轮,簇s和簇t的簇间距离为a',在第K轮,簇u(由簇s和簇t合并而来)和簇v的簇间距离为a。则若是使用质心距离计算得出的簇间距离a'和a,可能会有a<a'的情况(即合并后与簇v更相似);而若是使用其他方法计算得出的簇间距离a'和a,则一定有a>a'(因为由于计算距离的数据不变,若a<a',即意味有簇s(簇t)和簇v的簇间距离为a,则必定有簇s(簇t)与簇v先合并,而非簇s与簇t先合并)。

沃德方差最小化
                                    d(u,v)=\sqrt{\frac{|s|+|v|}{T}dist(s,v)^{2}+\frac{|t|+|v|}{T}dist(t,v)^{2}-\frac{|v|}{T}d(s,t)^{2}}
  其中u是s和t合并形成的,而T=|s|+|t|+|v|,|*|等于簇*的元素个数

数据比较

  在以上的描述里,可知,在样本数据固定的情况下,影响聚类结果的因素主要有两个,计算簇于簇之间相似度的方法和距离的计算公式。下面我们通过编程结果来看看,在两个因素影响下,Agglomerative Hierarchical Clustering算法的效果。

  使用欧式距离计算样本距离,分别使用MIN,MAX,沃德方差最小化,非加权组平均计算相似度。
  左边树图为各簇聚合顺序,右边散点图为聚合结果(将样本数据聚合成3类)

欧式距离-MIN

 

欧式距离-MAX
欧式距离-沃德方差最小化
欧式距离-UPGMA

   

  使用MAX计算簇间相似度,分别使用欧式距离,堪培拉距离,明氏距离,切比雪夫距离计算样本距离。
  左边树图为各簇聚合顺序,右边散点图为聚合结果(将样本数据聚合成3类)

欧式距离-MAX
堪培拉距离-MAX
明氏距离-MAX
切比雪夫距离-MAX

所用代码:
 

# -*- coding: utf-8 -*-
import pandas as pd
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist
from scipy.cluster.hierarchy import linkage
from scipy.cluster.hierarchy import dendrogram
from sklearn.cluster import AgglomerativeClustering
from itertools import cycle
from sklearn.datasets import make_blobs

#产生的数据个数
n_samples = 3000
#数据中心点
centers = [[2, 2], [-1, -1], [1, -2]]
#生产数据
X, labels = make_blobs(n_samples=n_samples, centers=centers, cluster_std=1,random_state=0)
variables = ['X', 'Y']
# 层次聚类树
df = pd.DataFrame(X, columns=variables, index=labels)
'''
pdist:计算样本距离,其中参数metric代表样本距离计算方法
(euclidean:欧式距离
minkowski:明氏距离
chebyshev:切比雪夫距离
canberra:堪培拉距离)

linkage:聚类,其中参数method代表簇间相似度计算方法
(single:  MIN
ward:沃德方差最小化
average:UPGMA
complete:MAX)
'''
row_clusters = linkage(pdist(df, metric='canberra'), method='complete')
print(pd.DataFrame(row_clusters, columns=['row label1', 'row label2', 'distance', 'no. of items in clust.'],
                   index=['cluster %d' % (i + 1) for i in range(row_clusters.shape[0])]))

#绘图 层次聚类树
row_dendr = dendrogram(row_clusters, labels=labels)
plt.tight_layout()
plt.title('canberra-complete' )
plt.show()

#凝聚层次聚类,应用对层次聚类树剪枝
n_clusters_=3 #分三类
'''
使用Agglomerative Hierarchical Clustering算法
其中参数affinity代表样本距离计算方法  参数linkage代表簇间相似度计算方法
'''
ac=AgglomerativeClustering(n_clusters=n_clusters_,affinity='canberra',linkage='complete')
labels = ac.fit_predict(X)
print ('cluster labels:%s'%labels)

#绘图
plt.figure(1)
plt.clf()
colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(0,3), colors):
    ##根据lables中的值是否等于k,重新组成一个True、False的数组
    my_members = labels == k
    ##X[my_members, 0] 取出my_members对应位置为True的值的横坐标
    plt.plot(X[my_members, 0], X[my_members, 1], col + '.')
plt.title('canberra-complete' )
plt.show()

聚合层次聚类的问题

  聚合层次聚类的每一步都是着力于将两个最相似的簇合并,达到了局部最优,但是,由于该操作无法根据之后的结果,对之前的聚类结果进行更新,所以,聚合层次聚类不一定能通过每一次的局部最优,最后达到(转化为)全局最优。例如,在以上的程序实验里,可以看出,在样本数据存在某些对应的‘极值’时,对应的相似度计算方法或距离计算方法,是无法得出很好的聚类结果的。因此,一般而言,我们可以先用其他的一些聚类方法(例如k-means等),先将样本数据聚合成初步的簇群,然后再用聚合层次聚类对簇群进行聚类。

Question

  以上是我学习聚合层次聚类法时的学习笔记,首先感谢各路大神的学习分享。而在此之外,我还存在一些疑问,希望知道答案的各位读者不吝赐教,回复一下答案或想法,谢谢。

  1.如果两个以上的簇群间相似度是一样的,根据编译器的代码自行选择合并其中的两个,这种合并方式,是否会影响到聚类的结果?如果有影响,影响的程度大不大?

  2.笔记中关于使用同一种簇群相似度计算方法,不同样本距离计算方法的聚类结果的比较,是否有意义?没有意义的原因或者结论(意义)是什么?(因为我好像还没有看到过类似的数据比较与结论)

 

学习来源

https://blog.csdn.net/qq_39388410/article/details/78240037
https://blog.csdn.net/qq_40793975/article/details/83272380#t0
https://www.cnblogs.com/CVFans/p/4103430.html

  • 12
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值