web-dev-qa-db-ja.com

scipy.cluster.hierarchyのチュートリアル

階層クラスターを操作する方法を理解しようとしていますが、ドキュメントがあまりにも...技術的ですか?...そしてそれがどのように機能するか理解できません。

いくつかの簡単なタスクをステップバイステップで説明することから始めるのに役立つチュートリアルはありますか?

次のデータセットがあるとします。

a = np.array([[0,   0  ],
              [1,   0  ],
              [0,   1  ],
              [1,   1  ], 
              [0.5, 0  ],
              [0,   0.5],
              [0.5, 0.5],
              [2,   2  ],
              [2,   3  ],
              [3,   2  ],
              [3,   3  ]])

階層クラスターを簡単に作成し、樹状図をプロットできます。

z = linkage(a)
d = dendrogram(z)
  • さて、特定のクラスターをどのように回復できますか?樹状図に要素[0,1,2,4,5,6]が含まれているとしましょう。
  • その要素の値を取得するにはどうすればよいですか?
33
user2988577

階層型凝集クラスタリング(HAC)には3つのステップがあります。

  1. データの定量化(metric引数)
  2. クラスターデータ(method引数)
  3. クラスターの数を選択します

やること

z = linkage(a)

最初の2つのステップを完了します。パラメーターを指定しなかったため、標準値を使用します

  1. metric = 'euclidean'
  2. method = 'single'

したがって、z = linkage(a)は、aの単一のリンクされた階層的凝集クラスタリングを提供します。このクラスタリングは、一種のソリューションの階層です。この階層から、データの構造に関する情報を取得します。あなたが今できることは:

  • 適切なmetricを確認しますe。 g。 cityblockまたはchebychevはデータを異なる方法で定量化します(cityblockeuclideanおよびchebychevL1L2、およびL_infのノルムに対応します)
  • methdosのさまざまなプロパティ/動作を確認します(例:singlecompleteおよびaverage
  • クラスターの数を決定する方法を確認します。 g。 それについてのウィキを読む
  • シルエット係数 などの見つかったソリューション(クラスタリング)のインデックスを計算します(この係数を使用すると、クラスタリングによって割り当てられたクラスターにポイント/観測がどの程度適合するかについてのフィードバックが得られます) )。異なるインデックスは、異なる基準を使用してクラスタリングを修飾します。

ここから始めます

import numpy as np
import scipy.cluster.hierarchy as hac
import matplotlib.pyplot as plt


a = np.array([[0.1,   2.5],
              [1.5,   .4 ],
              [0.3,   1  ],
              [1  ,   .8 ],
              [0.5,   0  ],
              [0  ,   0.5],
              [0.5,   0.5],
              [2.7,   2  ],
              [2.2,   3.1],
              [3  ,   2  ],
              [3.2,   1.3]])

fig, axes23 = plt.subplots(2, 3)

for method, axes in Zip(['single', 'complete'], axes23):
    z = hac.linkage(a, method=method)

    # Plotting
    axes[0].plot(range(1, len(z)+1), z[::-1, 2])
    knee = np.diff(z[::-1, 2], 2)
    axes[0].plot(range(2, len(z)), knee)

    num_clust1 = knee.argmax() + 2
    knee[knee.argmax()] = 0
    num_clust2 = knee.argmax() + 2

    axes[0].text(num_clust1, z[::-1, 2][num_clust1-1], 'possible\n<- knee point')

    part1 = hac.fcluster(z, num_clust1, 'maxclust')
    part2 = hac.fcluster(z, num_clust2, 'maxclust')

    clr = ['#2200CC' ,'#D9007E' ,'#FF6600' ,'#FFCC00' ,'#ACE600' ,'#0099CC' ,
    '#8900CC' ,'#FF0000' ,'#FF9900' ,'#FFFF00' ,'#00CC01' ,'#0055CC']

    for part, ax in Zip([part1, part2], axes[1:]):
        for cluster in set(part):
            ax.scatter(a[part == cluster, 0], a[part == cluster, 1], 
                       color=clr[cluster])

    m = '\n(method: {})'.format(method)
    plt.setp(axes[0], title='Screeplot{}'.format(m), xlabel='partition',
             ylabel='{}\ncluster distance'.format(m))
    plt.setp(axes[1], title='{} Clusters'.format(num_clust1))
    plt.setp(axes[2], title='{} Clusters'.format(num_clust2))

plt.tight_layout()
plt.show()

与える enter image description here

62
embert