层次聚类从形式上分可以分成两种,一种是凝聚(Agglomerative),一种是分割(Divisive)。凝聚是指把每个元素开始时都看成一个单独的簇(类别),然后进行聚合,将两个元素合成一类,不断重复,最终将它形成一个簇。分割反过来,将所有元素看成一个大类,不断进行分割。
最简单也最流行的层次聚类就是Agglomerative,它的逻辑非常简单,就是计算每个元素到其它所有元素的距离,然后做出矩阵,合并距离最近的两个集群,直到合并成一个簇,此时可以建立系统树图(如右图),系统树图的横坐标表示元素编号,纵坐标表示距离。想要分成几个类从指定的位置切割树即可。
两个点的距离非常容易计算,但是两个簇的距离应该如何计算呢?
如果像这样取簇中距离最小值的两个点(min,single link),优势是可以处理非椭圆形的形状,但同时这种方法对噪声更敏感。
如果取簇中距离最大值的两个点,其优势是对噪音不敏感,但同时它有破坏大型簇的趋势,而且形成的簇偏向于球形星团(globular cluster)
取每个簇的平均位置(group average)固然是一个好方法,其优势是对噪音不敏感,但是形成的簇依旧偏向于球形星团(globular cluster)
Ward’s Method
基于簇之间的平方误差(squared error)
不易受噪声和异常值的影响
偏向于球形星团
可以用ward方法进行层次聚类,找到中心,再把中心带到kmean中计算
最常见的AgglomerativeClustering用法
#使用pandas读取csv文件
import pandas as pd
cash=pd.read_csv('BanknoteData.csv')
from sklearn.cluster import AgglomerativeClustering
#确定分成两类
hc_alg = AgglomerativeClustering(n_clusters=2).fit(cash)
#在cash中增加一列class,将预测结果加入其中
cash['Class']=hc_alg.labels_
linkage属性分析:
class sklearn.cluster.AgglomerativeClustering(n_clusters=2, affinity=’euclidean’, memory=None, connectivity=None, compute_full_tree=’auto’, linkage=’ward’,pooling_func=’deprecated’, distance_threshold=None)
linkage : {“ward”, “complete”, “average”, “single”}, 默认为”ward”,其他可选值还包括"average","single"(就是最小值),和"complete"(最大值)