Я использую иерархическую кластеризацию для кластеризации векторов слов и хочу, чтобы пользователь мог отображать дендрограмму, показывающую кластеры. Однако, поскольку могут быть тысячи слов, я хочу, чтобы эта дендрограмма была усечена до некоторого разумного значения, а метка для каждого листа представляла собой строку наиболее значимых слов в этом кластере.
Моя проблема в том, что согласно документам, "Значение 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», но я не уверен, как его использовать.