24

このモジュール (scipy.cluster.hierarchy) に関して混乱がありました...そしてまだいくつかあります!

たとえば、次のデンドログラムがあります。

階層的クラスタリング

私の質問は、色付きのサブツリー (それぞれがクラスターを表す) を適切な形式 (SIF 形式など) で抽出するにはどうすればよいですか? 上記のプロットを取得するコードは次のとおりです。

import scipy
import scipy.cluster.hierarchy as sch
import matplotlib.pylab as plt

scipy.randn(100,2)

d = sch.distance.pdist(X)

Z= sch.linkage(d,method='complete')

P =sch.dendrogram(Z)

plt.savefig('plot_dendrogram.png')

T = sch.fcluster(Z, 0.5*d.max(), 'distance')
#array([4, 5, 3, 2, 2, 3, 5, 2, 2, 5, 2, 2, 2, 3, 2, 3, 2, 5, 4, 5, 2, 5, 2,
#       3, 3, 3, 1, 3, 4, 2, 2, 4, 2, 4, 3, 3, 2, 5, 5, 5, 3, 2, 2, 2, 5, 4,
#       2, 4, 2, 2, 5, 5, 1, 2, 3, 2, 2, 5, 4, 2, 5, 4, 3, 5, 4, 4, 2, 2, 2,
#       4, 2, 5, 2, 2, 3, 3, 2, 4, 5, 3, 4, 4, 2, 1, 5, 4, 2, 2, 5, 5, 2, 2,
#       5, 5, 5, 4, 3, 3, 2, 4], dtype=int32)

sch.leaders(Z,T)
# (array([190, 191, 182, 193, 194], dtype=int32),
#  array([2, 3, 1, 4,5],dtype=int32))

したがって、 の出力はfcluster()(ID による) ノードのクラスタリングを提供し、ここleaders()で説明されているのは 2 つの配列を返すことになっています。

  • 最初のものには、Z によって生成されたクラスターのリーダー ノードが含まれています。ここでは、プロットと同様に 5 つのクラスターがあることがわかります。

  • 2 つ目はこれらのクラスターの ID です

したがって、この Leaders() が resp を返す場合。L および M :L[2]=182およびM[2]=1の場合、クラスター 1 はノード ID 182 によって導かれますが、これは観測セット X には存在しません。ドキュメントには、「... その後、非シングルトン クラスターに対応する」と記載されています。しかし、私はそれを得ることができません...

また、Z を によってツリーに変換しました。これによりsch.to_tree(Z)、使いやすいツリー オブジェクトが返されます。これを視覚化したいのですが、これらの種類のツリー オブジェクトを入力として操作するグラフィカル プラットフォームとしてどのツールを使用すればよいでしょうか?

4

1 に答える 1

24

ツリー操作に関する質問の一部に答える...

別の回答で説明されているように、ツリーオブジェクトから読み取りicoordとブランチの座標を読み取ることができます。dcoord枝ごとに、左から右に座標が与えられます。

ツリーを手動でプロットしたい場合は、次のようなものを使用できます。

def plot_tree(P, pos=None):
    plt.clf()
    icoord = scipy.array(P['icoord'])
    dcoord = scipy.array(P['dcoord'])
    color_list = scipy.array(P['color_list'])
    xmin, xmax = icoord.min(), icoord.max()
    ymin, ymax = dcoord.min(), dcoord.max()
    if pos:
        icoord = icoord[pos]
        dcoord = dcoord[pos]
        color_list = color_list[pos]
    for xs, ys, color in zip(icoord, dcoord, color_list):
        plt.plot(xs, ys, color)
    plt.xlim(xmin-10, xmax + 0.1*abs(xmax))
    plt.ylim(ymin, ymax + 0.1*abs(ymax))
    plt.show()

コード内で、次のようになりplot_tree(P)ます。

ここに画像の説明を入力

この関数を使用すると、いくつかのブランチのみを選択できます。

plot_tree(P, range(10))

ここに画像の説明を入力

ここで、プロットするブランチを知る必要があります。多分fcluster()出力は少しあいまいで、最小距離と最大距離の許容値に基づいてプロットするブランチを見つける別の方法は、出力をlinkage()直接使用することです( ZOPの場合):

dmin = 0.2
dmax = 0.3
pos = scipy.all( (Z[:,2] >= dmin, Z[:,2] <= dmax), axis=0 ).nonzero()
plot_tree( P, pos )

推奨される参照:

于 2013-06-03T12:58:52.477 に答える