Python 如何从sklearn.cluster.ward_树中可视化ward树?

Python 如何从sklearn.cluster.ward_树中可视化ward树?,python,machine-learning,scikit-learn,hierarchical-clustering,Python,Machine Learning,Scikit Learn,Hierarchical Clustering,在sklearn中,实现了一种凝聚聚类算法,即最小化方差的ward方法。通常sklearn有很多很好的使用示例,但是我找不到如何使用这个函数的示例 基本上,我的问题是根据数据的聚类绘制树状图,但我不理解函数的输出。表示它返回每个节点的子节点、组件数量、叶子数量和父节点 然而,对于我的数据样本来说,结果没有任何意义。对于已与连接矩阵聚集的(32542)矩阵,这是输出: >>> wt = ward_tree(mymat, connectivity=connectivity, n_c

在sklearn中,实现了一种凝聚聚类算法,即最小化方差的ward方法。通常sklearn有很多很好的使用示例,但是我找不到如何使用这个函数的示例

基本上,我的问题是根据数据的聚类绘制树状图,但我不理解函数的输出。表示它返回每个节点的子节点、组件数量、叶子数量和父节点

然而,对于我的数据样本来说,结果没有任何意义。对于已与连接矩阵聚集的(32542)矩阵,这是输出:

>>> wt = ward_tree(mymat, connectivity=connectivity, n_clusters=2)

>>> mymat.shape
(32, 542)
>>> wt
(array([[16,  0],
       [17,  1],
       [18,  2],
       [19,  3],
       [20,  4],
       [21,  5],
       [22,  6],
       [23,  7],
       [24,  8],
       [25,  9],
       [26, 10],
       [27, 11],
       [28, 12],
       [29, 13],
       [30, 14],
       [31, 15],
       [34, 33],
       [47, 46],
       [41, 40],
       [36, 35],
       [45, 44],
       [48, 32],
       [50, 42],
       [38, 37],
       [52, 43],
       [54, 39],
       [53, 51],
       [58, 55],
       [56, 49],
       [60, 57]]), 1, 32, array([32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,     45, 46, 47, 32,
       33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 53, 48,
   48, 51, 51, 55, 55, 57, 50, 50, 54, 56, 52, 52, 49, 49, 53, 60, 54,
   58, 56, 58, 57, 59, 60, 61, 59, 59, 61, 61]))

在本例中,我要求使用两个集群,其中32个向量包含特征。但是这两个集群在数据中是如何可见的呢?他们在哪里?孩子们在这里的真正含义是什么,孩子们的数量怎么可能比样本总数还要多呢?

关于输出的第一个参数,文档中说

每个非叶节点的子节点。小于n_个样本的值引用 到树的叶子。值i越大,表示节点具有 儿童[i-n_样本]

我在理解这意味着什么时遇到了一些困难,但这段代码起到了帮助。我们用两个“簇”生成正态分布数据,一个簇有3个平均值为0的数据点,另一个簇有2个平均值为100的数据点。因此,我们期望第一个数据点中的3个将在输出树的一个分支中结束,另2个将在另一个分支中结束

from sklearn.cluster import ward_tree
import numpy as np
import itertools
X = np.concatenate([np.random.randn(3, 10), np.random.randn(2, 10) + 100])
w = ward_tree(X)
ii = itertools.count(w[2])
[{'node_id': next(ii), 'left': x[0], 'right':x[1]} for x in w[0]]
这将生成树:

[{'node_id': 5, 'right': 2, 'left': 1},
 {'node_id': 6, 'right': 4, 'left': 3}, 
 {'node_id': 7, 'right': 5, 'left': 0}, 
 {'node_id': 8, 'right': 7, 'left': 6}]
其中编号是节点id。如果node_id<5(样本数),则它是数据点(或叶节点)的索引。如果node_id>=5,则它是一个内部节点。我们看到数据集群如预期的那样:

         8
     /       \
    7         \  
   / \         \
  5   \         6
 / \   \       / \
1   2   0     3   4