2016-08-01 20 views
10

Genellikle dendrogram ve ısı eşlemleri yaptığımda, bir uzaklık matrisi kullanıyorum ve bir grup SciPy yapalım. Seaborn'u denemek istiyorum ama Seaborn verilerimi dikdörtgen biçiminde istiyor (satırlar = örnekler, cols = öznitelikler, bir uzaklık matrisi değil)?sns.clustermap önceden hesaplanmış bir uzaklık matrisine nasıl verilir?

Esasen dendrogramımı hesaplamak ve ısıma eşime yapıştırmak için arka uç olarak seaborn kullanmak istiyorum. Mümkün mü? Değilse, bu gelecekte bir özellik olabilir.

Belki bir dikdörtgen matris yerine bir uzaklık matrisi alabilmem için ayarlayabildiğim parametreler var mı? İşte

kullanımı:

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) 
aşağıda

Kodum:

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

benim yöntem aşağıda doğru olduğunu düşünmüyorum çünkü bunu bir precomputed veriyorum mesafe matrisi ve istendiği gibi dikdörtgen bir veri matrisi DEĞİL. clustermap ile korelasyon/uzaklık matrisinin nasıl kullanıldığına dair bir örnek yoktur, ancak https://stanford.edu/~mwaskom/software/seaborn/examples/network_correlations.html için vardır, ancak düzlem sns.heatmap func ile kümelenmemiş.

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

enter image description here

+0

Soruyu anladığımdan emin değilim. İkinci matris kare değil mi? – mwaskom

+0

Yea, ikincisi kesinlikle kare ama b/c bir mesafe matrisi (1- korelasyon) besledim, sns.cluster_map ise dikdörtgen veri matrisini gerektirir. Bu yüzden temelde gereksiz kare mesafe matrisimi aldım, onları ham değerler olarak kabul ettim ve bundan sonra bağlantı kurdum. Bu matematiksel olarak çalışır mı? Girdi dikdörtgen bir veri matrisi gerektirdiği için mantıklı görünmüyor ve bazı adımların tekrarlandığını düşünüyorum. –

+0

Bence, bilmek istediğin şeyi daha net hale getirmek için soruyu düzenlemelisin. Yazılı olarak kare matrisi nasıl yapacağınızı soruyorsunuz ve kare matris olan bir arsa gösteriyorsunuz. – mwaskom

cevap

8

için clustermap() bağlantı olarak önceden hesaplanmış mesafe matrisi geçebilir:

clustermap(distance_matrix) (yani geçmiş bağlantı olmadan) için
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) 

, bağlantı iç ikili mesafeler göre hesaplanır Mesafe matrisinin elemanlarını (doğru çözüm) kullanmak yerine, mesafe matrisindeki satır ve sütunların (tüm detaylar için aşağıdaki nota bakınız). clustermap

Not: bir row_linkageclustermap() geçirilir, satır bağlantı, her satır, bir "nokta" (gözlem) dikkate alınarak dahili tespit edilir ve bunun bir sonucu olarak, çıkış söz konusu birinden biraz farklıdır Puanlar arasındaki çift yönlü mesafelerin hesaplanması. Yani satır dendrogram satır benzerliğini yansıtır. Her kolonun bir nokta olarak kabul edildiği col_linkage için benzer. Bu açıklama muhtemelen docs'a eklenmelidir. Burada dokümanın ilk örneği, iç bağlantı hesaplamasını açık yapmak üzere değiştirildi:

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

Tekrar teşekkürler @Ulrich Stern bu mükemmel bir anlam ifade ediyor! –

İlgili konular