相比于K-Means聚类的局限性,层级聚类对复杂数据有更强的灵活性。本文介绍 Python与MATLAB的凝聚层级聚类的实现方法。
在聚类之前
需要注意的是,在进行聚类处理之前,应当对数据进行归一化甚至白化避免任一维度的数值范围过大对结果带来影响。
Python数据白化可以使用 scipy 库中的cluster.vq.whiten 例如:
data_whiten = whiten(data)
MATLAB 则可以使用 mapminmax(data,0,1)进行归一化,或使用 normalization()函数(要求版本R2019a+
Python实现
依赖
使用 sklearn:
import sklearn.cluster as sc
使用
以下由一个二维x,y列表数组作为例子,分为两类,之后绘制聚类结果:
cluster_pred = sc.AgglomerativeClustering(n_clusters=2).fit_predict(data_whiten)
plt.scatter(data[...,1], data[...,0],c=cluster_pred)
参数
默认所有参数都是可选参数,默认分为两类,即n_clusters=2;可能用到的参数有:
| 参数 | 描述 | 默认值 |
|---|---|---|
n_clusters |
聚类数,int类型 |
2 |
linkage |
不同的点间距计算方法,字符串 可选{“ward”, “complete”, “average”, “single”} | “ward” |
MATLAB 实现
相较于Python,MATLAB需要先生成 linkage 树之后再调用 cluster函数进行聚类(树剪裁),具体如下:
Z = linkage(data_maxmin, 'ward');
c = cluster(Z, 'maxclust',3);
gscatter(data(:,2), data(:,1),c);
同样的,可以使用对linkage中的点间距、聚类时的类数目maxclust进行修改;
对于Linkage Method,可选如下:
| 关键词 | 描述 |
|---|---|
| ‘average’ | 平均距离,未加权值 (UPGMA) |
| ‘centroid’ | 质心距离(UPGMC) |
| 'complete’ | 最远距离 |
| 'median’ | 加权质心距离(WPGMC) |
| ‘single’ | 最短距离 |
| 'ward’ | 内平方距离(最小方差算法) |
| 'weighted’ | 加权平均距离 (WPGMA) |
同样的,对于距离计算方法Distance Metric也可选择,详见参考文档2。