聚类--凝聚聚类
1、什么是凝聚聚类
凝聚聚类(agglomerative clustering)指的是许多基于相同原则构建的聚类算法,
这一原则是:
-
算法首先声明每个点是自己的簇,然后合并两个最相似的簇,直到满足某种停止准则为止。
- scikit-learn 中实现的停止准则是簇的个数,因此相似的簇被合并,直到仅剩下指定个数的簇。
-
还有一些链接(linkage)准则,
-
规定如何度量“最相似的簇”。这种度量总是定义在两个现有的簇之间。
-
scikit-learn 提供了下面三种链接准则:
-
ward,ward为默认的选项。word挑选两个簇来合并,使得所有簇的方差增加最小。这通常会得到大小差不多相同的簇。
-
average,将簇中所有点之间平均距离最小的两个簇合并。
-
complete,将簇中点之间最大距离最小的两个簇合并。
-
ward 适用于大多数数据集。如果簇中的成员个数非常不同(比如其中一个比其他所有都大得多),那么 average 或 complete 可能效果更好。
-
-
📣
- 最开始时,每个点各成一簇 。然后在每一步中,距离相聚最近的两个簇被合并。
- 在上图所示过程中,前四步为两个单点簇合成为两点簇。而在第五步,有一个两点簇被扩展到三点簇。
- 一直到了第九步,只剩下三个簇。由于我们指定寻找三个簇,因此算法结束。
2、应用于模拟数据集
from sklearn.cluster import AgglomerativeClustering
X, y = make_blobs(random_state=1)
agg = AgglomerativeClustering(n_clusters=3)
y_pred = agg.fit_predict(X)
mglearn.discrete_scatter(X[:,0],X[:,1],y_pred)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")
📣
-
对于这个简单的数据集,算法完美地完成了聚类。
-
虽然说凝聚聚类的scikit-learn实现,需要指定希望算法找到的簇的个数,但凝聚聚类方法为选择正确的个数提供了一些帮助
3、层次聚类与树状图
3.1层次聚类
凝聚聚类生成了所谓的层次聚类(hierarchical clustering)。
- 聚类过程迭代进行,每个点都从一个单点簇变为属于最终的某个簇。
- 每个中间步骤都提供了数据的一种聚类(簇的个数也不相同)。
有时候,同时查看所有可能的聚类是有帮助的。
下图叠加显示了本文最开始例子的所有可能的聚类,有助于深入了解每个簇如何分解为较小的簇:
📣
虽然这种可视化为层次聚类提供了非常详细的视图,但它依赖于数据的二维性质,因此不能用于具有两个以上特征的数据集。
但还有另一个将层次聚类可视化的工具,叫作树状图 (dendrogram),它可以处理多维数据集。
3.2树状图
将层次聚类可视化的工具:树状图 (dendrogram),它可以处理多维数据集
#树状图
from scipy.cluster.hierarchy import dendrogram,ward
X, y = make_blobs(n_samples=12,random_state=0)
#用ward()会返回一个链接数组,该数组包含了簇之间的距离
linkage_array = ward(X)
dendrogram(linkage_array)
📣
①树状图在底部显示数据点(编号从 0 到 11)。然后以这些点(表示单点簇)作为叶节点绘制一棵树,每合并两个簇就添加一个新的父节点。
- 从下往上看,数据点 1 和 4 首先被合并。
- 接下来,点 6 和 9 被 合并为一个簇,以此类推。
②在顶层有两个分支,一个由点 11、0、5、10、7、6 和 9 组成, 另一个由点 1、4、3、2 和 8 组成。
- 这对应于图中左侧两个最大的簇。
③树状图的 y 轴不仅说明凝聚算法中两个簇何时合并,每个分支的长度还表示被合并的簇之间的距离。
4、参考文献
《Python机器学习基础教程》P140-P143