Hierarchical Clustering(层次聚类)

来源:互联网 发布:淘宝发论文被骗 编辑:程序博客网 时间:2024/06/06 00:47

层次聚类原理:

这里写图片描述

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

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

如何判断两个cluster之间的距离呢?
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 npimport matplotlib.pyplot as pltimport mpl_toolkits.mplot3d.axes3d as p3from sklearn.cluster import AgglomerativeClusteringfrom sklearn.datasets.samples_generator import make_swiss_rolln_samples = 1500noise = 0.05X, _ = make_swiss_roll(n_samples, noise)#卷型数据集#进行放缩X[:, 1] *= .5ward = 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()

这里写图片描述

可见没有连接性约束的忽视其数据本身的结构,于是形成了跨越流形的不同褶皱。

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

修改部分代码后,添加connectivity便可以得到很好的结果。
这里写图片描述

阅读全文
0 0