我不明白在 fcluster 中工作的阈值的详细行为(方法 ='complete')

I don't understand the detailed behavior of the threshold working in fcluster (method ='complete')

Xi=[[0,5,10,8,3],[5,0,1,3,2],[10,1,0,5,1],[8,3,5 ,0,6],[3,2,1,6,0]]

Xi = 距离矩阵

shc.fcluster(shc.linkage(Xi,'complete'),9,criterion='distance')

在此代码中阈值 = 9

聚类后结果为array([3, 1, 1, 2, 1], dtype=int32)

我不明白为什么数组 [2 ,1 ,1, 1, 1]

此图像表示聚类后 https://drive.google.com/file/d/17806FuPuNpJiqhT12jiuFOMGNUvB1vjT/view?usp=sharing

import numpy as np
import pandas as pd
from scipy.cluster.hierarchy import linkage, dendrogram, fcluster
from scipy.spatial.distance import pdist
import matplotlib.pyplot as plt
import seaborn as sns

你有这个距离矩阵

Xi = np.array([[0,5,10,8,3],[5,0,1,3,2],[10,1,0,5,1],[8,3,5,0,6],[3,2,1,6,0]])

我们可以想象为

df = pd.DataFrame(Xi)
# fill NaNs and mask 0s
df.fillna(0, inplace=True)
mask = np.zeros_like(df)
mask[np.triu_indices_from(mask)] = True
sns.heatmap(df, annot=True, fmt='.0f', cmap="YlGnBu", mask=mask);

现在,我们得到 pdist

p = pdist(Xi)

和链接

Z = linkage(p, method='complete')

您将 9 设置为阈值,因此

dendrogram(Z)
plt.axhline(9, color='k', ls='--');

你有 3 个集群

fcluster(Z, 9, criterion='distance')

array([3, 1, 1, 2, 1], dtype=int32)
#      0  1  2  3  4   <- elements

是正确的,你可以用树状图验证

  • 1
  • 中的元素 124
  • 2
  • 中的元素 3
  • 3
  • 中的元素 0

如果你只想要两个集群,你必须选择12,例如thershold

dendrogram(Z)
plt.axhline(12, color='k', ls='--');

这样你就有了预期的结果

fcluster(Z, 12, criterion='distance')

array([2, 1, 1, 1, 1], dtype=int32)
#      0  1  2  3  4   <- elements