logo

機械学習における階層的クラスタリング

階層クラスタリングは、もう 1 つの教師なし機械学習アルゴリズムであり、ラベルのないデータセットを 1 つのクラスターにグループ化するために使用され、別名 階層的クラスター分析 またはHCA。

このアルゴリズムでは、クラスターの階層をツリー形式で開発します。このツリー状の構造は、 樹状図

K 平均法クラスタリングと階層的クラスタリングの結果は似ているように見える場合がありますが、どちらも動作方法に応じて異なります。 K-Means アルゴリズムのようにクラスターの数を事前に決定する必要はありません。

階層的クラスタリング手法には 2 つのアプローチがあります。

    凝集性:凝集性とは、 ボトムアップ このアプローチでは、アルゴリズムはすべてのデータ ポイントを単一のクラスターとして取得し、1 つのクラスターが残るまでそれらをマージすることから始まります。意見の相違:分裂的アルゴリズムは、凝集的アルゴリズムの逆であり、 トップダウンのアプローチ。

なぜ階層的クラスタリングなのか?

すでに他にもあるので、 クラスタリング などのアルゴリズム K 平均法クラスタリング では、なぜ階層的クラスタリングが必要なのでしょうか?したがって、K 平均法クラスタリングで見てきたように、このアルゴリズムにはいくつかの課題があります。それは、クラスターの数があらかじめ決められており、常に同じサイズのクラスターを作成しようとします。これら 2 つの課題を解決するには、階層クラスタリング アルゴリズムを選択できます。このアルゴリズムでは、事前定義されたクラスター数についての知識が必要ないからです。

カイリー・ジェンナーの年齢

このトピックでは、凝集型階層クラスタリング アルゴリズムについて説明します。

凝集型階層クラスタリング

凝集型階層クラスタリング アルゴリズムは、HCA の一般的な例です。データセットをクラスターにグループ化するには、次の手順に従います。 ボトムアップアプローチ 。つまり、このアルゴリズムは最初に各データセットを単一のクラスターとみなし、次に最も近いクラスターのペアを結合し始めます。これは、すべてのクラスターがすべてのデータセットを含む 1 つのクラスターにマージされるまで行われます。

このクラスターの階層は樹状図の形式で表されます。

凝集型階層クラスタリングはどのように機能するのでしょうか?

AHC アルゴリズムの動作は、以下の手順を使用して説明できます。

    ステップ1:各データ ポイントを単一のクラスターとして作成します。 N 個のデータ ポイントがあるとします。したがって、クラスターの数も N になります。
    機械学習における階層的クラスタリング ステップ2:2 つの最も近いデータ ポイントまたはクラスターを取得し、それらを結合して 1 つのクラスターを形成します。したがって、N-1 個のクラスターが存在することになります。
    機械学習における階層的クラスタリング ステップ-3: 再度、最も近い 2 つのクラスターを取得し、それらを結合して 1 つのクラスターを形成します。 N-2 個のクラスターが存在します。
    機械学習における階層的クラスタリング ステップ-4:クラスターが 1 つだけ残るまでステップ 3 を繰り返します。したがって、次のクラスターを取得します。以下の画像を考えてみましょう。
    機械学習における階層的クラスタリング
    機械学習における階層的クラスタリング
    機械学習における階層的クラスタリング ステップ-5:すべてのクラスターが 1 つの大きなクラスターに結合されたら、樹状図を作成して問題に応じてクラスターを分割します。

注: 階層的クラスタリングをより深く理解するには、K-means クラスタリングを参照することをお勧めします。

2 つのクラスター間の距離を測定する

これまで見てきたように、 最も近い距離 2 つのクラスター間の距離は、階層的クラスタリングにとって重要です。 2 つのクラスター間の距離を計算するにはさまざまな方法があり、これらの方法によってクラスター化のルールが決まります。これらの措置はと呼ばれます 連携方法 。一般的なリンク方法のいくつかを以下に示します。

    単一リンケージ:これは、クラスターの最も近い点間の最短距離です。以下の画像を考えてみましょう。
    機械学習における階層的クラスタリング 完全な連携:これは、2 つの異なるクラスターの 2 点間の最も遠い距離です。単一リンケージよりも密なクラスターを形成するため、人気のあるリンケージ方法の 1 つです。
    機械学習における階層的クラスタリング 平均的なリンケージ:これは、各データセット間の距離を合計し、データセットの総数で割って 2 つのクラスター間の平均距離を計算する結合方法です。これは最も一般的なリンク方法の 1 つでもあります。重心リンケージ:クラスターの重心間の距離を計算する連結法です。以下の画像を考えてみましょう。
    機械学習における階層的クラスタリング

上記のアプローチのうち、問題の種類やビジネス要件に応じていずれかを適用できます。

階層的クラスタリングにおけるデンドログラムの動き

デンドログラムはツリー状の構造で、主に HC アルゴリズムが実行する各ステップをメモリとして保存するために使用されます。樹状図プロットでは、Y 軸はデータ ポイント間のユークリッド距離を示し、X 軸は指定されたデータセットのすべてのデータ ポイントを示します。

デンドログラムの仕組みは、以下の図を使用して説明できます。

機械学習における階層的クラスタリング

上の図では、左側の部分は凝集クラスタリングでクラスターがどのように作成されるかを示し、右側の部分は対応する樹状図を示しています。

JavaScriptのチュートリアル
  • 上で説明したように、まず、データポイント P2 と P3 が結合してクラスターを形成し、それに応じて P2 と P3 を長方形で接続する樹状図が作成されます。高さは、データ点間のユークリッド距離に従って決定されます。
  • 次のステップでは、P5 と P6 がクラスターを形成し、対応する樹状図が作成されます。 P5 と P6 の間のユークリッド距離が P2 と P3 よりも少し大きいため、以前よりも高くなります。
  • ここでも、P1、P2、および P3 を 1 つの樹状図に結合し、P4、P5、および P6 を別の樹状図に結合する 2 つの新しい樹状図が作成されます。
  • 最後に、すべてのデータ ポイントを結合した最終的な樹状図が作成されます。

要件に応じて、樹状図ツリー構造を任意のレベルで切り取ることができます。

凝集型階層クラスタリングの Python 実装

次に、Python を使用した凝集型階層クラスタリング アルゴリズムの実際の実装を見ていきます。これを実装するには、K 平均法クラスタリングの前のトピックで使用したのと同じデータセット問題を使用して、両方の概念を簡単に比較できるようにします。

このデータセットには、ショッピングのためにモールを訪れた顧客の情報が含まれています。したがって、モールの所有者は、データセット情報を使用して、顧客のいくつかのパターンまたは特定の行動を見つけたいと考えています。

Python を使用した AHC の実装手順:

実装手順はk-meansクラスタリングと同じですが、クラスタ数の求め方など一部変更があります。以下に手順を示します。

    データの前処理 デンドログラムを使用して最適なクラスター数を見つける 階層的クラスタリング モデルのトレーニング クラスターの視覚化

データの前処理手順:

このステップでは、モデルのライブラリとデータセットをインポートします。

    ライブラリのインポート
 # Importing the libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd 

上記のコード行は、ライブラリをインポートして、次のような特定のタスクを実行するために使用されます。 しこり 数学的演算の場合、 マットプロットライブラリ グラフまたは散布図を描画するため、および パンダ データセットをインポートするため。

    データセットのインポート
 # Importing the dataset dataset = pd.read_csv('Mall_Customers_data.csv') 

上で説明したように、同じデータセットをインポートしました。 Mall_Customers_data.csv、 K 平均法クラスタリングで行ったように。以下の出力を考えてみましょう。

スリー・ラマヌジャン
機械学習における階層的クラスタリング
    特徴のマトリックスの抽出

ここでは、従属変数に関するそれ以上の情報がないため、特徴の行列のみを抽出します。コードを以下に示します。

 x = dataset.iloc[:, [3, 4]].values 

ここでは 2D プロットを使用してクラスターを確認するため、3 列と 4 列のみを抽出しました。そこで、年収と支出のスコアを特徴のマトリクスとして考えています。

ステップ 2: デンドログラムを使用して最適なクラスター数を見つける

次に、モデルのデンドログラムを使用して、クラスターの最適な数を見つけます。このために、私たちは使用します サイピー コードの樹状図を直接返す関数を提供するライブラリです。以下のコード行を考えてみましょう。

 #Finding the optimal number of clusters using the dendrogram import scipy.cluster.hierarchy as shc dendro = shc.dendrogram(shc.linkage(x, method='ward')) mtp.title('Dendrogrma Plot') mtp.ylabel('Euclidean Distances') mtp.xlabel('Customers') mtp.show() 

上記のコード行では、 階層 scipyライブラリのモジュール。このモジュールはメソッドを提供します shc.denrogram()、 それは リンケージ() パラメータとして。リンケージ関数は 2 つのクラスター間の距離を定義するために使用されるため、ここでは x(特徴の行列) とメソッド ' を渡しています。 」、階層クラスタリングにおける一般的な結合方法です。

コードの残りの行は、樹状図プロットのラベルを記述します。

出力:

上記のコード行を実行すると、以下の出力が得られます。 :

機械学習における階層的クラスタリング

この樹状図を使用して、モデルに最適なクラスターの数を決定します。このために、 最大垂直距離 それは水平バーをカットしません。以下の図を考えてみましょう。

機械学習における階層的クラスタリング

上の図では、水平バーをカットしていない垂直距離を示しています。視覚化できるように、4番目距離は最大に見えるので、これによると、 クラスターの数は 5 になります (この範囲の垂直線)。 2も承りますnd4 にほぼ等しい数値番目距離ですが、K 平均法アルゴリズムで計算したものと同じであるため、5 つのクラスターを考慮します。

したがって、最適なクラスター数は 5 になります。 次のステップでは、同じものを使用してモデルをトレーニングします。

ステップ 3: 階層的クラスタリング モデルのトレーニング

必要な最適なクラスター数がわかったので、モデルをトレーニングできるようになりました。コードを以下に示します。

C# 辞書
 #training the hierarchical model on dataset from sklearn.cluster import AgglomerativeClustering hc= AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward') y_pred= hc.fit_predict(x) 

上記のコードでは、 凝集クラスタリング scikit 学習ライブラリのクラスター モジュールのクラス。

次に、次の名前のこのクラスのオブジェクトを作成しました。 HC。 AgglomerativeClustering クラスは次のパラメータを取ります。

Linuxコマンドのディレクトリ
    n_クラスター=5: クラスターの数を定義します。クラスターの最適な数であるため、ここでは 5 を採用しました。アフィニティ='ユークリッド': リンケージを計算するために使用されるメトリックです。リンケージ='ワード': リンケージ基準を定義します。ここでは「ward」リンケージを使用しました。この方法は、デンドログラムの作成にすでに使用されている一般的なリンク方法です。これにより、各クラスター内の分散が減少します。

最後の行では、モデルを適合またはトレーニングするための従属変数 y_pred を作成しました。モデルをトレーニングするだけでなく、各データ ポイントが属するクラスターも返します。

上記のコード行を実行した後、Sypder IDE の変数エクスプローラー オプションを使用すると、y_pred 変数を確認できます。元のデータセットを y_pred 変数と比較できます。以下の画像を考えてみましょう。

機械学習における階層的クラスタリング

上の画像からわかるように、 y_pred クラスター値を示します。これは、顧客 ID 1 が 5 に属していることを意味します。番目クラスター (インデックス付けは 0 から始まるため、4 は 5 を意味します)番目クラスター)、顧客 ID 2 は 4 に属します。番目クラスターなど。

ステップ 4: クラスターの視覚化

モデルのトレーニングが成功したので、データセットに対応するクラスターを視覚化できるようになりました。

ここでは、1 つの変更を除いて、K-means クラスタリングで行ったのと同じコード行を使用します。ここでは、クラスターの最適な数を決定するために樹形図を使用しているため、K 平均法で行った重心をプロットしません。コードを以下に示します。

 #visulaizing the clusters mtp.scatter(x[y_pred == 0, 0], x[y_pred == 0, 1], s = 100, c = 'blue', label = 'Cluster 1') mtp.scatter(x[y_pred == 1, 0], x[y_pred == 1, 1], s = 100, c = 'green', label = 'Cluster 2') mtp.scatter(x[y_pred== 2, 0], x[y_pred == 2, 1], s = 100, c = 'red', label = 'Cluster 3') mtp.scatter(x[y_pred == 3, 0], x[y_pred == 3, 1], s = 100, c = 'cyan', label = 'Cluster 4') mtp.scatter(x[y_pred == 4, 0], x[y_pred == 4, 1], s = 100, c = 'magenta', label = 'Cluster 5') mtp.title('Clusters of customers') mtp.xlabel('Annual Income (k$)') mtp.ylabel('Spending Score (1-100)') mtp.legend() mtp.show() 

出力: 上記のコード行を実行すると、以下の出力が得られます。

機械学習における階層的クラスタリング