scipy 包的 flcuster 标准是什么?

数据挖掘 Python 聚类 数据挖掘 scipy
2022-02-26 06:24:05

有人能解释一下 fcluster 的标准是什么意思吗?我试图阅读文档,但我无法理解。maxclust 标准说明了什么?

1个回答

欢迎来到社区!

在阅读此答案之前,您可能需要参考关于 Agglomerative Hierarchical Clustering 的教程。我的解释更实用。

假设以下数据:

from scipy.cluster.hierarchy import ward, fcluster
from scipy.spatial.distance import pdist
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.text import TextPath


X = [[0, 0], [0, 1], [1, 0],
     [0, 4], [0, 3], [1, 4],
     [4, 0], [3, 0], [4, 1],
     [4, 4], [3, 4], [4, 3]]
X = np.array(X)
Z = ward(pdist(X))

plt.plot(X[:,0],X[:,1],'o')

我们在二维上有 12 个点。这是它们的分布方式:

在此处输入图像描述

现在让我们看看maxclust如何影响集群。请注意,我用数字命名集群并绘制每个数据所属的集群名称,而不是它的点。

for tt in [1, 3, 5, 9]:
    plt.figure(figsize=(8,8))
    plt.title('t={}'.format(str(tt)))
    plt.xlim((-1,5))
    plt.ylim((-1,5))
    memberships = fcluster(Z, t=tt, criterion='maxclust')
    for ii in range(len(memberships)):
        path = TextPath((X[ii,0],X[ii,1]), str(memberships[ii]))
        plt.plot(X[ii,0],X[ii,1],marker=path,c='b',markersize=50)

    plt.show()

结果如下所示。我解释每一个:

t是限制集群数量的参数,即您可以在输出中拥有最大t个集群。如果t=1,任何其他标准都将被忽略,因为所有数据点都必须在同一个集群中。

在此处输入图像描述

到现在为止还挺好。假设t=3现在乐趣开始了。maxclust找到将在同一簇中的每对点之间的最佳距离。如果t=3,没有那个距离,你会得到不平衡的集群。在下图中,我们有 4 个明显的集群,如果我想要 3 个集群,其中两个将合并并导致一个“错误”的集群(为了简单起见,我们说是错误的)。maxclust距离阈阻止算法这样做,因为它拒绝远点在同一个簇中。因此,您会看到数据聚集到 2 个集群而不是 3 个集群,这非常有意义。请注意,是的,我们有更大的集群。但他们是“正确的”。就像我们缩小并从更高的角度查看集群一样。

在此处输入图像描述

让我们一起去t=5现在允许算法找到 4 个簇。拓扑告诉您找到“正确的集群”,即每对点具有相对较小距离的集群(与与其他集群的距离相比)是可能的。这意味着maxclust可以找到最佳距离阈值,并且 t 让我们有 4 个集群。所以它有效!

在此处输入图像描述

最后但并非最不重要的是t=9不,我们可以拥有超过实际所需数量(4 个)的集群。现在maxclust尝试找到其对之间的最小距离,以使相同簇中的点彼此之间的距离比与其他簇中的其他点更近。正如您在每个真实聚类中看到的那样,中心点与其他两个点之间的距离小于这两个对角点之间的距离(因为该距离相同,聚类算法随机选择成员)。所以你看到每个真实的集群被分成两个,由于maxclustt组合的效果

在此处输入图像描述

希望它有所帮助。祝你好运!