2017-11-21 1 views
3

SciPy의 멍멍 모양을 여러 임계 값의 클러스터로 잘라야합니다.SciPy 계층 형 덴도 그램을 여러 임계 값의 클러스터로 자르기

fcluster를 사용해 보았지만 하나의 임계 값에서만 잘라낼 수 있습니다.

는 (저는 여기에 예를 들어 다른 질문에서 촬영 한 코드의 일부이다.)

import pandas 

data = pandas.DataFrame({ 
'total_runs': {0: 2.489857755536053, 1: 1.2877651950650333, 2: 0.8898850111727028, 3: 0.77750321282732704, 4: 0.72593099987615461, 5: 0.70064977003207007, 6:0.68217502514600825,7: 0.67963194285399975, 8: 0.64238326692987524, 9:0.6102581538587678, 10: 0.52588765899448564, 11: 0.44813665774322564, 12: 0.30434031343774476, 13: 0.26151929543260161, 14: 0.18623657993534984, 15: 0.17494230269731209,16: 0.14023670906519603, 17: 0.096817318756050832, 18:0.085822227670014059, 19: 0.042178447746868117, 20: -0.073494398270518693,21: -0.13699665903273103, 22: -0.13733324345373216, 23: -0.31112299949731331, 24: -0.42369178918768974, 25: -0.54826542322710636,26: -0.56090603814914863, 27: -0.63252372328438811, 28: -0.68787316140457322,29: -1.1981351436422796, 30: -1.944118415387774,31: -2.1899746357945964, 32: -2.9077222144449961}, 
'total_salaries': {0: 3.5998991340231234,1: 1.6158435140488829, 2: 0.87501176080187315, 3: 0.57584734201367749, 4: 0.54559862861592978, 5: 0.85178295446270169,6: 0.18345463930386757, 7: 0.81380836410678736, 8: 0.43412670908952178, 9: 0.29560433676606418, 10: 1.0636736398252848, 11: 0.08930130612600648, 12: -0.20839133305170349, 13: 0.33676911316165403, 14: -0.12404710480916628, 15: 0.82454221267393346,16: -0.34510456295395986, 17: -0.17162157282367937, 18: -0.064803261585569982, 19: -0.22807757277294818, 20: -0.61709008778669083,21: -0.42506873158089231, 22: -0.42637946918743924, 23: -0.53516500398181921, 24: -0.68219830809296633, 25: -1.0051418692474947,26: -1.0900316082184143, 27: -0.82421065378673986, 28: 0.095758053930450004, 29: -0.91540963929213015, 30: -1.3296449323844519,31: -1.5512503530547552, 32: -1.6573856443389405} 
}) 


from scipy.spatial.distance import pdist 
from scipy.cluster.hierarchy import linkage, dendrogram 

distanceMatrix = pdist(data) 
dend = dendrogram(linkage(distanceMatrix, method='complete'), 
     color_threshold=4, 
     leaf_font_size=10, 
     labels = df.teamID.tolist()) 

Dendrogram

그래서 위의 dendrogram은 내가 그린 클러스터 3에 상처를하고 싶습니다 그러나 Blue의 경우 & 빨간색 클러스터 절단은 5로 만들어야합니다 (두 클러스터가 모두 단일 클러스터로 제공됨).

답변

0

fcluster 방법은 monocrit 매개 변수를 사용하여 수행 할 수 있습니다.이 방법을 사용하면 덴드로 그램을 정확하게자를 위치를 정확하게 알 수 있습니다. -1과 -3 위치에서 상처를 만들고 싶습니다. -1은 트리의 상단이고 -3은 위에서 아래로 세는 세 번째 노드입니다 (파란색은 녹색을 나타냄).

Z = linkage(distanceMatrix, method='complete') 
monocrit = np.zeros((Z.shape[0],)) 
monocrit[[-1, -3]] = 1 
fc = fcluster(Z, 0, criterion='monocrit', monocrit=monocrit) 

플랫 클러스터는 임계 값보다 큰 값 (0)의 노드에서만 분리를 수행하여 형성됩니다.

이를 설명하기 위해, 내가 먼저 번호가 잎으로 dendrogram은 다시 실행 :

dend = dendrogram(Z, color_threshold=4, leaf_font_size=10, labels = range(33)) 

dendrogram

을 한 다음 평면 클러스터 인쇄 :

for k in range(1, 4): 
    print(np.where(fc == k)) 

그들은

(array([30, 31, 32]),) 
(array([12, 14, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29]),) 
(array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15]),) 
입니다을

그래서 녹색은 두 개로 나뉘며 빨간색과 파란색이 함께 나옵니다.

관련 문제