32

マトリックスの行とその列で個別にクラスタリングを実行し、マトリックス内のデータを並べ替えてクラスタリングを反映し、すべてをまとめる方法を探しています。クラスタリングの問題は簡単に解決でき、デンドログラムの作成も同様です (たとえば、このブログ「集合知のプログラミング」など)。ただし、データを並べ替える方法は不明のままです。

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

デンドグラム
(出典: warwick.ac.uk )

明確化

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

4

3 に答える 3

48

この関連する質問に対する私の最近の回答を参照してください。

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

デンドログラムと距離行列
(ソース: stevetjoa.com )

于 2010-06-10T19:21:41.590 に答える
5

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

>>> 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はソートされていない行列です。 xiそしてyi、新しい行/列配列のインデックスです。 a2は並べ替えられた行列でありx_idxs2y_idxs2は新しい並べ替えられた樹状図インデックスです。0これは、デンドログラムが作成されたときに、ブランチの列/行が常にブランチよりも比較的大きい/小さいことを前提としてい1ます。

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

于 2010-03-18T03:59:58.753 に答える
2

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

pip install pydendroheatmap

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

于 2015-07-14T04:20:11.663 に答える