web-dev-qa-db-ja.com

ナイーブの列と行のクラスタリングを反映するように行列要素を並べ替えるpython

行列の行ではなく、列で個別にクラスタリングを実行する方法を探しています。クラスタリングを反映するようにマトリックス内のデータを並べ替えて、すべてをまとめます。クラスタリングの問題は簡単に解決でき、樹状図の作成も簡単に解決できます(たとえば、 このブログ または "集合知プログラミング" )。ただし、データを並べ替える方法は私にはわかりません。

最終的には、naive Python(numpy、matplotlibなどの「標準」ライブラリを使用しますが、 を使用しない)を使用して、以下のようなグラフを作成する方法を探していますR または他の外部ツール)。

dendogram
(出典: warwick.ac.uk

説明

再注文の意味を尋ねられました。最初に行列の行で、次にその列で行列内のデータをクラスター化すると、各行列セルは2つの樹状図の位置で識別できます。元のマトリックスの行と列を並べ替えて、樹状図で互いに接近している要素がマトリックス内で互いに接近し、ヒートマップを生成すると、データのクラスタリングが視聴者に明らかになる場合があります。 (上の図のように)

29
Boris Gorelik

私の 最近の回答 を参照してください。以下の一部をコピーして この関連する質問 に。

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')

Dendrogram and distance matrix
(出典: stevetjoa.com

41
Steve Tjoa

完全にはわかりませんが、樹状図のインデックスの種類に基づいて、配列の各軸のインデックスを再作成しようとしているようです。これは、各ブランチの描写にいくつかの比較ロジックがあることを前提としていると思います。これが事実である場合、これは機能しますか(?):

>>> 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_idxsy_idxsは樹状図の指標です。 aはソートされていない行列です。 xiyiは、新しい行/列配列のインデックスです。 a2はソートされたマトリックスであり、x_idxs2y_idxs2は新しいソートされた樹状図の指標です。これは、樹状図が作成されたときに、0ブランチの列/行が常に1ブランチよりも比較的大きい/小さいことを前提としています。

Y_idxsとx_idxsがリストではなく、numpy配列である場合は、同様の方法でnp.argsortを使用できます。

5
Paul

これはゲームに非常に遅れていることは知っていますが、このページの投稿のコードに基づいてプロットオブジェクトを作成しました。それはpipに登録されているので、インストールするには電話するだけです

pip install pydendroheatmap

ここでプロジェクトのgithubページをチェックしてください: https://github.com/themantalope/pydendroheatmap

2
themantalope