接続制約付き階層的クラスタリング

Machine LearningMachine LearningBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、PythonのScikit-learnライブラリを使って、接続制約付きの階層的クラスタリングを行う方法を示します。階層的クラスタリングでは、クラスタは相互間の距離に基づいて再帰的にマージまたは分割することによって形成されます。接続制約は、データポイント間の接続性に基づいてクラスタの形成を制限するために使用でき、より意味のあるクラスタをもたらすことができます。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebookを使って練習しましょう。

時々、Jupyter Notebookが読み込み終了するまで数秒待つ必要がある場合があります。Jupyter Notebookの制限により、操作の検証を自動化することはできません。

学習中に問題に遭遇した場合は、Labbyにお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/neighbors("Nearest Neighbors") sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/neighbors -.-> lab-49331{{"接続制約付き階層的クラスタリング"}} sklearn/cluster -.-> lab-49331{{"接続制約付き階層的クラスタリング"}} sklearn/datasets -.-> lab-49331{{"接続制約付き階層的クラスタリング"}} ml/sklearn -.-> lab-49331{{"接続制約付き階層的クラスタリング"}} end

データの生成

まず、Scikit-learnのmake_swiss_roll関数を使ってスイスロールデータセットを生成します。スイスロールデータセットは、渦巻き形状の3次元データセットです。

from sklearn.datasets import make_swiss_roll

n_samples = 1500
noise = 0.05
X, _ = make_swiss_roll(n_samples, noise=noise)
## Make it thinner
X[:, 1] *= 0.5

非構造化階層的クラスタリング

接続制約なしで階層的クラスタリングに属する凝集型クラスタリング(AgglomerativeClustering)を行います。

from sklearn.cluster import AgglomerativeClustering

ward = AgglomerativeClustering(n_clusters=6, linkage="ward").fit(X)
label = ward.labels_

非構造化階層的クラスタのプロット

matplotlibライブラリを使って、非構造化階層的クラスタをプロットします。

import matplotlib.pyplot as plt

fig1 = plt.figure()
ax1 = fig1.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
    ax1.scatter(
        X[label == l, 0],
        X[label == l, 1],
        X[label == l, 2],
        color=plt.cm.jet(float(l) / np.max(label + 1)),
        s=20,
        edgecolor="k",
    )

構造化階層的クラスタリング

Scikit-learnのkneighbors_graph関数を使って、10個の近傍点を持つk近傍法(k-Nearest Neighbors)を定義します。

from sklearn.neighbors import kneighbors_graph

connectivity = kneighbors_graph(X, n_neighbors=10, include_self=False)

接続制約付きで再び凝集型クラスタリング(AgglomerativeClustering)を行います。

ward = AgglomerativeClustering(
    n_clusters=6, connectivity=connectivity, linkage="ward"
).fit(X)
label = ward.labels_

構造化階層的クラスタのプロット

matplotlibライブラリを使って、構造化階層的クラスタをプロットします。

fig2 = plt.figure()
ax2 = fig2.add_subplot(111, projection="3d", elev=7, azim=-80)
for l in np.unique(label):
    ax2.scatter(
        X[label == l, 0],
        X[label == l, 1],
        X[label == l, 2],
        color=plt.cm.jet(float(l) / np.max(label + 1)),
        s=20,
        edgecolor="k",
    )

まとめ

この実験では、PythonのScikit-learnライブラリを使って接続制約付きの階層的クラスタリングを行う方法を示しました。まず、スイスロールデータセットを生成し、非構造化階層的クラスタリングを行いました。次に、10個の近傍点を持つk近傍法を定義し、構造化階層的クラスタリングを行いました。最後に、matplotlibライブラリを使って非構造化および構造化階層的クラスタをプロットしました。