目次
階層的クラスタリングと K 平均法の違いは何ですか?
階層的クラスタリングとは何ですか?
階層的クラスタリングのタイプ
凝集型階層クラスタリング
分割階層クラスタリング
近接行列の作成
階層クラスタリングの実行
Python コードの実践例
役に立ったと思われる場合は、星を付けてください。
ホームページ バックエンド開発 Python チュートリアル 階層的クラスタリングを 1 つの記事で理解する (Python コード)

階層的クラスタリングを 1 つの記事で理解する (Python コード)

Apr 11, 2023 pm 09:13 PM
python コード 階層的クラスタリング

階層的クラスタリングを 1 つの記事で理解する (Python コード)

まず、クラスタリングは機械学習の教師なし学習に属し、有名なK-meansなど多くの手法があります。階層クラスタリングもクラスタリングの一種で、非常に一般的に使用されます。次に、K 平均法の基本原理を簡単に確認してから、誰にとっても理解しやすいように、階層的クラスタリングの定義と階層的な手順をゆっくりと紹介します。

階層的クラスタリングと K 平均法の違いは何ですか?

K 平均法の動作原理は、次のように簡単に要約できます。

  • クラスターの数 (k) を決定します。
  • データから k 点をランダムに選択します。 centroids
  • すべてのポイントを最も近いクラスターの重心に割り当てます
  • 新しく形成されたクラスターの重心を計算します
  • 手順 3 と 4 を繰り返します

これは新しく形成されたクラスターの重心が変わらないか、最大反復回数に達するまでの反復プロセスです。

しかし、K 平均法にはいくつかの欠点があります。アルゴリズムを開始する前に、クラスターの数 K を決定する必要があります。しかし、実際には、クラスターの数がいくつあるべきかわかりません。そのため、通常は自分自身の理解に基づいて決定します。 . 最初に値を設定すると、理解と実際の状況に多少の誤差が生じる可能性があります。

階層的クラスタリングはまったく異なります。最初にクラスタの数を指定する必要はありません。代わりに、最初に階層的クラスタリング全体を完全に形成し、次に適切な距離を決定することによって、対応するクラスタ番号を決定します。および合計は自動的に見つけることができます。

階層的クラスタリングとは何ですか?

階層的クラスタリングがどのようなものかを浅いものから深いものまで紹介しましょう。簡単な例から始めましょう。

次の点があり、それらをグループ化したいとします。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

これらの各点を別個のクラスター、つまり 4 つのクラスターに割り当てることができます ( 4 色):

階層的クラスタリングを 1 つの記事で理解する (Python コード)

次に、これらのクラスターの類似性 (距離) に基づいて、最も類似した (最も近い) 点がグループ化され、クラスターが 1 つだけ残るまでこのプロセスを繰り返します。 :

階層的クラスタリングを 1 つの記事で理解する (Python コード)

上記は基本的に階層を構築することです。まずこれを理解してください。後でその階層化手順を詳しく紹介します。

階層的クラスタリングのタイプ

階層的クラスタリングには主に 2 つのタイプがあります:

  • 凝集型階層的クラスタリング
  • 分割型階層的クラスタリング

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

まず、すべてのポイントを個別のクラスターにし、最終的にクラスターが 1 つだけになるまで、類似性によってそれらを結合し続けます。これが凝集型階層クラスタリングです。プロセスは次のとおりです。上で述べたことと一致します。

分割階層クラスタリング

分割階層クラスタリングはその逆で、単一のクラスターから開始して、分割できなくなるまで徐々に分割します (つまり、各ポイントがクラスターになります)。

したがって、データ ポイントが 10、100、または 1000 個あるかどうかは問題ではありません。これらのポイントはすべて、最初は同じクラスターに属しています。 #次に、反復ごとにクラスター内の最も遠い 2 つのポイントを分割し、各クラスターに 1 つのポイントのみが含まれるまでこのプロセスを繰り返します。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

#上記のプロセスは階層クラスタリングを分割しています。 。

階層的クラスタリングを実行する手順階層的クラスタリングを 1 つの記事で理解する (Python コード)

階層的クラスタリングの一般的なプロセスは上で説明しましたが、ここで重要な点になります。点間の類似性をどのように判断するかです。

これはクラスタリングにおける最も重要な問題の 1 つであり、類似性を計算する一般的な方法は、これらのクラスターの重心間の距離を計算することです。最小距離を持つ点は類似点と呼ばれ、それらを結合することも、距離ベースのアルゴリズムと呼ぶこともできます。

階層的クラスタリングにも、各点間の距離を格納する近接行列と呼ばれる概念があります。以下では、類似度、近接行列、および階層的クラスタリングの具体的な手順を計算する方法を理解するために例を使用します。

ケースの紹介

教師が生徒をさまざまなグループに分けたいと考えているとします。課題の各生徒のスコアがわかったので、これらのスコアに基づいて生徒をグループに分けたいと思います。ここではグループの数について設定された目標はありません。教師はどのタイプの生徒をどのグループに割り当てるべきかわからないため、教師あり学習問題として解決することはできません。以下では、階層的クラスタリングを適用して学生をさまざまなグループに分類してみます。

以下は 5 人の学生の結果です:

階層的クラスタリングを 1 つの記事で理解する (Python コード)

近接行列の作成

まず、n 正方行列の形状を取得できるように、各点間の距離を保存する近接行列を作成する必要があります。 Xnの。

この場合、次の 5 x 5 の近接行列が得られます。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

行列には 2 つの注意点があります。

  • 点からの点までの距離が常に 0 であるため、行列の対角要素は常に 0 になります。
  • ユークリッド距離公式を使用して非対角要素の距離を計算します

たとえば、点 1 と点 2 の間の距離を計算したいとします。計算式は次のとおりです。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

同様に、この計算方法を完了した後、近接行列の残りの要素。

階層クラスタリングの実行

これは、凝集型階層クラスタリングを使用して実装されます。

ステップ 1: まず、すべてのポイントを 1 つのクラスターに割り当てます。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

ここでは、異なる色が異なるクラスターを表しており、そのうちの 5 つはデータ ポイントにあります。つまり、5 つの異なるクラスターが存在します。

ステップ 2: 次に、近接行列で最小距離を見つけて、最小距離の点を結合する必要があります。次に、近接行列を更新します。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

最小距離は 3 なので、ポイント 1 と 2 をマージします。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

# # 更新されたクラスターを見て、それに応じて近接行列を更新しましょう:

階層的クラスタリングを 1 つの記事で理解する (Python コード)

# 更新後、2 つの点 1 と 2 の間の最大値 (7, 10) を取得します。 2 を使用して、このクラスターの値を置き換えます。もちろん、最大値に加えて、最小値または平均値を取得することもできます。次に、これらのクラスターの近接行列を再度計算します。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

ステップ 3: クラスターが 1 つだけ残るまでステップ 2 を繰り返します。

すべての手順を繰り返すと、以下に示すようにマージされたクラスターが得られます。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

これが、凝集型階層クラスタリングの仕組みです。しかし問題は、いくつのグループに分けるべきかまだわからないということです。グループ 2、3、または 4 ですか?

まずはクラスターの数を選択する方法から始めましょう。

クラスターの数はどのように選択すればよいですか?

階層的クラスタリングのクラスター数を取得するために、デンドログラムと呼ばれる概念を使用します。

樹状図を使用すると、クラスターの数をより簡単に選択できます。

上の例に戻ります。 2 つのクラスターをマージすると、樹状図はこれらのクラスター間の距離を記録し、それをグラフィックで表します。以下は樹状図の元の状態です。横軸は各点のマークを記録し、縦軸は点間の距離を記録します。がクラスターの場合、それらは樹状図内で接続され、接続の高さがポイント間の距離になります。以下は、今実行した階層的クラスタリングのプロセスです。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

次に、上記のプロセスの樹形図の描画を開始します。サンプル 1 と 2 のマージから開始すると、これら 2 つのサンプル間の距離は 3 になります。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

1 と 2 がマージされていることがわかります。縦線は 1 と 2 の間の距離を表します。同様に、クラスターを結合するすべてのステップが階層的クラスター化プロセスに従って描画され、最終的に次のような樹形図が得られます。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

樹状図を使用すると、階層的クラスタリングのステップを明確に視覚化できます。樹形図の垂直線の間隔が離れるほど、クラスター間の距離は長くなります。

この樹状図を使用すると、クラスターの数を決定するのがはるかに簡単になります。

これで、距離のしきい値を設定し、水平線を描くことができます。たとえば、しきい値を 12 に設定し、次のように水平線を引きます。

階層的クラスタリングを 1 つの記事で理解する (Python コード)

交点からわかるように、クラスターの数は、水平線のしきい値と垂直線の量 (赤い線は 2 本の垂直線と交差します。クラスターは 2 つになります)。横軸に対応して、1 つのクラスターにはサンプル セット (1、2、4) が​​あり、もう 1 つのクラスターにはサンプル セット (3、5) があります。

このようにして、樹状図を通じて階層的クラスタリングにおけるクラスターの数を決定する問題を解決します。

Python コードの実践例

上記は理論的な基礎であり、数学的な基礎が少しあれば誰でも理解できます。 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'))
ログイン後にコピー

階層的クラスタリングを 1 つの記事で理解する (Python コード)

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='--')
ログイン後にコピー

階層的クラスタリングを 1 つの記事で理解する (Python コード)

2 つのクラスターがあるので、次のことが必要です。クラスターに階層クラスタリングを適用するには:

from sklearn.cluster import AgglomerativeClustering
cluster = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='ward')
cluster.fit_predict(data_scaled)
ログイン後にコピー

階層的クラスタリングを 1 つの記事で理解する (Python コード)

2 つのクラスターを定義したため、出力には 0 と 1 の値が表示されます。 0 は最初のクラスターに属する点を表し、1 は 2 番目のクラスターに属する点を表します。

plt.figure(figsize=(10, 7))
plt.scatter(data_scaled['Milk'], data_scaled['Grocery'], c=cluster.labels_)
ログイン後にコピー

階層的クラスタリングを 1 つの記事で理解する (Python コード)

この時点で、クラスタリングは正常に完了しました。

以上が階層的クラスタリングを 1 つの記事で理解する (Python コード)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

PythonインタープリターはLinuxシステムで削除できますか? PythonインタープリターはLinuxシステムで削除できますか? Apr 02, 2025 am 07:00 AM

Linux Systemsに付属するPythonインタープリターを削除する問題に関して、多くのLinuxディストリビューションは、インストール時にPythonインタープリターをプリインストールし、パッケージマネージャーを使用しません...

Pythonでのカスタムデコレータのパイランスタイプ検出の問題を解決する方法は? Pythonでのカスタムデコレータのパイランスタイプ検出の問題を解決する方法は? Apr 02, 2025 am 06:42 AM

Pythonプログラミングでカスタムデコレーターを使用する場合、Pylance Type検出問題解決策デコレーターは、行を追加するために使用できる強力なツールです...

Python 3.6のロードピクルスファイルエラーmodulenotfounderror:ピクルスファイル「__builtin__」をロードした場合はどうすればよいですか? Python 3.6のロードピクルスファイルエラーmodulenotfounderror:ピクルスファイル「__builtin__」をロードした場合はどうすればよいですか? Apr 02, 2025 am 06:27 AM

Python 3.6のピクルスファイルの読み込みエラー:modulenotfounderror:nomodulenamed ...

FastapiとAIOHTTPは同じグローバルイベントループを共有していますか? FastapiとAIOHTTPは同じグローバルイベントループを共有していますか? Apr 02, 2025 am 06:12 AM

Pythonの非同期ライブラリ間の互換性の問題Python、非同期プログラミングは、高い並行性とI/Oのプロセスになりました...

Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか? Python 3.6にピクルスファイルをロードするときに「__Builtin__」モジュールが見つからない場合はどうすればよいですか? Apr 02, 2025 am 07:12 AM

Python 3.6のピクルスファイルのロードレポートエラー:modulenotFounderror:nomodulenamed ...

Pythonの信号を介して親プロセスを殺した後に子プロセスも終了することを確認する方法は? Pythonの信号を介して親プロセスを殺した後に子プロセスも終了することを確認する方法は? Apr 02, 2025 am 06:39 AM

子どものプロセスを使用して親プロセスを殺すときに実行され続ける子プロセスの問題と解決策。 Pythonプログラミングでは、信号を通じて親のプロセスを殺した後、子のプロセスはまだ...

See all articles