2014-02-07 2 views
30

계층 구조 클러스터를 조작하는 방법을 이해하려고 시도하고 있지만 설명서가 너무 ... 기술적 인 ... ... 그리고 어떻게 작동하는지 이해할 수 없습니다.scipy.cluster.hierarchy 자습서

몇 가지 간단한 작업을 단계별로 설명하면서 시작하는 데 도움이되는 자습서가 있습니까?

의 나는 다음과 같은 데이터 세트에 있다고 가정 해 봅시다 :

z = linkage(a) 
d = dendrogram(z) 
이제
  • , 나는 특정 클러스터를 복구 할 수있는 방법 :

    a = np.array([[0, 0 ], 
           [1, 0 ], 
           [0, 1 ], 
           [1, 1 ], 
           [0.5, 0 ], 
           [0, 0.5], 
           [0.5, 0.5], 
           [2, 2 ], 
           [2, 3 ], 
           [3, 2 ], 
           [3, 3 ]]) 
    

    내가 쉽게 dendrogram은을 계층 클러스터를하고 플롯 할 수 있습니다 ? 덴 드로 그램에 [0,1,2,4,5,6] 요소를 가진 것을 말합시다?

  • 어떻게 그 요소의 값을 되 찾을 수 있습니까?

답변

51

계층 응집성 클러스터링의 세 단계 (HAC)이 있습니다

  1. 정량화 데이터 (metric 인수)
  2. 클러스터 데이터 (method 인수가)
  3. 클러스터의 수를 선택

수행 중

z = linkage(a) 

은 처음 두 단계를 수행합니다. 당신이 매개 변수를 지정하지 않았기 때문에 그렇게 z = linkage(a) 당신에게 a의 단일 링크 계층 적 응집성 클러스터링을 줄 것이다 표준

  • method = 'single'
  • metric = 'euclidean'
    1. 값 사용합니다. 이 클러스터링은 일종의 계층 적 솔루션입니다. 이 계층 구조에서 데이터 구조에 대한 정보를 얻을 수 있습니다. 지금 할 수있는 일은 다음과 같습니다.

      • metric이 적절한 지 확인하십시오. 지. cityblock 또는 chebychev
      • 는 서로 다른 속성을 확인 (cityblock, euclideanchebychevL1, L2L_inf 규범에 해당) 다른 데이터를 정량화한다/방법에 methdos (예 single, completeaverage)
      • 확인의 행동 클러스터의 수를 결정한다. 지. by reading the wiki about it
      • silhouette coefficient과 같은 발견 된 솔루션 (클러스터링)에 대한 색인을 계산합니다 (이 계수를 사용하면 포인트/관찰이 클러스터링에 의해 할당 된 클러스터에 얼마나 잘 맞는지 품질에 대한 피드백을 얻을 수 있습니다). 다른 색인은 클러스터링을 한정하기 위해 다른 기준을 사용합니다.뭔가

        import numpy as np 
        import scipy.cluster.hierarchy as hac 
        import matplotlib.pyplot as plt 
        
        
        a = np.array([[0.1, 2.5], 
               [1.5, .4 ], 
               [0.3, 1 ], 
               [1 , .8 ], 
               [0.5, 0 ], 
               [0 , 0.5], 
               [0.5, 0.5], 
               [2.7, 2 ], 
               [2.2, 3.1], 
               [3 , 2 ], 
               [3.2, 1.3]]) 
        
        fig, axes23 = plt.subplots(2, 3) 
        
        for method, axes in zip(['single', 'complete'], axes23): 
            z = hac.linkage(a, method=method) 
        
            # Plotting 
            axes[0].plot(range(1, len(z)+1), z[::-1, 2]) 
            knee = np.diff(z[::-1, 2], 2) 
            axes[0].plot(range(2, len(z)), knee) 
        
            num_clust1 = knee.argmax() + 2 
            knee[knee.argmax()] = 0 
            num_clust2 = knee.argmax() + 2 
        
            axes[0].text(num_clust1, z[::-1, 2][num_clust1-1], 'possible\n<- knee point') 
        
            part1 = hac.fcluster(z, num_clust1, 'maxclust') 
            part2 = hac.fcluster(z, num_clust2, 'maxclust') 
        
            clr = ['#2200CC' ,'#D9007E' ,'#FF6600' ,'#FFCC00' ,'#ACE600' ,'#0099CC' , 
            '#8900CC' ,'#FF0000' ,'#FF9900' ,'#FFFF00' ,'#00CC01' ,'#0055CC'] 
        
            for part, ax in zip([part1, part2], axes[1:]): 
             for cluster in set(part): 
              ax.scatter(a[part == cluster, 0], a[part == cluster, 1], 
                 color=clr[cluster]) 
        
            m = '\n(method: {})'.format(method) 
            plt.setp(axes[0], title='Screeplot{}'.format(m), xlabel='partition', 
              ylabel='{}\ncluster distance'.format(m)) 
            plt.setp(axes[1], title='{} Clusters'.format(num_clust1)) 
            plt.setp(axes[2], title='{} Clusters'.format(num_clust2)) 
        
        plt.tight_layout() 
        plt.show() 
        

        여기

      을 시작되어 enter image description here

    +0

    당신이 np.diff가 무릎 지점을 찾는 데 사용되는 방법을 설명 할 수 준다? 왜 그것을 2 학년 때 사용합니까? 그리고이 점의 수학적 해석은 무엇입니까? – user1603472

    +0

    @ user1603472 가로 좌표의 모든 숫자는 파티션 수에 따라 가능한 한 가지 솔루션입니다. 이제 분명히 허용 할 파티션이 많을수록 클러스터 내의 동질성이 높아집니다. 따라서 실제로 원하는 것은 다음과 같습니다. 균질성이 높은 파티션 수가 적습니다 (대부분의 경우). 이것이 당신이 "무릎"지점을 찾는 이유입니다. 이자형. 거리 * 이전의 포인트 *는 이전의 증가와 관련하여 훨씬 더 높은 값으로 "점프"합니다. – embert

    +0

    @ user1603472 불연속 값의 파생어로 작업 한 경우, 1 차 및 2 차 차이점을 알지 못했습니다. 여하튼 그것은 다만 운동했다. 실제로 저는 곡률에 대한 수식을 사용하여 "가장 강한"무릎 점을 찾을 수 있다는 것을 알았지 만, 보통은 어쨌든 당신이 그것을 보면서 음모를 평가해야합니다. 그것은 단지 추가적인 방향으로 작용할 수 있습니다. 이것은 내가 말하고있는 위키에서 [팔꿈치 방법] (http://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set#The_Elbow_Method)에 따른 것입니다. – embert