如何将层次聚类可视化为 Python 中标记节点的树?

数据挖掘 Python scikit-学习 聚类 可视化
2022-02-26 13:53:59

“归一化信息距离”一将层次聚类可视化为带有标签的节点树: 来自“归一化信息距离”的层次聚类可视化

不幸的是,我不知道如何复制这种可视化,也许他们是用 Tikz 手动完成的?如何在 Python 中自动实现此效果,最好使用 Scikit-Learn?我只找到了 Dendogram,它看起来不像我想要复制的效果:

在此处输入图像描述

结果(感谢@andy-w):

model = AgglomerativeClustering(linkage="average", n_clusters=N_CLUSTERS, compute_distances=True, affinity="l1")
model.fit(data)
no_of_observations = np.arange(2, model.children_.shape[0]+2)
linkage_matrix = np.column_stack([model.children_, model.distances_, no_of_observations]).astype(float)

G = nx.Graph()    
n = len(linkage_matrix)
for i in range(n):
    row = linkage_matrix[i]
    G.add_edge(label(int(row[0])),label(n+i+1),len=1+0.1*(math.log(1+row[2])))  
    G.add_edge(label(int(row[1])),label(n+i+1),len=1+0.1*(math.log(1+row[2])))  

dot = nx.nx_pydot.to_pydot(G).to_string()
dot = graphviz.Source(dot, engine='neato')
dot.render(format='pdf',filename='tree')

到目前为止的结果

1个回答

这种特定格式对我来说看起来像graphviz因此,如果您可以从原始对象中提取树边缘,则可以对其进行渲染,例如下面的示例(用于在不同对象之间转换的一些回旋处):

import networkx as nx
import pydot
import graphviz

# Just a part of your graph
G = nx.Graph()
ed = [('n3','n0'),
      ('n0','MusicHendrixA'),
      ('n0','MusicHendrixB'),
      ('n3','n2'),
      ('n2','n8'),
      ('n8','MusicBergA'),
      ('n8','MusicBergB') ]
G.add_edges_from(ed)

# Now the graphviz part
dot = nx.nx_pydot.to_pydot(G).to_string()
dot = graphviz.Source(dot, engine='neato')
dot.render(format='png',filename='MusicTree')

GraphViz 输出 Neato