2016-07-15 6 views
0

나는 파이썬에서 클러스터링을하고있다. from scipy.cluster.hierarchy import linkage 매뉴얼에서 나는이 형식의 결과를 얻는다는 것을 안다. [A, B, 길이, #] A와 B는 앞으로 올 요소의 인덱스이다. 이 단계 (?)에서 병합 할 수 있지만 이미 병합되었지만이 단계에 참여하지 않는 클러스터에 대한 정보는 얻을 수 있습니까? 예를 들어단일 연결 알고리즘을 사용할 때 현재 클러스터를 모두 나열하려면 어떻게합니까?

내 데이터 세트는

A=[[1,1],[1,2],[1,3],[1,4],[1,5], [10,1],[10,2],[10,3],[10,4],[10,5], [15,1],[15,2],[15,3],[15,4],[15,5], [30,1],[30,2],[30,3],[30,4],[30,5]]

내가 클러스터링의 거리 제한으로 5를 선택 그것을 여기

Z = linkage(A, 'single') 

Z=[[ 0. 4. 1. 2.] 
    [ 1. 20. 1. 3.] 
    [ 2. 21. 1. 4.] 
    [ 3. 22. 1. 5.] 
    [ 17. 19. 1. 2.] 
    [ 5. 9. 1. 2.] 
    [ 6. 25. 1. 3.] 
    [ 7. 26. 1. 4.] 
    [ 8. 27. 1. 5.] 
    [ 18. 24. 1. 3.] 
    [ 10. 14. 1. 2.] 
    [ 11. 30. 1. 3.] 
    [ 12. 31. 1. 4.] 
    [ 13. 32. 1. 5.] 
    [ 16. 29. 1. 4.] 
    [ 15. 34. 1. 5.] 
    [ 28. 33. 5. 10.] 
    [ 23. 36. 9. 15.] 
    [ 35. 37. 15. 20.]] 

에 하나의 연결 알고리즘을 적용, 그래서 나는

를 얻을 수

[ 28. 33. 5. 10.]

다음 I 원래 인덱스

cut = 5 
temp1 = [] 
temp2 = [] 
for i in range(len(Z)): 
if Z[i][2] >= cut: 
    temp1.append(Z[i]) 
for i in range(2): 
    temp2[i].append(int(temp1[0][i])) 
for j in range(0, len(temp2)): 
try: 
    g = max(temp2[j]) 
except: 
    continue 
G = int(g - len(A)) 
while g >= len(A): 
    ind = temp2[j].index(g) 
    temp2[j].append(int(Z[G][0])) 
    temp2[j].append(int(Z[G][1])) 
    del temp2[j][ind] 
    g = max(temp2[j]) 
    G = int(g - len(A)) 

다시 28 및도 33를 추적하고

temp2 = [[8, 7, 6, 5, 9], [13, 12, 11, 10, 14]] 

가 '28'는 점 [10,1],[10,2],[10,3],[10,4],[10,5] 약자 및 '33'이 명확 수단 점 [15,1],[15,2],[15,3],[15,4],[15,5]을 나타내며되는 것으로 클러스터는 [10, x]로 구성되고 [15, x]로 구성된 클러스터는이 단계에서 병합 할 것입니다.

그러나 분명히 [1,1],[1,2],[1,3],[1,4],[1,5][30,1],[30,2],[30,3],[30,4],[30,5] 순간에 그렇게하기 전에, 초기 단계에있는 다른 두 개의 클러스터를 형성해야합니다 [10, X] 및 [15, X] 현재 4 개 클러스터

I

그래서 결과가 병합 원하는 것은 다음과 같습니다.

temp2 = [[8, 7, 6, 5, 9], [13, 12, 11, 10, 14], [0, 1, 2, 3, 4], [15, 16, 17, 18, 19]] 

나중에 두 개의 클러스터 T^T를 얻으려면 어떻게해야합니까? 고급 QQ the documentation 한 바와 같이

답변

1

, linkage 당신에게 그 클러스터의 소자 사이의 거리 cophenetic와 동일 클러스터 간의 거리를 제공 덕분에 . other documentation에 설명 된대로 fcluster은 평평한 클러스터를 제공하고 'distance'을 기준으로 지정하면 cophenetic 거리에 따라 dendrogram을 자릅니다.

fcluster을 사용하여 선택한 거리에서 클러스터를 임계 값으로 설정하여 원하는 결과를 얻을 수 있습니다. 그러나 fcluster은 임계 값을 분할 할 최하 거리가 아닌 럼프까지의 최대 거리로 처리하므로 임계 값으로 5를 사용하면 참조하는 두 개의 클러스터를 결합하여 3 개의 클러스터 만 제공합니다. . 원하는 것을 얻기 위해 5보다 약간 작은 임계 값을 선택해야합니다. 예 :

from scipy.cluster import hierarchy as clust 
>>> clust.fcluster(Z, 4.99999, criterion='distance') 
array([2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 1, 1, 1, 1, 1]) 

이는 각 항목이 어느 클러스터에 있는지 알려줍니다.요컨대

>>> clusters = clust.fcluster(Z, 4.99999, criterion='distance') 
>>> [np.where(clusters==k)[0].tolist() for k in np.unique(clusters)] 
[[15L, 16L, 17L, 18L, 19L], 
[0L, 1L, 2L, 3L, 4L], 
[5L, 6L, 7L, 8L, 9L], 
[10L, 11L, 12L, 13L, 14L]] 

, 아이디어는 당신이 "거리 제한"라고 부릅니다을보고 평면 클러스터를 얻을 수 fclust을 사용하는 것입니다 : 그 뒤로 각 클러스터에있는 인덱스의리스트로 변환하려면 np.where이 사용할 수 그 거리 (또는 조금 더 작은 거리)를 문턱 값으로 사용하십시오. 이렇게하면 각 색인의 클러스터 번호가 제공되고 np.where을 사용하여 각 클러스터의 목록을 가져올 수 있습니다.

+0

고맙습니다. !!!!!! 그게 바로 내가 T^T를 찾고있는 이유입니다. BTW, 제가 궁금한 것이 아니라 마지막 결과물에있는 L은 무엇입니까? 나는 내 결과에서 그 L을 얻지 못했습니다. (그리고 그것은 좋은 것입니다) – Chu

+0

@ Xiadan : "긴 정수"를 나타냅니다. 그것은 numpy 배열을리스트로 변환 할 때 거기에 던져지는 약간의 쓰레기입니다. Python 3을 사용하는 경우에는 표시되지 않으며 64 비트 또는 32 비트와 같은 다른 플랫폼 세부 정보에 따라 표시되지 않을 수도 있습니다. 발견 한대로, 결과에 아무런 영향을 미치지 않습니다. 그냥 이상하게 보입니다. – BrenBarn

+0

또한 np.where 부분에 감사드립니다. T^T 나는 인덱스를 다시 그 목록으로 변환하는 더 영리한 방법이 있어야한다는 것을 알고있었습니다. – Chu

관련 문제