如何基于HDBSCAN聚类代码用Plotly提取树状图?
从HDBSCAN提取树状图并使用Plotly可视化
HDBSCAN聚类器内置了可用于生成树状图的树形结构数据,你可以通过以下步骤提取并结合Plotly完成可视化:
1. 提取HDBSCAN的链接矩阵
训练完成的HDBSCAN对象包含single_linkage_tree_属性,其to_linkage_tree()方法能生成与scipy.cluster.hierarchy.linkage格式一致的链接矩阵——这正是Plotly create_dendrogram所需的核心输入。
在你的现有代码基础上添加如下代码:
# 从HDBSCAN聚类器中提取链接矩阵 linkage_matrix = clusterer.single_linkage_tree_.to_linkage_tree()
2. 使用Plotly生成标准树状图
调用plotly.figure_factory.create_dendrogram,传入原始数据矩阵和提取的链接矩阵,还可结合HDBSCAN的聚类阈值自动为不同簇上色:
import plotly.figure_factory as ff # 生成树状图 fig = ff.create_dendrogram( df_matrix, linkagefun=lambda x: linkage_matrix, # 指定自定义链接矩阵 color_threshold=clusterer.cluster_selection_epsilon_, # 用HDBSCAN聚类阈值划分颜色 labels=df.index.tolist() # 可选:传入数据索引作为节点标签 ) # 调整图形布局(按需修改) fig.update_layout( width=800, height=600, title='HDBSCAN 聚类树状图' ) # 展示图形 fig.show()
3. 可选:可视化HDBSCAN凝聚树(更贴合算法逻辑)
如果你想直观展示HDBSCAN的簇形成过程,可以直接利用聚类器的condensed_tree_属性构建自定义树状图:
import plotly.graph_objects as go # 获取凝聚树数据 condensed_tree = clusterer.condensed_tree_ # 提取节点和边信息 nodes = condensed_tree._select_nodes() edges = condensed_tree._select_edges() # 构建Plotly图形 fig = go.Figure() # 添加树的边 for edge in edges: fig.add_trace(go.Scatter( x=[edge['child'], edge['parent']], y=[edge['lambda_val'], edge['lambda_val']], mode='lines', line=dict(color='#cccccc') )) # 添加树的节点,用颜色区分聚类结果 fig.add_trace(go.Scatter( x=nodes['node_id'], y=nodes['lambda_val'], mode='markers', marker=dict( color=[clusters[int(node)] if node < len(clusters) else 'gray' for node in nodes['node_id']], size=8 ), text=[f"Size: {size}" for size in nodes['size']], hoverinfo='text' )) # 调整布局 fig.update_layout( title='HDBSCAN 凝聚树', xaxis_title='节点ID', yaxis_title='Lambda 值', height=600, showlegend=False ) fig.show()
关键说明
color_threshold设置为clusterer.cluster_selection_epsilon_时,树状图会自动按HDBSCAN的聚类结果为分支上色- 若你的数据无索引,可省略
labels参数 - 凝聚树可视化能清晰展示HDBSCAN从噪声到簇的分层形成过程,适合算法逻辑分析
内容的提问来源于stack exchange,提问作者Mr.Slow
相关产品推荐
相关产品推荐

