機械学習 - 階層クラスタリング
階層クラスタリング
階層クラスタリングは、データ ポイントをクラスタリングするための教師なし学習方法です。このアルゴリズムは、データ間の非類似度を測定することによってクラスターを構築します。教師なし学習とは、モデルをトレーニングする必要がなく、「ターゲット」変数が必要ないことを意味します。このメソッドは、個々のデータ ポイント間の関係を視覚化して解釈するために、任意のデータに対して使用できます。
ここでは、階層クラスタリングを使用してデータ ポイントをグループ化し、樹状図と散布図の両方を使用してクラスターを視覚化します。
どのような機能なのか?
ここでは、ボトムアップ アプローチに従う階層型クラスタリングの一種である凝集クラスタリングを使用します。まず、各データ ポイントを独自のクラスターとして扱います。次に、クラスター間の距離が最も短いクラスターを結合して、より大きなクラスターを作成します。この手順は、すべてのデータ ポイントを含む 1 つの大きなクラスターが形成されるまで繰り返されます。
階層的クラスタリングでは、距離とリンク方法の両方を決定する必要があります。ユークリッド距離と、クラスター間の分散を最小化しようとするウォード リンケージ法を使用します。
例
いくつかのデータ ポイントを視覚化することから始めます。
結果
ここで、ユークリッド距離を使用してワード リンケージを計算し、デンドログラムを使用して視覚化します。
例
結果
例
結果
例の説明
必要なモジュールをインポートします。
import numpy as npimport matplotlib.pyplot as pltfrom scipy.cluster.hierarchy import dendrogram, linkagefrom sklearn.cluster import AgglomerativeClustering
Matplotlib モジュールについては、「Matplotlib チュートリアル.
SciPy モジュールについては、SciPy チュートリアル.
NumPy は、Python で配列と行列を操作するためのライブラリです。NumPy モジュールについては、NumPy チュートリアル.
scikit-learn は、機械学習用の人気のあるライブラリです。
データセット内の 2 つの変数に似た配列を作成します。ここでは 2 つの変数しか使用していませんが、このメソッドは任意の数の変数で機能することに注意してください。
x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]
データを一連のポイントに変換します。
data = list(zip(x, y))print(data)
結果:
[(4, 21), (5, 19), (10, 24), (4, 17), (3, 16), (11, 25), (14, 24), (6, 22), (10, 21), (12, 21)]
すべての異なるポイント間のリンクを計算します。ここでは、単純なユークリッド距離測定と、クラスター間の分散を最小化しようとするウォードのリンケージを使用します。
linkage_data = linkage(data, method='ward', metric='euclidean')
最後に、結果をデンドログラムにプロットします。このプロットは、下部 (個々のポイント) から上部 (すべてのデータ ポイントで構成される単一のクラスター) までのクラスターの階層を示します。
plt.show()
生のリンケージ データだけでなく、デンドログラムを視覚化できます。
dendrogram(linkage_data)plt.show()
結果:
scikit-learn ライブラリを使用すると、階層型クラスタリングを別の方法で使用できます。まず、初期化しますAgglomerativeClustering
同じユークリッド距離とワード リンケージを使用して、2 つのクラスターを持つクラス。
hierarchical_cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
の.fit_predict
メソッドをデータに対して呼び出して、選択した数のクラスター全体で定義されたパラメーターを使用してクラスターを計算できます。
labels = hierarchical_cluster.fit_predict(data)print(labels)
結果:
[0 0 1 0 0 1 1 0 1 1]
最後に、同じデータをプロットし、階層的クラスタリング法によって各インデックスに割り当てられたラベルを使用してポイントに色を付けると、各ポイントが割り当てられたクラスターがわかります。
plt.scatter(x, y, c=labels)plt.show()
結果:
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。