在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个向量包含要素。但是这两个集群在数据中是如何可见的?他们在哪?孩子们在这里真正意味着什么,孩子们的数字怎么能高于样本总数呢?
答案 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