你如何从sklearn.cluster.ward_tree可视化病房树?

use*_*472 9 python machine-learning hierarchical-clustering scikit-learn

在sklearn中,实现了一种凝聚聚类算法,病房方法最小化方差.通常sklearn有许多很好的用法示例,但我找不到如何使用此函数的示例.

基本上我的问题是根据我的数据的聚类绘制树形图,但我不理解函数的输出.该文件说,它返回的儿童,组件的数量,叶片数和每个节点的父母.

然而,对于我的数据样本,结果没有任何意义.对于已使用连接矩阵聚类的(32,542)矩阵,这是输出:

>>> 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]))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我要求两个集群,其中包含32个包含要素的向量.但是这两个集群在数据中是如何可见的?他们在哪?孩子们在这里真正意味着什么,孩子们的数字怎么能高于样本总数呢?

A.P*_*.P. 5

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

每个非叶节点的子节点.小于n_samples的值指的是树的叶子.值越大,i表示具有子节点的节点[i-n_samples].

我在确定这意味着什么时遇到了一些麻烦,但是这段代码有所帮助.我们生成具有两个"集群"的正态分布式数据,一个具有3个数据点,平均值为0,另一个具有2个数据点,均值为100.因此我们预计第一个数据点将在输出树的一个分支中结束,另一个在另一个.

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]]
Run Code Online (Sandbox Code Playgroud)

哪个产生树:

[{'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}]
Run Code Online (Sandbox Code Playgroud)

数字是节点ID的.如果node_id <5(样本数),则它是数据点(或叶节点)的索引.如果node_id> = 5则它是一个内部节点.我们看到数据集群按预期方式:

         8
     /       \
    7         \  
   / \         \
  5   \         6
 / \   \       / \
1   2   0     3   4
Run Code Online (Sandbox Code Playgroud)