通常、デンドログラムとヒートマップを行うときは、距離行列を使用して、SciPy
の要素をまとめます。 Seaborn
を試してみたいのですが、Seaborn
はデータを長方形の形式で求めています(行=サンプル、列=属性、距離行列ではない)?
基本的に、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)
以下の方法は正しいとは思いません。事前に計算された距離行列を提供しているため、要求に応じて長方形のデータ行列を提供していないからです。 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)
事前計算された距離行列をclustermap()
へのリンケージとして渡すことができます。
_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(distance_matrix)
の場合(つまり、リンケージが渡されない場合)、リンケージは、距離の要素を使用する代わりに、距離行列の行と列のペアワイズ距離に基づいて内部的に計算されます(詳細については以下の注を参照)。直接行列(正しい解)。その結果、出力は問題の出力と多少異なります。
注:_row_linkage
_がclustermap()
に渡されない場合、行のリンケージは、各行を「ポイント」(観測)と見なし、ポイント間のペアワイズ距離を計算することによって内部的に決定されます。したがって、行の樹形図は行の類似性を反映しています。 _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
_