【发布时间】:2021-08-28 06:46:13
【问题描述】:
抱歉,因为我昨天问了一个类似的问题,但我觉得我的问题缺乏内容,希望现在它会更容易理解。
我有一个具有个体之间成对距离的对称矩阵(见下文),并且我想以集群的 所有 成员的成对距离为零的方式对个体群体进行聚类。我为此使用了不同的链接方法和聚类标准应用了 scipy.cluster.hierarchy,但我没有得到预期的结果。在下面的示例中,我认为 ind5 不应该是集群 #1 的一部分,因为它与 ind9 的距离是 1 而不是 0。
from scipy.cluster.hierarchy import linkage, fcluster
from scipy.spatial.distance import squareform
import numpy as np
import pandas as pd
df = pd.read_csv(infile1, sep = '\t', index_col = 0)
print(df)
ind1 ind2 ind3 ind4 ind5 ind6 ind7 ind8 ind9
ind1 0 29 27 1 2 1 2 1 1
ind2 29 0 2 30 31 29 31 30 30
ind3 27 2 0 28 29 27 29 28 28
ind4 1 30 28 0 0 0 1 2 0
ind5 2 31 29 0 0 0 2 2 1
ind6 1 29 27 0 0 0 1 2 0
ind7 2 31 29 1 2 1 0 3 1
ind8 1 30 28 2 2 2 3 0 2
ind9 1 30 28 0 1 0 1 2 0
X = squareform(df.to_numpy())
print(X)
[29 27 1 2 1 2 1 1 2 30 31 29 31 30 30 28 29 27 29 28 28 0 0 1
2 0 0 2 2 1 1 2 0 3 1 2]
Z = linkage(X, 'single')
print(Z)
[[ 3. 4. 0. 2.]
[ 5. 9. 0. 3.]
[ 8. 10. 0. 4.]
[ 0. 11. 1. 5.]
[ 6. 12. 1. 6.]
[ 7. 13. 1. 7.]
[ 1. 2. 2. 2.]
[14. 15. 27. 9.]]
max_d = 0
clusters = fcluster(Z, max_d, criterion='distance')
sample_list = df.index.to_list()
clust_name_list = clusters.tolist()
result = pd.DataFrame({'Inds': sample_list, 'Clusters': clust_name_list})
print(result)
Inds Clusters
0 ind1 2
1 ind2 5
2 ind3 6
3 ind4 1
4 ind5 1
5 ind6 1
6 ind7 3
7 ind8 4
8 ind9 1
我希望任何更熟悉这些方法的人都可以建议是否有任何链接方法可以从集群中排除与集群中至少一个其他元素的距离 > 0 的任何元素(在本例中为 ind5) .
感谢您的帮助!
贡萨洛
【问题讨论】:
标签: python pandas numpy scipy hierarchical-clustering