为啥 sklearn.cluster.AgglomerativeClustering 不给我们合并集群之间的距离?

Posted

技术标签:

【中文标题】为啥 sklearn.cluster.AgglomerativeClustering 不给我们合并集群之间的距离?【英文标题】:Why doesn't sklearn.cluster.AgglomerativeClustering give us the distances between the merged clusters?为什么 sklearn.cluster.AgglomerativeClustering 不给我们合并集群之间的距离? 【发布时间】:2018-02-12 03:46:27 【问题描述】:

我正在使用sklearn.cluster.AgglomerativeClustering。它从每个数据点一个簇开始,然后迭代地将两个“最接近”的簇合并在一起,从而形成一棵二叉树。什么构成集群之间的距离取决于链接参数。

了解每一步合并集群之间的距离会很有用。然后,当下一个要合并的集群相距太远时,我们可以停止。唉,AgglomerativeClustering 中似乎没有。

我错过了什么吗?有没有办法恢复距离?

【问题讨论】:

您能否更具体地说明distance 的含义 - 即您是指相应集群的质心之间的距离还是其他不同的东西? 我不想具体。它可能是您建议的质心之间的距离,或者是单独集群中两点之间的最小距离,如在单链接中,或者是由此产生的集群直径,或者方差的增加。关键是任何凝聚聚类方法都会在每次迭代中合并两个“最接近”的聚类。可以以不同的方式计算“接近度”度量,但在每次合并时都有一个确定的、递增的值。了解这些值会很有用。 【参考方案1】:

您可能想看看scipy.cluster.hierarchy,它提供了比sklearn.cluster.AgglomerativeClustering 更多的选项。

聚类是使用linkage 函数完成的,该函数返回一个包含合并聚类之间距离的矩阵。这些可以用树状图可视化:

from scipy.cluster.hierarchy import linkage, fcluster, dendrogram
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt

X, cl = make_blobs(n_samples=20, n_features=2, centers=3, cluster_std=0.5, random_state=0)
Z = linkage(X, method='ward')

plt.figure()
dendrogram(Z)
plt.show()

一个人可以根据各种标准从链接矩阵形成平面集群,例如观察距离:

clusters = fcluster(Z, 5, criterion='distance')

更详细地讨论了 Scipy 的层次聚类here。

【讨论】:

【参考方案2】:

当最初提出这个问题时,当发布另一个答案时,sklearn 没有暴露距离。但是,它现在确实如此,如this example 中所示 和this answer 回答类似的问题。

【讨论】:

以上是关于为啥 sklearn.cluster.AgglomerativeClustering 不给我们合并集群之间的距离?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?