python - 在通过成对距离进行的python层次聚类中,我如何削减特定距离并获取集群和每个集群的成员列表?
问题描述
我有这样的成对距离数据:
distances = {
('DN1357_i2', 'DN1357_i5'): 1.0,
('DN1357_i2', 'DN10172_i1'): 28.0,
('DN1357_i2', 'DN1357_i1'): 8.0,
('DN1357_i5', 'DN1357_i1'): 2.0,
('DN1357_i5', 'DN10172_i1'): 34.0,
('DN1357_i1', 'DN10172_i1'): 38.0,
}
所以我有 4 个对象,我使用以下代码行对这些对象进行聚类:
keys = [sorted(k) for k in obj_distances.keys()]
values = obj_distances.values()
sorted_keys, distances = zip(*sorted(zip(keys, values)))
Z = linkage(distances)
labels = sorted(set([key[0] for key in sorted_keys] + [sorted_keys[-1][-1]]))
dendro = dendrogram(Z, labels=labels)
它给了我一个树状图。获取集群和每个集群中对象名称的代码是什么(如果我在距离 2 处切割树状图)?
解决方案
您可以使用 scipy 函数 cut_tree,以下是您的数据示例:
from scipy.cluster.hierarchy import cut_tree, dendrogram, linkage
obj_distances = {
('DN1357_i2', 'DN1357_i5'): 1.0,
('DN1357_i2', 'DN10172_i1'): 28.0,
('DN1357_i2', 'DN1357_i1'): 8.0,
('DN1357_i5', 'DN1357_i1'): 2.0,
('DN1357_i5', 'DN10172_i1'): 34.0,
('DN1357_i1', 'DN10172_i1'): 38.0,
}
keys = [sorted(k) for k in obj_distances.keys()]
values = obj_distances.values()
sorted_keys, distances = zip(*sorted(zip(keys, values)))
Z = linkage(distances)
labels = sorted(set([key[0] for key in sorted_keys] + [sorted_keys[-1][-1]]))
dendro = dendrogram(Z, labels=labels)
members = dendro['ivl']
clusters = cut_tree(Z, height=2)
cluster_ids = [c[0] for c in clusters]
for k in range(max(cluster_ids) + 1):
print(f"Cluster {k}")
for i, c in enumerate(cluster_ids):
if c == k:
print(f"{members[i]}")
print('\n')
在高度为 2 处切割树,输出为:
Cluster 0
DN10172_i1
Cluster 1
DN1357_i1
Cluster 2
DN1357_i2
DN1357_i5
推荐阅读
- c# - 在实体框架中哪里可以找到存储过程?
- image - 跳过图像的一部分
- gradle - 找不到名称为“类”的任务,即使很难我也可以运行它
- validation - 如何在 vee-validate 中指定自定义规则的优先级?
- python - 如何使用 SQLAlchemy 将远程 mySQL 数据库连接到烧瓶应用程序?
- python - 查找相似/同义词/上下文词 Python
- json - react-native-table-component 将 Json 数据导入表
- git - Git 凭证管理器和手动创建的 PAT
- flutter - Flutter Auth(BLoC 模式和 rxDart)
- angular - 如何在订阅中添加`map`运算符