凝聚聚类与层次聚类

最近在自学图灵教材《Python机器学习基础教程》,在csdn以博客的形式做些笔记。

凝聚聚类算法简述

凝聚聚类(agglomerative clustering)指的是许多基于相同原则构建的聚类算法,这一原则是:算法首先声明每个点是自己的簇,然后合并两个最相似的簇,直到满足某种停止准则为止。scikit-learn 中实现的停止准则是簇的个数,因此相似的簇被合并,直到仅剩下指定个数的簇。还有一些链接(linkage)准则,规定如何度量“最相似的簇”。这种度量总是定义在两个现有的簇之间。

scikit-learn 提供了下面三种链接准则:

1.ward,ward为默认的选项。word挑选两个簇来合并,使得所有簇的方差增加最小。这通常会得到大小差不多相同的簇。

2.average,将簇中所有点之间平均距离最小的两个簇合并。

3.complete,将簇中点之间最大距离最小的两个簇合并。

ward 适用于大多数数据集。如果簇中的成员个数非常不同(比如其中一个比其他所有都大得多),那么 average 或 complete 可能效果更好。

下面将举一个例子来说明算法的实现流程

最开始时,每个点各成一簇 。然后 在每一步中,距离相聚最近的两个簇被合并。在上图所示过程中,前四步为两个单点簇合成为两点簇。而在第五步,有一个两点簇被扩展到三点簇。一直到了第九步,只剩下三个簇。由于我们指定寻找三个簇,因此算法结束。

接下来我们来看看凝聚聚类对简单的三簇数据的效果:

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
X, y = make_blobs(random_state=1)
agg = AgglomerativeClustering(n_clusters=3)
assignment = agg.fit_predict(X)
mglearn.discrete_scatter(X[:, 0], X[:, 1], assignment)
plt.xlabel("Feature 0")
plt.ylabel("Feature 1")

对于这个简单的数据集,算法完美地完成了聚类。虽然说凝聚聚类的scikit-learn实现需要你指定希望算法找到的簇的个数,但凝聚聚类方法为选择正确的个数提供了一些帮助,下面让我们来看看时何种帮助。

层次聚类与树状图

 凝聚聚类生成了所谓的层次聚类(hierarchical clustering)。聚类过程迭代进行,每个点都从一个单点簇变为属于最终的某个簇。每个中间步骤都提供了数据的一种聚类(簇的个数也不相同)。有时候,同时查看所有可能的聚类是有帮助的。下图叠加显示了本文最开始例子的所有可能的聚类,有助于深入了解每个簇如何分解为较小的簇:

虽然这种可视化为层次聚类提供了非常详细的视图,但它依赖于数据的二维性质,因此不 能用于具有两个以上特征的数据集。但还有另一个将层次聚类可视化的工具,叫作树状图 (dendrogram),它可以处理多维数据集。

 但是对于scikit-learn而言,目前并没有绘制树状图的功能。但我们可以采用SciPy来生成树状图。SciPy提供了一个函数,接受数据数组 X 并计算出一个链接数组(linkage array),它对层次聚类的相似度进行编码。 然后我们可以将这个链接数组提供给 scipy 的 dendrogram 函数来绘制树状图。下面给出代码和运行结果:

# 从SciPy中导入dendrogram函数和ward聚类函数
from scipy.cluster.hierarchy import dendrogram, ward
X, y = make_blobs(random_state=0, n_samples=12)
# 将ward聚类应用于数据数组X
# SciPy的ward函数返回一个数组,指定执行凝聚聚类时跨越的距离
linkage_array = ward(X)
# 现在为包含簇之间距离的linkage_array绘制树状图
dendrogram(linkage_array)
# 在树中标记划分成两个簇或三个簇的位置
ax = plt.gca()
bounds = ax.get_xbound()
ax.plot(bounds, [7.25, 7.25], '--', c='k')
ax.plot(bounds, [4, 4], '--', c='k')
ax.text(bounds[1], 7.25, ' two clusters', va='center', fontdict={'size': 15})
ax.text(bounds[1], 4, ' three clusters', va='center', fontdict={'size': 15})
plt.xlabel("Sample index")
plt.ylabel("Cluster distance")

 树状图在底部显示数据点(编号从 0 到 11)。然后以这些点(表示单点簇)作为叶节点绘制一棵树,每合并两个簇就添加一个新的父节点。 从下往上看,数据点 1 和 4 首先被合并。接下来,点 6 和 9 被 合并为一个簇,以此类推。在顶层有两个分支,一个由点 11、0、5、10、7、6 和 9 组成, 另一个由点 1、4、3、2 和 8 组成。这对应于图中左侧两个最大的簇。 树状图的 y 轴不仅说明凝聚算法中两个簇何时合并,每个分支的长度还表示被合并的簇之 间的距离。在这张树状图中,最长的分支是用标记为“three clusters”(三个簇)的虚线表示的三条线。它们是最长的分支,这表示从三个簇到两个簇的过程中合并了一些距离非常 远的点。我们在图像上方再次看到这一点,将剩下的两个簇合并为一个簇也需要跨越相对较大的距离。

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值