2016-08-01 4 views
10

보통 dendrograms와 heatmaps를 할 때, 나는 거리 행렬을 사용하고 SciPy의 묶음을합니다. 시도해보고 싶습니다 Seaborn하지만 Seaborn 직사각형 형태로 내 데이터를 원합니다 (rows = samples, cols = attributes, distance matrix가 아닙니까)?미리 계산 된 거리 행렬을 sns.clustermap에주는 방법은 무엇입니까?

본질적으로을 백엔드로 사용하여 내 립 드로 그램을 계산하고 내 히트 맵에 붙여 넣기를 원합니다. 이것이 가능한가? 그렇지 않은 경우 향후 이것이 기능이 될 수 있습니다.

조정할 수있는 매개 변수가있을 수 있으므로 사각형 매트릭스 대신 거리 매트릭스를 사용할 수 있습니까? 여기

는 사용의 :

seaborn.clustermap¶ 
seaborn.clustermap(data, pivot_kws=None, method='average', metric='euclidean', 
z_score=None, standard_scale=None, figsize=None, cbar_kws=None, row_cluster=True, 
col_cluster=True, row_linkage=None, col_linkage=None, row_colors=None, 
col_colors=None, mask=None, **kwargs) 
아래

내 코드 :

from sklearn.datasets import load_iris 
iris = load_iris() 
X, y = iris.data, iris.target 
DF = pd.DataFrame(X, index = ["iris_%d" % (i) for i in range(X.shape[0])], columns = iris.feature_names) 

enter image description here

내 방법은 아래 올바른 생각하지 않기 때문에 나는 그것을 미리 계산을주는거야 원거리 행렬이며 직사각형 데이터 행렬이 아닙니다. 상관/거리 행렬을 clustermap과 함께 사용하는 방법에 대한 예제는 없지만 https://stanford.edu/~mwaskom/software/seaborn/examples/network_correlations.html에 대한 것이 있지만 순서는 일반 sns.heatmap func와 클러스터되지 않습니다.

DF_corr = DF.T.corr() 
DF_dism = 1 - DF_corr 
sns.clustermap(DF_dism) 

enter image description here

+0

나는이 질문을 이해하지 못합니다. 두 번째 행렬이 사각형이 아닌가? – mwaskom

+0

네, 두 번째 것은 확실히 사각형이지만 b/c는 거리 매트릭스 (1- 상관)를 입력하고'sns.cluster_map'은 직사각형 데이터 매트릭스를 필요로합니다. 그래서 기본적으로 제 중복 사각형 거리 매트릭스를 가져 와서 원시 값으로 처리 한 다음 그 값에서 연결을했습니다. 그것은 수학적으로 작동합니까? 입력에 직사각형 데이터 행렬이 필요하므로 특정 단계가 반복되고 있다고 생각하지는 않습니다. –

+0

나는 당신이 알고 싶은 것을 더 분명하게하기 위해 질문을 편집해야한다고 생각합니다. 서면에 따라 정사각형 행렬을 만드는 방법을 묻는 중이고 정사각형 행렬 인 그림을 보여줍니다. – mwaskom

답변

8

clustermap()에 링크로서 미리 계산 된 거리 행렬을 전달할 수

clustermap(distance_matrix) (즉, 전달 링크없이) 옵션
import pandas as pd, seaborn as sns 
import scipy.spatial as sp, scipy.cluster.hierarchy as hc 
from sklearn.datasets import load_iris 
sns.set(font="monospace") 

iris = load_iris() 
X, y = iris.data, iris.target 
DF = pd.DataFrame(X, index = ["iris_%d" % (i) for i in range(X.shape[0])], columns = iris.feature_names) 

DF_corr = DF.T.corr() 
DF_dism = 1 - DF_corr # distance matrix 
linkage = hc.linkage(sp.distance.squareform(DF_dism), method='average') 
sns.clustermap(DF_dism, row_linkage=linkage, col_linkage=linkage) 

, 링키지 내부적 페어의 거리에 기초하여 계산된다 거리 매트릭스의 요소 (올바른 해결책)를 직접 사용하는 대신 거리 매트릭스의 행과 열 (자세한 내용은 아래 주 참조)을 사용하십시오. clustermap

참고 : 없음 row_linkageclustermap()로 전달되지 않는 경우, 열 결합 각 행에 "포인트"(관측)을 고려하여 내부적으로 결정되며, 그 결과, 출력은 문제의 하나는 다소 다르다 점 사이의 쌍 거리를 계산합니다. 따라서 행 덴 드로 그램은 행 유사성을 반영합니다. col_linkage과 유사하며 각 열은 점으로 간주됩니다. 이 설명은 docs에 추가되어야합니다. 여기에 문서의 첫 번째 예가 내부 연결 계산을 명시 적으로 수정했습니다.

import seaborn as sns; sns.set() 
import scipy.spatial as sp, scipy.cluster.hierarchy as hc 
flights = sns.load_dataset("flights") 
flights = flights.pivot("month", "year", "passengers") 
row_linkage, col_linkage = (hc.linkage(sp.distance.pdist(x), method='average') 
    for x in (flights.values, flights.values.T)) 
g = sns.clustermap(flights, row_linkage=row_linkage, col_linkage=col_linkage) 
    # note: this produces the same plot as "sns.clustermap(flights)", where 
    # clustermap() calculates the row and column linkages internally 
+0

다시 한번 감사드립니다. @Ulrich Stern이 말은 완벽합니다! –