メインコンテンツへスキップ
見出し画像

書記が数学やるだけ#575 階層型クラスタリング

    クラスタリングの簡単な例を示してみる。


    問題

    スクリーンショット 2022-09-13 20.53.35


    説明

    階層型クラスタリングでは,距離の近い要素を集めることで樹形図を作っていく。

    スクリーンショット 2022-09-13 20.53.54


    解答

    各点同士の距離を求め,最も短いものをまとめていく。

    数学やるだけ解答#575_page-0001


    これを1つになるまで繰り返して,まとめたものが以下の樹形図である。

    数学やるだけ解答#575_page-0002


    Ward法では,クラスター内の平方和を最小化することで樹形図を作っていく。これは最短距離法に比べ鎖効果が起きにくいとされる。

    数学やるだけ解答#575_page-0003


    数学やるだけ解答#575_page-0004


    digitsデータは,数字の手書き文字をドットで表したものである。今回はそのうち上10個のデータについてクラスタリングを実行する。

    #digitsデータ
    from pandas import DataFrame
    import matplotlib.pyplot as plt
    from collections import defaultdict
    from scipy.spatial.distance import pdist
    from scipy.cluster.hierarchy import linkage, fcluster, dendrogram
    from sklearn import datasets
    digits = datasets.load_digits()
    #画像の可視化
    images_and_labels = list(zip(digits.images, digits.target))
    for index, (image, label) in enumerate(images_and_labels[:10]):
       plt.subplot(2, 5, index + 1)
       plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
       plt.axis('off')
       plt.title('%i' % label)
    plt.show()

    画像7


    各データは64次元のベクトル(元は8×8)として表現される。次元が上がっても距離の計算は同じようにできる。

    #ベクトル表示
    df = DataFrame(digits.data[:10])
    df

    スクリーンショット 2022-09-13 21.00.55


    最短距離法とWard法のそれぞれを実行してみる(距離は共にユークリッド距離)。

    # クラスタリングの実行(最短距離法)
    clu = linkage(df, method='single', metric='euclidean')
    # 描画領域の定義
    plt.figure(num=None, figsize=(16, 9))
    # 樹形図の作成・出力
    dendrogram(clu)
    plt.show()

    画像9


    # クラスタリングの実行(Ward法)
    clu = linkage(df, method='ward', metric='euclidean')
    # 描画領域の定義
    plt.figure(num=None, figsize=(16, 9))
    # 樹形図の作成・出力
    dendrogram(clu)
    plt.show()

    画像10


    見た感じ,Ward法の方がうまく分離できていそうである。


    本記事のもくじはこちら:


    あなたへのおすすめ