8

在sklearn中實現了一種凝聚聚類算法,病房方法最小化方差。通常sklearn有許多很好的使用示例,但我找不到如何使用此功能的示例。你如何從sklearn.cluster.ward_tree顯示病房樹?

基本上我的問題是根據我的數據的聚類繪製樹狀圖,但我不明白該函數的輸出。 documentation表示它返回子節點,組件數量,樹葉數量和每個節點的父節點。

然而對於我的數據樣本,結果沒有任何意義。對於已聚集與連接矩陣A(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個特徵矢量。但是這兩個集羣在數據中如何顯示?他們在哪?孩子們在這裏的真正含義是什麼,孩子們怎麼能比樣本總數更高?

回答

5

關於輸出的第一個參數,該文件說,

每個非葉子節點的孩子。小於n_samples的值將 指向樹的葉子。更大的值i表示具有 兒童兒童[i - n_samples]的節點。

我在計算這意味着什麼時遇到了一些麻煩,但隨後此代碼得到了幫助。我們用兩個「聚類」生成正態分佈的數據,其中一個數據點的平均值爲3,另一個數據點的平均值爲100.因此,我們預計3個第一個數據點將在輸出樹的一個分支中結束,另外兩個在另一個。

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(樣本數量)那麼它是一個數據點(或葉節點)的索引。如果node_id> = 5,那麼它是一個內部節點。我們看到數據集羣如預期的那樣:

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