2016-08-01 8 views
10

通常、樹状図とヒートマップを行うときは、距離行列を使用してSciPyの束をします。私はSeabornを試してみたいが、Seabornは私のデータが矩形であることを望んでいる(rows = samples、cols =属性、距離行列ではない)?sns.clustermapにあらかじめ計算された距離行列を与える方法は?

バックグラウンドとして本質的にseabornを使用して、私の樹状図を計算し、それをヒートマップに貼り付けたいとします。これは可能ですか?そうでない場合は、これを将来の機能にすることができます。

調整可能なパラメータがありますので、長方形のマトリックスの代わりに距離のマトリックスを使うことができますか?ここで

は、使用です:

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

私はこの質問を理解していません。 2番目の行列は正方形ではありませんか? – mwaskom

+0

さて、2番目は正方形ですが、それは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

注:NO 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はこれが理にかなっています! –

関連する問題