我有这样的成对距离数据:
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处切割树状图)?
2条答案
按热度按时间7vhp5slm1#
您可以使用scipy函数cut_tree,下面是一个数据示例:
对于在高度为2处切割树,输出为:
raogr8fs2#
@列奥纳多Sirino的答案给了我正确的树状图,但错误的聚类结果(我还没有完全弄清楚原因)
如何复制我的声明:对映-取代
obj_distances
中的像素名称(DN1357_i2变成A,DN1357_i5变成B,DN10172_i1变成C,DN1357_i1变成D)也就是说
本质上与问题中的
obj_distances
相同,但将每个实体相应地替换为A、B、C。这会打乱聚类结果,群集0
第1组
第二组
但根据树状图,A和B应该在一起:
下面是与树状图一致的正确聚类结果:
替换:
与此:
谢谢你@列奥纳多·西里诺的回答,让我走到了这一步!