ホームページ >バックエンド開発 >Python チュートリアル >階層的クラスタリングを 1 つの記事で理解する (Python コード)
まず、クラスタリングは機械学習の教師なし学習に属し、有名なK-meansなど多くの手法があります。階層クラスタリングもクラスタリングの一種で、非常に一般的に使用されます。次に、K 平均法の基本原理を簡単に確認してから、誰にとっても理解しやすいように、階層的クラスタリングの定義と階層的な手順をゆっくりと紹介します。
K 平均法の動作原理は、次のように簡単に要約できます。
これは新しく形成されたクラスターの重心が変わらないか、最大反復回数に達するまでの反復プロセスです。
しかし、K 平均法にはいくつかの欠点があります。アルゴリズムを開始する前に、クラスターの数 K を決定する必要があります。しかし、実際には、クラスターの数がいくつあるべきかわかりません。そのため、通常は自分自身の理解に基づいて決定します。 . 最初に値を設定すると、理解と実際の状況に多少の誤差が生じる可能性があります。
階層的クラスタリングはまったく異なります。最初にクラスタの数を指定する必要はありません。代わりに、最初に階層的クラスタリング全体を完全に形成し、次に適切な距離を決定することによって、対応するクラスタ番号を決定します。および合計は自動的に見つけることができます。
階層的クラスタリングがどのようなものかを浅いものから深いものまで紹介しましょう。簡単な例から始めましょう。
次の点があり、それらをグループ化したいとします。
これらの各点を別個のクラスター、つまり 4 つのクラスターに割り当てることができます ( 4 色):
次に、これらのクラスターの類似性 (距離) に基づいて、最も類似した (最も近い) 点がグループ化され、クラスターが 1 つだけ残るまでこのプロセスを繰り返します。 :
上記は基本的に階層を構築することです。まずこれを理解してください。後でその階層化手順を詳しく紹介します。
階層的クラスタリングには主に 2 つのタイプがあります:
まず、すべてのポイントを個別のクラスターにし、最終的にクラスターが 1 つだけになるまで、類似性によってそれらを結合し続けます。これが凝集型階層クラスタリングです。プロセスは次のとおりです。上で述べたことと一致します。
分割階層クラスタリングはその逆で、単一のクラスターから開始して、分割できなくなるまで徐々に分割します (つまり、各ポイントがクラスターになります)。
したがって、データ ポイントが 10、100、または 1000 個あるかどうかは問題ではありません。これらのポイントはすべて、最初は同じクラスターに属しています。 #次に、反復ごとにクラスター内の最も遠い 2 つのポイントを分割し、各クラスターに 1 つのポイントのみが含まれるまでこのプロセスを繰り返します。
#上記のプロセスは階層クラスタリングを分割しています。 。
階層的クラスタリングを実行する手順
階層的クラスタリングの一般的なプロセスは上で説明しましたが、ここで重要な点になります。点間の類似性をどのように判断するかです。 これはクラスタリングにおける最も重要な問題の 1 つであり、類似性を計算する一般的な方法は、これらのクラスターの重心間の距離を計算することです。最小距離を持つ点は類似点と呼ばれ、それらを結合することも、距離ベースのアルゴリズムと呼ぶこともできます。 階層的クラスタリングにも、各点間の距離を格納する近接行列と呼ばれる概念があります。以下では、類似度、近接行列、および階層的クラスタリングの具体的な手順を計算する方法を理解するために例を使用します。 ケースの紹介教師が生徒をさまざまなグループに分けたいと考えているとします。課題の各生徒のスコアがわかったので、これらのスコアに基づいて生徒をグループに分けたいと思います。ここではグループの数について設定された目標はありません。教師はどのタイプの生徒をどのグループに割り当てるべきかわからないため、教師あり学習問題として解決することはできません。以下では、階層的クラスタリングを適用して学生をさまざまなグループに分類してみます。 以下は 5 人の学生の結果です:まず、n 正方行列の形状を取得できるように、各点間の距離を保存する近接行列を作成する必要があります。 Xnの。
この場合、次の 5 x 5 の近接行列が得られます。
行列には 2 つの注意点があります。
たとえば、点 1 と点 2 の間の距離を計算したいとします。計算式は次のとおりです。
同様に、この計算方法を完了した後、近接行列の残りの要素。
これは、凝集型階層クラスタリングを使用して実装されます。
ステップ 1: まず、すべてのポイントを 1 つのクラスターに割り当てます。
ここでは、異なる色が異なるクラスターを表しており、そのうちの 5 つはデータ ポイントにあります。つまり、5 つの異なるクラスターが存在します。
ステップ 2: 次に、近接行列で最小距離を見つけて、最小距離の点を結合する必要があります。次に、近接行列を更新します。
最小距離は 3 なので、ポイント 1 と 2 をマージします。
# # 更新されたクラスターを見て、それに応じて近接行列を更新しましょう: # 更新後、2 つの点 1 と 2 の間の最大値 (7, 10) を取得します。 2 を使用して、このクラスターの値を置き換えます。もちろん、最大値に加えて、最小値または平均値を取得することもできます。次に、これらのクラスターの近接行列を再度計算します。 ステップ 3: クラスターが 1 つだけ残るまでステップ 2 を繰り返します。 すべての手順を繰り返すと、以下に示すようにマージされたクラスターが得られます。 これが、凝集型階層クラスタリングの仕組みです。しかし問題は、いくつのグループに分けるべきかまだわからないということです。グループ 2、3、または 4 ですか? まずはクラスターの数を選択する方法から始めましょう。 クラスターの数はどのように選択すればよいですか? 階層的クラスタリングのクラスター数を取得するために、デンドログラムと呼ばれる概念を使用します。 樹状図を使用すると、クラスターの数をより簡単に選択できます。 上の例に戻ります。 2 つのクラスターをマージすると、樹状図はこれらのクラスター間の距離を記録し、それをグラフィックで表します。以下は樹状図の元の状態です。横軸は各点のマークを記録し、縦軸は点間の距離を記録します。がクラスターの場合、それらは樹状図内で接続され、接続の高さがポイント間の距離になります。以下は、今実行した階層的クラスタリングのプロセスです。 次に、上記のプロセスの樹形図の描画を開始します。サンプル 1 と 2 のマージから開始すると、これら 2 つのサンプル間の距離は 3 になります。 1 と 2 がマージされていることがわかります。縦線は 1 と 2 の間の距離を表します。同様に、クラスターを結合するすべてのステップが階層的クラスター化プロセスに従って描画され、最終的に次のような樹形図が得られます。樹状図を使用すると、階層的クラスタリングのステップを明確に視覚化できます。樹形図の垂直線の間隔が離れるほど、クラスター間の距離は長くなります。
この樹状図を使用すると、クラスターの数を決定するのがはるかに簡単になります。
これで、距離のしきい値を設定し、水平線を描くことができます。たとえば、しきい値を 12 に設定し、次のように水平線を引きます。
交点からわかるように、クラスターの数は、水平線のしきい値と垂直線の量 (赤い線は 2 本の垂直線と交差します。クラスターは 2 つになります)。横軸に対応して、1 つのクラスターにはサンプル セット (1、2、4) があり、もう 1 つのクラスターにはサンプル セット (3、5) があります。
このようにして、樹状図を通じて階層的クラスタリングにおけるクラスターの数を決定する問題を解決します。
上記は理論的な基礎であり、数学的な基礎が少しあれば誰でも理解できます。 Python コードを使用してこのプロセスを実装する方法は次のとおりです。ここでは、表示する顧客セグメンテーション データを示します。
データセットとコードは私の GitHub リポジトリにあります:
https://github.com/xiaoyusmd/PythonDataScience
このデータは、UCI 機械学習ライブラリから取得したものです。私たちの目的は、牛乳、食料品、地域などのさまざまな製品カテゴリーに対する年間支出に基づいて、卸売業者の顧客をセグメント化することです。
まずデータを標準化して、同じディメンション内のすべてのデータを計算しやすくし、次に階層的クラスタリングを適用して顧客をセグメント化します。
from sklearn.preprocessing import normalize data_scaled = normalize(data) data_scaled = pd.DataFrame(data_scaled, columns=data.columns) import scipy.cluster.hierarchy as shc plt.figure(figsize=(10, 7)) plt.title("Dendrograms") dend = shc.dendrogram(shc.linkage(data_scaled, method='ward'))
X 軸にはすべてのサンプルが含まれ、Y 軸はこれらのサンプル間の距離を表します。最大距離の垂直線は青い線です。しきい値 6 で樹状図を切り取ることにしたとします:
plt.figure(figsize=(10, 7)) plt.title("Dendrograms") dend = shc.dendrogram(shc.linkage(data_scaled, method='ward')) plt.axhline(y=6, color='r', linestyle='--')
2 つのクラスターがあるので、次のことが必要です。クラスターに階層クラスタリングを適用するには:
from sklearn.cluster import AgglomerativeClustering cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward') cluster.fit_predict(data_scaled)
2 つのクラスターを定義したため、出力には 0 と 1 の値が表示されます。 0 は最初のクラスターに属する点を表し、1 は 2 番目のクラスターに属する点を表します。
plt.figure(figsize=(10, 7)) plt.scatter(data_scaled['Milk'], data_scaled['Grocery'], c=cluster.labels_)
この時点で、クラスタリングは正常に完了しました。
以上が階層的クラスタリングを 1 つの記事で理解する (Python コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。