Hierarchical Clustering(层次聚类)

层次聚类原理:

Hierarchical Clustering(层次聚类)_第1张图片

唔?排序的图?分治?没错,与原型聚类和密度聚类不同,层次聚类试图在不同的“层次”上对样本数据集进行划分,一层一层地进行聚类。就划分策略可分为自底向上的凝聚方法(agglomerative hierarchical clustering),比如AGNES。自上向下的分裂方法(divisive hierarchical clustering),比如DIANA

AGNES先将所有样本的每个点都看成一个簇,然后找出距离最小的两个簇进行合并,不断重复到预期簇或者其他终止条件。
DIANA先将所有样本当作一整个簇,然后找出簇中距离最远的两个簇进行分裂,不断重复到预期簇或者其他终止条件。

如何判断两个cluster之间的距离呢?Ward
1.最小距离,单链接Single Linkage
两个簇的最近样本决定。
2.最大距离,全链接Complete Linkage
两个簇的最远样本决定。
3.平均距离,均链接Average Linkage
两个簇所有样本共同决定。
1和2都容易受极端值的影响,而3这种方法计算量比较大,不过这种度量方法更合理。

和决策树相似,层次聚类的优点在于能一次性得到整棵树,同控制某些条件不管是深度还是宽度都是可控的,但是它存在不少的问题:

计算量
划分确定不可再作更改
凝聚和划分相互组合!!

每次选择“最优”
贪心算法,容易局部最优化,可以通过适当的随机操作。
或者是采用平衡迭代规约和聚类(Balanced Iterative Reducing and Clustering Using Hierarchies,BIRCH)它首先把邻近样本点划分到微簇(microcluseters)中,然后对这些微簇使用K-means算法。

HC应用:
AgglomerativeClustering参数说明:
AgglomerativeClustering(affinity=‘euclidean’, compute_full_tree=‘auto’,connectivity=None, linkage=‘ward’,memory=Memory(cachedir=None), n_clusters=6,pooling_func=)

affinity='euclidean':距离度量方式
connectivity:是否有连通性约束
linkage='ward':链接方式
memory:存储方式
n_clusters=6:簇类数
import numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.mplot3d.axes3d as p3
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets.samples_generator import make_swiss_roll

n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise)#卷型数据集
#进行放缩
X[:, 1] *= .5

#ward会利用AgglomerativeClustering对象,尝试平方和最小化所有集群内的差异
ward = AgglomerativeClustering(n_clusters=6, linkage='ward').fit(X)
label = ward.labels_#得到lable值

fig = plt.figure()
ax = p3.Axes3D(fig)
ax.view_init(7, -80)
for l in np.unique(label):
    ax.scatter(X[label == l, 0], X[label == l, 1], X[label == l, 2],
               color=plt.cm.jet(np.float(l) / np.max(label + 1)),
               s=20, edgecolor='k')
plt.show()

Hierarchical Clustering(层次聚类)_第2张图片

ward会利用AgglomerativeClustering对象,尝试平方和最小化所有集群内的差异。但是对于这种非欧几何的数据下,可见如果没有设置连接性约束,将会忽视其数据本身的结构,强制在欧式空间下聚类,于是很容易形成了上图这种跨越流形的不同褶皱。

from sklearn.neighbors import kneighbors_graph
connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)
ward = AgglomerativeClustering(n_clusters=6, connectivity=connectivity,
                               linkage='ward').fit(X)

修改部分代码ward后,添加connectivity便可以得到很好的结果。
Hierarchical Clustering(层次聚类)_第3张图片

你可能感兴趣的:(机器学习)