层次聚类算法使用数据的联結规则,对数据集合进行层次似的聚类。层次聚类可以分为两大类,自顶向下的分裂聚类和自顶而上的合并聚类。分裂聚类是将所有的对象看成一个聚类,然后将其不断分解直至满足终止条件。后者与前者相反,它先将每个对象各自作为一个原子聚类,然后对这些原子聚类逐层进行聚类,直至满足终止条件。代表算法有:CURE、CHAMELEON、ROCK、Hierarchical等
对于层次聚类常用的距离度量方法主要有最大距离、最小距离、平均距离等。一个算法使用最大距离度量距离的时候,称为最远邻聚类算法。一个算法使用最小距离度量距离的时候,称为邻聚类算法。使用最小距离度量的聚合增长算法也称为最小生成树算法。当最近族的距离超过某个阀值时算法停止,称为全连接算法。平均距离是对最大最小距离度量的折中,可以有效克服噪音和奇异点的影响。
算法:(以合并算法为例)
setp1:每个样本作为单独一类(c1,c2,...cn)
setp2:计算每2类的距离d
setp3:找出最小的d,合并这2类
setp4:判断剩余类数是否是达到预类数(可以自己设置),没有达到,返回setp2,达到,跳出循环,输出每层类别
优点:1,距离和规则的相似度容易定义,限制少;2,不需要预先制定聚类数;3,可以发现类的层次关系;4,可以聚类成其它形状5.适用于任意形状和任意属性的数据集;灵活控制不同层次的聚类粒度,强聚类能力
缺点:1,计算复杂度太高;2,奇异值也能产生很大影响;3,算法很可能聚类成链状4.大大延长了算法的执行时间,不能回溯处理;4.需要预设类别数
代码:hierarchical为例
from sklearn.cluster import AgglomerativeClustering
from sklearn import datasets
from dask.array.learn import predict
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(y)
clf=AgglomerativeClustering(n_clusters=3)
predicted=clf.fit_predict(X)
print(predicted)
k2y = np.array([1,0,2])
print(k2y[predicted])
print((k2y[predicted] == y).astype(int).mean())
这样的聚类精度为0.893
Biech算法
from sklearn.cluster import Birch
from sklearn import datasets
from dask.array.learn import predict
import numpy as np
iris = datasets.load_iris()
X = iris.data
y = iris.target
print(y)
clf=Birch(n_clusters=3)
predicted=clf.fit_predict(X)
print(predicted)
k2y = np.array([2,1,0])
print(k2y[predicted])
print((k2y[predicted] == y).astype(int).mean())
聚类精度为0.813