按平均簇值标记 Scipy 树状图

Label Scipy Dendrogram by Average Cluster Value

我根据一些标记为 0-9 的数据点计算出一个树状图。

如何从 scipy.cluster.hiearchy.dendrogram 的输出中检索每个节点中的数据点 (0-9)?我想用它的平均 (x,y) 值来标记每个节点。 我知道我可以使用聚类算法(例如 Scikit 学习凝聚聚类)检索聚类,但我想用每个节点中的平均值标记整个树状图。

from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.spatial.distance import pdist, squareform
import numpy as np


np.random.seed(4711)  
X = np.random.uniform(-10,10,size=(10,2))
labels=[i for i in range(len(X))]
fig,ax=plt.subplots()
ax.scatter(X[:,0], X[:,1])

dist=squareform(pdist(X))

Y = linkage(squareform(dist), method='complete')
Z1 =dendrogram(Y, labels=labels, orientation='left')

例如,在上面的树状图中,我想将连接点 6,4 的节点标记为点 6 和点 4 的 x 和 y 值的平均值。(X[6]+X[4])/2

scipy.cluster.hiearchy.dendrogram 输出包含 color_listicoorddcoordivlleavesleaves_colorlist 的字典.我觉得我应该能够将 ivlleaves 和坐标结合使用,但我不确定如何解释 it/use 它。

(documentation for dendrogram)

谢谢。

您可以使用 leaf_label_func 参数。

from matplotlib import pyplot as plt
from scipy.cluster.hierarchy import dendrogram, linkage
from scipy.spatial.distance import pdist, squareform
import numpy as np

np.random.seed(4711)  
# X will be interpreted as cluster centers
X = np.random.uniform(-10,10,size=(10,2))
def llf(id):
    return f'Cluster #{id} @ {X[id]}'
Y = linkage(pdist(X), method='complete')
Z1 =dendrogram(Y, leaf_label_func=llf, get_leaves=True, orientation='left')

我还用 pdist(dist) 替换了 squareform(squareform(pdist(dist)))