素朴なPythonの列と行のクラスタリングを反映するために行列要素を並べ替える
-
20-09-2019 - |
質問
行列の行とその列で個別にクラスタリングを実行し、クラスタリングを反映して行列内のデータを並べ替えてすべてをまとめる方法を探しています。クラスタリングの問題は簡単に解決でき、樹状図の作成も簡単に解決できます (たとえば、 このブログ またはで 「集合知のプログラミング」)。ただし、データを並べ替える方法はまだわかりません。
最終的には、素朴な Python を使用して、以下のようなグラフを作成する方法を探しています (numpy、matplotlib などの「標準」ライブラリを使用しますが、 Rを使用する または他の外部ツール)。
(ソース: ワーウィック.ac.uk)
説明
再注文とはどういう意味ですかと尋ねられました。最初に行列の行ごとに、次にその列ごとに行列内のデータをクラスタリングすると、各行列セルは 2 つの樹状図内の位置によって識別できます。樹状図内で互いに接近している要素が行列内で互いに接近するように元の行列の行と列を並べ替えてからヒートマップを生成すると、データのクラスタリングが閲覧者にとって明らかになる場合があります。 (上の図のように)
解決
私のことを見てください 最近の答え, の一部を以下にコピーし、 この関連する質問.
import scipy
import pylab
import scipy.cluster.hierarchy as sch
# Generate features and distance matrix.
x = scipy.rand(40)
D = scipy.zeros([40,40])
for i in range(40):
for j in range(40):
D[i,j] = abs(x[i] - x[j])
# Compute and plot dendrogram.
fig = pylab.figure()
axdendro = fig.add_axes([0.09,0.1,0.2,0.8])
Y = sch.linkage(D, method='centroid')
Z = sch.dendrogram(Y, orientation='right')
axdendro.set_xticks([])
axdendro.set_yticks([])
# Plot distance matrix.
axmatrix = fig.add_axes([0.3,0.1,0.6,0.8])
index = Z['leaves']
D = D[index,:]
D = D[:,index]
im = axmatrix.matshow(D, aspect='auto', origin='lower')
axmatrix.set_xticks([])
axmatrix.set_yticks([])
# Plot colorbar.
axcolor = fig.add_axes([0.91,0.1,0.02,0.8])
pylab.colorbar(im, cax=axcolor)
# Display and save figure.
fig.show()
fig.savefig('dendrogram.png')
(ソース: スティーブジョア.com)
他のヒント
私は完全に理解していないが、あなたが樹状図なインデックスの種類に基づいて再インデックスに配列の各軸をしようとしている表示されます。私は、各ブランチの描写では、いくつかの比較ロジックがあると仮定しね。このような場合は、この作業はでしょう(?):
>>> x_idxs = [(0,1,0,0),(0,1,1,1),(0,1,1),(0,0,1),(1,1,1,1),(0,0,0,0)]
>>> y_idxs = [(1,1),(0,1),(1,0),(0,0)]
>>> a = np.random.random((len(x_idxs),len(y_idxs)))
>>> x_idxs2, xi = zip(*sorted(zip(x_idxs,range(len(x_idxs)))))
>>> y_idxs2, yi = zip(*sorted(zip(y_idxs,range(len(y_idxs)))))
>>> a2 = a[xi,:][:,yi]
x_idxs
とy_idxs
は、樹形なインデックスです。 a
はソートされていない行列です。 xi
とyi
はあなたの新しい行/列配列なインデックスです。 a2
とx_idxs2
が新しい、ソートされた樹状図なインデックスしている間y_idxs2
はソートされた行列です。これは、樹状図は0
分岐列/行が常に1
分岐よりも比較的大きい/小さいと作成されたときと仮定しています。
あなたのy_idxsとx_idxsがリストではなく、numpyの配列である場合は、同様の方法でnp.argsort
を使用することができます。
私は、これはゲームに非常に遅れているけど、私はこのページの記事からのコードに基づいてプロットオブジェクトを作りました。そうあなただけ呼び出す必要がありますインストールするには、PIPに登録されています。
pip install pydendroheatmap
ここでは、プロジェクトのgithubのページをご覧ください: https://github.com/themantalope/pydendroheatmapする