ホームページ >バックエンド開発 >Python チュートリアル >階層的クラスタリングを 1 つの記事で理解する (Python コード)
まず、クラスタリングは機械学習の教師なし学習に属し、有名なK-meansなど多くの手法があります。階層クラスタリングもクラスタリングの一種で、非常に一般的に使用されます。次に、K 平均法の基本原理を簡単に確認してから、誰にとっても理解しやすいように、階層的クラスタリングの定義と階層的な手順をゆっくりと紹介します。
K 平均法の動作原理は、次のように簡単に要約できます。
これは新しく形成されたクラスターの重心が変わらないか、最大反復回数に達するまでの反復プロセスです。
しかし、K 平均法にはいくつかの欠点があります。アルゴリズムを開始する前に、クラスターの数 K を決定する必要があります。しかし、実際には、クラスターの数がいくつあるべきかわかりません。そのため、通常は自分自身の理解に基づいて決定します。 . 最初に値を設定すると、理解と実際の状況に多少の誤差が生じる可能性があります。
階層的クラスタリングはまったく異なります。最初にクラスタの数を指定する必要はありません。代わりに、最初に階層的クラスタリング全体を完全に形成し、次に適切な距離を決定することによって、対応するクラスタ番号を決定します。および合計は自動的に見つけることができます。
階層的クラスタリングがどのようなものかを浅いものから深いものまで紹介しましょう。簡単な例から始めましょう。
次の点があり、それらをグループ化したいとします。
これらの各点を別個のクラスター、つまり 4 つのクラスターに割り当てることができます ( 4 色):
次に、これらのクラスターの類似性 (距離) に基づいて、最も類似した (最も近い) 点がグループ化され、クラスターが 1 つだけ残るまでこのプロセスを繰り返します。 :
上記は基本的に階層を構築することです。まずこれを理解してください。後でその階層化手順を詳しく紹介します。
階層的クラスタリングには主に 2 つのタイプがあります:
まず、すべてのポイントを個別のクラスターにし、最終的にクラスターが 1 つだけになるまで、類似性によってそれらを結合し続けます。これが凝集型階層クラスタリングです。プロセスは次のとおりです。上で述べたことと一致します。
分割階層クラスタリングはその逆で、単一のクラスターから開始して、分割できなくなるまで徐々に分割します (つまり、各ポイントがクラスターになります)。
したがって、データ ポイントが 10、100、または 1000 個あるかどうかは問題ではありません。これらのポイントはすべて、最初は同じクラスターに属しています。 #次に、反復ごとにクラスター内の最も遠い 2 つのポイントを分割し、各クラスターに 1 つのポイントのみが含まれるまでこのプロセスを繰り返します。
#上記のプロセスは階層クラスタリングを分割しています。 。
階層的クラスタリングを実行する手順
まず、n 正方行列の形状を取得できるように、各点間の距離を保存する近接行列を作成する必要があります。 Xnの。
この場合、次の 5 x 5 の近接行列が得られます。
行列には 2 つの注意点があります。
たとえば、点 1 と点 2 の間の距離を計算したいとします。計算式は次のとおりです。
同様に、この計算方法を完了した後、近接行列の残りの要素。
これは、凝集型階層クラスタリングを使用して実装されます。
ステップ 1: まず、すべてのポイントを 1 つのクラスターに割り当てます。
ここでは、異なる色が異なるクラスターを表しており、そのうちの 5 つはデータ ポイントにあります。つまり、5 つの異なるクラスターが存在します。
ステップ 2: 次に、近接行列で最小距離を見つけて、最小距離の点を結合する必要があります。次に、近接行列を更新します。
最小距離は 3 なので、ポイント 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 サイトの他の関連記事を参照してください。