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

时间:2014-02-28 21:45:40

标签: python machine-learning scikit-learn hierarchical-clustering

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

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

然而,对于我的数据样本,结果没有任何意义。对于已使用连接矩阵聚类的(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]))

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

1 个答案:

答案 0 :(得分:5)

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

  

每个非叶节点的子节点。小于n_samples的值是指   到了树的叶子。值越大,i表示节点   儿童[i - n_samples]。

我在确定这意味着什么时遇到了一些麻烦,但是这段代码有所帮助。我们使用两个"簇生成正态分布式数据,一个带有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' s。如果node_id< 5(样本数)然后它是数据点(或叶节点)的索引。如果node_id> = 5则它是内部节点。我们看到数据集群按预期进行:

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