我正在使用层次聚类对词向量进行聚类,我希望用户能够显示一个显示聚类的树状图。但是,由于可能有数千个单词,我希望将此树状图截断为一些合理的值,每个叶子的标签是该集群中最重要的单词的字符串。
我的问题是, 根据文档, “labels[i] 值是放在第 i 个叶节点下的文本,只有当它对应于原始观察而不是非单例集群时。” 我认为这意味着我不能标记簇,只能标记奇异点?
为了说明,这是一个简短的 python 脚本,它生成一个简单的标记树状图:
import numpy as np
from scipy.cluster.hierarchy import dendrogram, linkage
from matplotlib import pyplot as plt
randomMatrix = np.random.uniform(-10,10,size=(20,3))
linked = linkage(randomMatrix, 'ward')
labelList = ["foo" for i in range(0, 20)]
plt.figure(figsize=(15, 12))
dendrogram(
linked,
orientation='right',
labels=labelList,
distance_sort='descending',
show_leaf_counts=False
)
plt.show()
现在假设我想截断到只有 5 个叶子,并且对于每个叶子,将其标记为“foo,foo,foo …”,即构成该簇的单词。 (注意:生成这些标签不是这里的问题。)我截断它,并提供一个标签列表来匹配:
labelList = ["foo, foo, foo..." for i in range(0, 5)]
dendrogram(
linked,
orientation='right',
p=5,
truncate_mode='lastp',
labels=labelList,
distance_sort='descending',
show_leaf_counts=False
)
这就是问题所在,没有标签:
我想这里可能会用到参数“leaf_label_func”,但我不确定如何使用它。
原文由 EmmetOT 发布,翻译遵循 CC BY-SA 4.0 许可协议
您对使用 leaf_label_func 参数是正确的。
除了创建绘图之外,树状图函数还返回一个包含多个列表的字典(他们在文档中将其称为 R)。您创建的 leaf_label_func 必须从 R[“leaves”] 中获取一个值并返回所需的标签。设置标签的最简单方法是运行树状图两次。使用
no_plot=True
获取用于创建标签映射的字典。然后再次创建情节。