8

sklearn에는 분산을 최소화하는 와드 방법이 구현 된 응집 클러스터링 알고리즘이 하나 있습니다. 일반적으로 sklearn은 많은 좋은 사용 예제로 문서화되어 있지만이 함수를 사용하는 방법에 대한 예제는 찾을 수 없습니다.sklearn.cluster.ward_tree에서 와드 트리를 어떻게 시각화합니까?

기본적으로 내 문제는 내 데이터의 클러스터링에 따라 덴도 그램을 그리는 것이지만 기능의 출력을 이해하지 못합니다. documentation은 자식, 구성 요소 수, 잎 수 및 각 노드의 부모를 반환한다고 말합니다.

내 데이터 샘플의 경우 결과가 의미가 없습니다.

>>> 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])) 

I (32)가 특징 벡터를 포함하여, 두 개의 클러스터에 대한 요청이 경우 : 연결성 매트릭스 클러스터링 된 (32,542) 행렬이 출력된다. 그러나 두 클러스터가 데이터에서 어떻게 보이나요? 어디있어? 아이들이 실제로 여기에서 의미하는 것은 무엇입니까, 아이들은 총 샘플 수보다 어떻게 더 높은 숫자가 될 수 있습니까? 출력의 첫 번째 인수에 대해

답변

5

이 문서는 각각의 리프가 아닌 노드의

아이들을 말한다. n_samples보다 작은 값은 트리의 나뭇잎에 을 나타냅니다. 큰 값 i는 자식 children [i - n_samples]이있는 노드를 나타냅니다.

나는 이것이 무슨 뜻인지 이해하는데 약간의 문제가 있었지만,이 코드는 도움이되었습니다. 두 개의 "클러스터"를 갖는 정규 분포 데이터를 생성합니다. 하나는 평균 3의 데이터 포인트와 평균 0의 데이터 포인트 2 개입니다. 따라서 첫 번째 데이터 포인트 3 개가 출력 트리의 한 분기에서 끝나기를 기대합니다. 다른 한편으로는 다른 2. 숫자가 노드의 id이다

[{'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}] 

: 트리를 생성

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가 < (샘플 수)이면 데이터 포인트 (또는 리프 노드)에 대한 인덱스입니다. node_id> = 5이면 내부 노드입니다. 예상대로 데이터 클러스터가 표시됩니다.

  8 
    /  \ 
    7   \ 
/\   \ 
    5 \   6 
/\ \  /\ 
1 2 0  3 4 
관련 문제