{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "g_uM06K2GVt3" }, "source": [ "# クラスタ分析" ] }, { "cell_type": "markdown", "metadata": { "id": "2LsQSkTwGVt-" }, "source": [ "## 概要" ] }, { "cell_type": "markdown", "metadata": { "id": "IMR9Fl8ZGVt_" }, "source": [ "- クラスタ分析は、教師なし学習に属する\n", "- 正しい答えが事前にわかっていないデータから隠れた構造を見つけ出す\n", "- データを自然なグループにまとめる方法を見つけ出す\n", "- クラスタリングのカテゴリ\n", " - プロトタイプベース\n", " - 階層的\n", " - 密度ベース\n", " - グラフベース(今回は説明しない)\n", " - Spectral clustering algorithm: 距離行列の固有ベクトルを使用する\n", "\n", "--- \n", " \n", "**scikit-learn で利用できるクラスタリングアルゴリズムの比較**\n", "\n", "\n", "\n", "https://scikit-learn.org/stable/modules/clustering.html#clustering\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "h2XH-cU-GVuA" }, "outputs": [], "source": [ "from IPython.display import Image\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": { "id": "IIU7S-WcGVuD" }, "source": [ "## k-means 法\n", "\n", "- プロトタイプベースクラスタリングの1つ\n", " - プロトタイプベースクラスタリングとは、各クラスタがプロトタイプによって表されることを意味する\n", " - プロトタイプは、セントロイド(中心)かメドイド(代表点)かのどちらか\n", "- 球状(または円状)のクラスタの識別に適している\n", "- クラスタの個数 k を指定する必要がある\n", "\n", "---\n", "\n", "### 計算の主要な手順\n", "\n", " 1. クラスタの中心(セントロイド)の初期値として、サンプル店から k 個をランダムに選ぶ\n", " 1. 各サンプルを最も近いセントロイドに割り当てる\n", " 1. 各クラスタに割り当てられたサンプルの中心を、そのクラスターの新しいセントロイドとする\n", " 1. サンプル点のクラスタへの割合が変化しなくなるか、ユーザー定義の許容値またはイテレーションの最大回数に達するまで、手順 \"2.\"、\"3.\" を繰り返す\n", "\n", "\n", "- サンプルとセントロイドの距離は、ユークリッド距離の2乗がよく用いられる\n", " - m 次元空間の 2 点 ${\\bf x}$ と ${\\bf y}$ のユークリッド距離の2乗は以下\n", "$$ d({\\bf x},{\\bf y})^{2}=\\sum ^{m}_{j=1}(x_{j}-y_{j})^2=||{\\bf x}-{\\bf y}|| ^2 $$\n", "- クラスタ内誤差平方和 (SSE) を最小化する問題\n", "$$ SSE=\\sum ^{n}_{i=1} \\sum ^{k}_{j=1} w^{(i,j)}||{\\bf x}^{(i)}-{\\bf \\mu}^{(j)}|| ^2 $$\n", " - n: サンプル数\n", " - k: クラスタ数\n", " - i: サンプルのインデックス\n", " - j: クラスタのインデックス\n", " - $\\mu^{(j)}$: クラスタjのセントロイド\n", " - $w^{(i,j)}$: サンプル点 ${\\bf x}^{(i)}$ がクラスタj に存在する場合は1、そうでない場合は0\n", "\n", "\n", "\n", "\n" ] }, { "cell_type": "markdown", "metadata": { "id": "p__O6JRyGVuD" }, "source": [ "### scikit-learn を使った K-means クラスタリング " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "G6VSPpHMGVuE" }, "outputs": [], "source": [ "# ダミーデータの作成\n", "from sklearn.datasets import make_blobs\n", "\n", "X, y = make_blobs(n_samples=150, \n", " n_features=2, \n", " centers=3, \n", " cluster_std=0.5, \n", " shuffle=True, \n", " random_state=0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "lI4Tr4qFGVuG", "outputId": "3e86265d-eb14-4996-bb69-2829b5ca95b2" }, "outputs": [ { "data": { "image/png": "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Pg4EAhgxYkTcqcNwwgVRIoygiCxAjzRzh8OB1157Le7jfOc731F8nPCAU1RUpHldTW3zscPhQG9vb9y1qnDCBVEiHKCILECPNPOqqip8+OGHKUUuNpsNo0aNSljtQouqqip8+umnaG9vV5w67O7uRmVlpaaCu5TfOEARpUBrRXOt9EgzLywsRG1tLd56662kHifclzNnzujSl8LCQuzatQuhUAhutxvLly9HfX09lixZgurqavz85z/H1KlT45Z00vq71ftvQNbDAYooSUbUzNMrzXzjxo1xkx6UHieyL0OGDNGt/l95eTlOnTqFrVu3QkqJrq4urFy5Eu+//z5+/vOfx61E0dLSoul3a/XDKkknSql96f4wzTw35Gvf1fqtJc06VbEp4C6XS9rtds1p5uH2Pfroo3L48OFy2rRpcuPGjXEfJ7Yv4X4bmQre0NAgXS6X4nXLly+XN954Y8LfrRF/A77WzQWmmROlz8iaeYk2ASeqzBCOKj766CPU1dVh3Lhx+OUvf4nJkycrJj2Yceij2lrbkCFDMHfu3ITtMfOwSsosppkTJcHomnnxagv6/X6sWLECX375JebNm4c5c+Zgz549ePzxx7F79+6BVHGl9PKamhps3Lgx6b74fD6cOHFC13Op1M7xOn78OO6///647Qn/bs06rJIyjxEUURLMOP48GAxi9erVKCgogM/nw2uvvYYNGzZg//79aGxsxIoVK/Dd734Xs2bNSiqqUOtLR0cHzp07p/v6jtpa25kzZ3D48GHF+0X+bnkEfR5RmvdL94drULkhX/tu1hpUPA0NDXLatGlx126WLFkib775ZllfX694/aZNm6TH4xl0udoaVHFxcVRf9OxfvLW2/fv3a/rdcg1KP1bpN+KsQXGKjygJZh2UqFaZoby8HEOGDFGNKpxO56DLY/tyzz33YMWKFWhra8O+ffui+qLncRpqlSi0/G7N+BuQOThAESUpUamfdAWDwYHHdjgcGDt2bMLKDJWVlXjiiSeSPqsqsi9SSoRCITz88MOKVST0XN+Jt9am9Xdr9N+ArEHzACWEGALgMIAzUsrlxjWJyPqMOihR6Th1v9+Py5cv4+TJk4oDUHd3N373u98NJErMnDkTs2fP1hxVhPvS1tYGl8sVN4khXiSmN62/20weVknmSCaC+jGAYwBGGNQWorymVjC2uroaX331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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# ダミーデータの分布を可視化\n", "import matplotlib.pyplot as plt\n", "\n", "plt.scatter(X[:, 0], X[:, 1], \n", " c='white', marker='o', edgecolor='black', s=50)\n", "plt.grid()\n", "plt.tight_layout()\n", "#plt.savefig('images/11_01.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "dZHpLBMWGVuJ" }, "outputs": [], "source": [ "# K-means\n", "from sklearn.cluster import KMeans\n", "\n", "km = KMeans(n_clusters=3, # クラスタの数\n", " init='random', # セントロイドの初期化の方法\n", " n_init=10, # 異なるセントロイド初期化を使った k-means の試行回数 --> 試行回数の中からベスト (SSEが最も小さい) なモデルを最終モデルとする\n", " max_iter=300, # 最大イテレーション回数\n", " tol=1e-04, # 収束判定のための相対的な許容誤差\n", " random_state=0) # セントロイドの初期化のためのランダムシード\n", "\n", "y_km = km.fit_predict(X)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "KaoHy8m_GVuM", "outputId": "8acd4f1b-6b93-4a14-e9e9-2c321e10c2bd" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# 結果の可視化\n", "plt.scatter(X[y_km == 0, 0],\n", " X[y_km == 0, 1],\n", " s=50, c='lightgreen',\n", " marker='s', edgecolor='black',\n", " label='cluster 1')\n", "plt.scatter(X[y_km == 1, 0],\n", " X[y_km == 1, 1],\n", " s=50, c='orange',\n", " marker='o', edgecolor='black',\n", " label='cluster 2')\n", "plt.scatter(X[y_km == 2, 0],\n", " X[y_km == 2, 1],\n", " s=50, c='lightblue',\n", " marker='v', edgecolor='black',\n", " label='cluster 3')\n", "plt.scatter(km.cluster_centers_[:, 0],\n", " km.cluster_centers_[:, 1],\n", " s=250, marker='*',\n", " c='red', edgecolor='black',\n", " label='centroids')\n", "plt.legend(scatterpoints=1)\n", "plt.grid()\n", "plt.tight_layout()\n", "#plt.savefig('images/11_02.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "yZ0nq2ZjGVuO" }, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": { "id": "fxT8qG5iGVuO" }, "source": [ "### よりスマートなセントロイドの初期化方法 : k-means++" ] }, { "cell_type": "markdown", "metadata": { "id": "0dh0mL22GVuP" }, "source": [ "- [sklearn.cluster.KMeans](https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html#sklearn.cluster.KMeans) の セントロイド初期化方法のデフォルト\n", "- 計算手順は以下\n", "1. 1つ目のセントロイドは、サンプルXの中からランダムに選ぶ\n", "1. 次のセントロイドを、以下の確率分布に従って選ぶ(既に選ばれたセントロイドより遠い位置の方が選ばれやすくなるように)\n", "$$\\dfrac {D\\left( x\\right) ^{2}}{\\sum _{x \\in X}D\\left( x\\right) ^{2}} $$\n", "1. \"2.\" の手順を k 個まで繰り返す\n", "\n", "Ref: \n", "Arthur, D., and S. Vassilvitskii. \"k-means++: the advantages of careful seeding, p 1027–1035.\" SODA'07: proceedings of the eighteenth annual ACM-SIAM symposium on discrete algorithms. Society for Industrial and Applied Mathematics, Philadelphia, PA. 2007." ] }, { "cell_type": "markdown", "metadata": { "id": "udWgdRQmGVuP" }, "source": [ "## ハードクラスタリングとソフトクラスタリング\n", "\n", "ここでは、紹介のみ(詳細な説明はしない)。\n", "\n", "- ハードクラスタリング\n", " - サンプルが所属するクラスタは1つのみ\n", " - 例:k-means\n", "- ソフトクラスタリング(ファジークラスタリング)\n", " - サンプルを1つ以上のクラスタに割り当てる\n", " - 例:\n", " - Fuzzy C-means (FCM)\n", " - Soft k-means (Fuzzy k-means)\n", "- FCM のイテレーションの計算コストは k-means より高いが、収束は k-means より早い\n", "- FCM は scikit-learn では実装されていない\n", " - FCM が実装されている Python ライブラリ\n", " - [scikit-fuzzy](https://pythonhosted.org/scikit-fuzzy/auto_examples/plot_cmeans.html)\n", " - [peach](https://code.google.com/archive/p/peach/)\n" ] }, { "cell_type": "markdown", "metadata": { "id": "QbbC6F-qGVuQ" }, "source": [ "### クラスタの最適な個数を決めるための指標(エルボー法)\n", "\n", "- k-means の課題である、クラスタの個数を事前に決めなければならない問題を解決かもしれない\n", "- エルボー法は、タスクに最適なクラスタの個数 k を推定できる\n", "- 横軸にクラスタの数、縦軸に得られたモデルのクラスタ内平方誤差(SSE)をプロットし、歪みが最も急速に増え始める k の値を特定する" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "id": "JZYvBOnPGVuQ", "outputId": "33561961-8ba5-4a8f-ba0f-f8a24309c0e0" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Distortion: 72.48\n" ] } ], "source": [ "# Distortion = SSE = kn.inertia_\n", "print('Distortion: %.2f' % km.inertia_)" ] }, { "cell_type": "markdown", "metadata": { "id": "B-_vKWUotnwn" }, "source": [ "以下のグラフのから、k = 3 が良い選択であるという根拠が得られる。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "pzwJzstAGVuT", "outputId": "7befdda5-11ed-4b81-fa9b-cb353a68013c" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "distortions = []\n", "for i in range(1, 11):\n", " km = KMeans(n_clusters=i, \n", " init='k-means++', \n", " n_init=10, \n", " max_iter=300, \n", " random_state=0)\n", " km.fit(X)\n", " distortions.append(km.inertia_)\n", "plt.plot(range(1, 11), distortions, marker='o')\n", "plt.xlabel('Number of clusters')\n", "plt.ylabel('Distortion')\n", "plt.tight_layout()\n", "#plt.savefig('images/11_03.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "-9XaQomwqsDD" }, "source": [ "> 実のところ、エルボー法は、そんなに良くは使われていない。 \n", "その理由の一つには、 実際にこれをクラスタの問題に 使ってみると、かなりしばしば、もっと曖昧な、曲線が得られる事がある。 \n", "明確なエルボーは無いように見える(ディストーションは連続的に低下していってるように見える)。 \n", "その場合はエルボー手法を使ってクラスタの数を決めるのはより難しい。 \n", "つまり簡単にエルボー法について要約すると、一発試してみる価値はある、だがどんな問題にもとてもうまくいく、などと期待はしない方がいい。\n", "\n", "Ref: [Andrew Ng先生の講義](https://www.coursera.org/learn/machine-learning)\n", "\n", "クラスタの個数を選ぶ別の方法は、どういう目的であなたが K-meansを実行しているのか、という事を問うてみる事だ。 \n", "たとえば、服のサイズを決めるためにヒトの身長と体重の分布をクラスタリングする場合、最終的に用意したいサイズの種類の数でクラスタリングする(S, M, L の3つ等)。" ] }, { "cell_type": "markdown", "metadata": { "id": "a5EkA4uKGVuX" }, "source": [ "## シルエット分析 (silhouette analysis) を使ってクラスタリングの性能を評価する\n" ] }, { "cell_type": "markdown", "metadata": { "id": "FTBuqcd4zCe4" }, "source": [ "- 各サンプルのシルエット係数を計算する" ] }, { "cell_type": "markdown", "metadata": { "id": "mNcA3vUnz1ap" }, "source": [ "1. 凝集度$a^{(i)}$: N個のサンプルを持つクラスタAのサンプル {$x^{(i)}|i \\in A$} と同じクラスタの別のサンプル{$x^{(j)}|j \\neq i,and,j \\in A$}との平均距離\n", "$$ a^{(i)}=\\sum_{j=1}^{N}\\frac{|x^{(i)}-x^{(j)}|}{N} $$\n", "1. 乖離度$b^{(i)}$: クラスタAのサンプル {$x^{(i)}|i \\in A$} とM個のサンプルを持つクラスタBのサンプル {$x^{(m)}|i \\in B$} との平均距離\n", "$$ b^{(i)}=\\sum_{m=1}^{M}\\frac{|x^{(i)}-x^{(m)}|}{M} $$\n", "1. シルエット係数$s^{(i)}$: クラスタの凝集度と乖離度の差を、それらの内の大きい方で割ったもの\n", "$$ s^{(i)}=\\frac{b^{(i)}-a^{(i)}}{max\\{b^{(i)},a^{(i)}\\}} $$\n", " - 値の範囲は、-1 から 1\n", " - b = a で 0\n", " - b >> a で 1 (理想的な値)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "aAZeTucQGVuY", "outputId": "2dc33435-7861-4ae5-bbca-84be8340f35b" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "from matplotlib import cm\n", "from sklearn.metrics import silhouette_samples\n", "\n", "km = KMeans(n_clusters=3, \n", " init='k-means++', \n", " n_init=10, \n", " max_iter=300,\n", " tol=1e-04,\n", " random_state=0)\n", "y_km = km.fit_predict(X)\n", "\n", "cluster_labels = np.unique(y_km)\n", "n_clusters = cluster_labels.shape[0]\n", "silhouette_vals = silhouette_samples(X, y_km, metric='euclidean')\n", "y_ax_lower, y_ax_upper = 0, 0\n", "yticks = []\n", "for i, c in enumerate(cluster_labels):\n", " c_silhouette_vals = silhouette_vals[y_km == c]\n", " c_silhouette_vals.sort()\n", " y_ax_upper += len(c_silhouette_vals)\n", " color = cm.jet(float(i) / n_clusters)\n", " plt.barh(range(y_ax_lower, y_ax_upper), c_silhouette_vals, height=1.0, \n", " edgecolor='none', color=color)\n", "\n", " yticks.append((y_ax_lower + y_ax_upper) / 2.)\n", " y_ax_lower += len(c_silhouette_vals)\n", " \n", "silhouette_avg = np.mean(silhouette_vals)\n", "plt.axvline(silhouette_avg, color=\"red\", linestyle=\"--\") \n", "\n", "plt.yticks(yticks, cluster_labels + 1)\n", "plt.ylabel('Cluster')\n", "plt.xlabel('Silhouette coefficient')\n", "\n", "plt.tight_layout()\n", "#plt.savefig('images/11_04.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "fGqgWSgQ70Xe" }, "source": [ "- 赤の点数は、シルエット係数の平均値" ] }, { "cell_type": "markdown", "metadata": { "id": "4AlKFxPbGVua" }, "source": [ "以下は、悪いクラスタリングの例 (k = 5)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 382 }, "id": "SxPJQxR7GVub", "outputId": "8bebbd5b-f7af-48c5-c266-a3b46d7c103e" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0\n", "1\n", "2\n", "3\n", "4\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAAEYCAYAAAAJeGK1AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOyde1yUZfr/389wxsEDeEDFA4JnAU3SSir113YQz5XTbgdrbffbYcvNNNEsrTWzsrZaO7l0UFtXsjYrNbO2LKdNCw95whQUBYwUURkEQZj798c4IzDPHJlhZuB+v16+gGeeeea+B3muue77c30uRQiBRCKRSCT+hsbXA5BIJBKJRA0ZoCQSiUTil8gAJZFIJBK/RAYoiUQikfglMkBJJBKJxC8J9sZF27dvL3r27OmNSzc5586do1WrVr4ehk9oqXOX8255tNS5+8u8t2/fXiKE6NDwuFcCVM+ePcnOzvbGpZuczZs3M3LkSF8Pwye01LnLebc8Wurc/WXeiqIcVTsul/gkEolE4pfIACWRSCQSv0QGKIlEIpH4JV7Zg5JIJJLmxIULFygsLOT8+fO+HopHadOmDTk5OU32euHh4cTFxRESEuLU+TJASSQSiQMKCwuJioqiZ8+eKIri6+F4DIPBQFRUVJO8lhCCU6dOUVhYSHx8vFPPkUt8EolE4oDz588TExPTrIJTU6MoCjExMS5loTKDkkicxGAwkJWVRV7eIRISeqPT6Vz69NnY50t8iwxOjcfV91BmUBKJE+j1enrFdyVr+SOUFb5A1vJH6BXfFb1e3yTPl9THYDCQmZnJnNkZZGZmYjAYfD0kiReQGZRE4gCDwcCkiWN4eno5VwxRAAWoYOtOwaSJYziSfxytVuu150vqo9frmZg+jkGhMSTURPJDcAUZj85i7frPSEtL8/XwmpQFCxag1WqZOXOmS887c+YMq1at4s4772zU6x85coTbbruNU6dOMXToUFauXEloaGijrlkXmUFJJA7IyspicH9xMbhc4oohCoP7C7Kysrz6fG9SNxMpKSnx+0zEYDAwMX0csyNSmK9N5Y62A5ivTWV2RAoT08dRXl7u6yEC/p/hnTlzhtdff92l5wghMBqN9Y7Nnj2bRx55hNzcXNq1a8fbb7/tyWHKACWROCIv7xB9ep5TfaxPz3Pk5eV69fneQq/XEx/XnffnLObEsg2UFhUTH9fdr5cds7KyGBQaQ2pEbL3jqRGxDAqN8WmwN9PwfX1/zmKPvK8rVqwgOTmZlJQU1cxn5MiRFou5kpISzH6o+/btY9iwYQwePJjk5GQOHTpERkYGeXl5jBgxglmzZgHwwgsvcPnll5OcnMz8+fMByM/Pp2/fvtx1110MGjSIgoICy+sJIfj666+55ZZbAJg6dSpr165t1BwbIpf4JBIHJCT0JkvfCqiweuxgfituG5no1ed7g7qZiPlmX66JtGQi+UUFfrnsmHcol4SaSNXHetVEkJfrm2BvRu19BciuLG7U+7pv3z4WLlzI//73P9q3b09paanTz33zzTeZPn06t99+O9XV1dTW1rJ48WL27t3L999/T1RUFJs2beLQoUP8+OOPCCEYP3483333Hd27d+fQoUMsX76cK664ot51T506Rdu2bQkONoWRuLg4ioqKXJ6bPWQGJZE4QKfTsStHYetOUe/41p2CXTkKOp3Oq8/3BoGQiaiR0DuRvGDrQA9wOLiShMSmD/Z18db7+vXXX3PrrbfSvn17AKKjo51+7pVXXsmiRYt47rnnOHr0KBEREVbnbNq0iU2bNjFkyBAuu+wyDhw4wKFDhwDo0aOHVXBqKmQGJZE4ICoqio/XbmDSxDEM7i/o0/McB/NbsStH4eO1Gxx+Im7s872Bv2cittDpdGQ8OovsymKrDGVv9SmfBPu6+PJ9DQ4OtuwR1a01+sMf/sDw4cNZv349Y8aM4a233qJXr171niuEYM6cOfzf//1fveP5+fk223HExMRw5swZampqCA4OprCwkK5du3p0TjKDkkicIC0tjSP5x7nt7pdp0202t939MkfyjzutGmvs8z2Nv2citoiKimLt+s94rvJnnirPZuWZfTxVns1zlT+zdv1nPl+W9Nb7Onr0aNasWcOpU6cAVJf4evbsyfbt2wH48MMPL73u4cP06tWLhx9+mAkTJrB7926ioqLqCTduuOEG3nnnHYvIpKioiBMnTtgdk6IojBo1yvJay5cvZ8KECW7NzxYyg5JInESr1TJt2jSfPd+T+HsmYo+0tDTyiwpMRc+5uYxITESn0/k8OIH33teBAwfy+OOPc+211xIUFMSQIUN477336p0zc+ZMpkyZwrJly0hPT7cc/+CDD1i5ciUhISHExsYyd+5c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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# クラスター数の指定\n", "k = 5\n", "\n", "km = KMeans(n_clusters=k, \n", " init='k-means++',\n", " n_init=10,\n", " max_iter=300,\n", " tol=1e-04,\n", " random_state=0)\n", "y_km = km.fit_predict(X)\n", "\n", "# create an array of colors in python\n", "# ref: https://stackoverflow.com/questions/7827530/array-of-colors-in-python\n", "from random import randint\n", "colors = []\n", "for i in range(k):\n", " colors.append('#%06X' % randint(0, 0xFFFFFF))\n", "\n", "for i in range(k):\n", " print(i)\n", " plt.scatter(X[y_km == i, 0],\n", " X[y_km == i, 1],\n", " s=50,\n", " c=colors[i],\n", " edgecolor='black',\n", " marker='o',\n", " label='cluster ' + str(i))\n", "\n", "plt.scatter(km.cluster_centers_[:, 0], km.cluster_centers_[:, 1],\n", " s=250, marker='*', c='red', label='centroids')\n", "plt.legend()\n", "plt.grid()\n", "plt.tight_layout()\n", "#plt.savefig('images/11_05.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "p91VUIliGVud", "outputId": "e6a3fd51-ef12-47a3-a757-35d3018076d0" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "cluster_labels = np.unique(y_km)\n", "n_clusters = cluster_labels.shape[0]\n", "silhouette_vals = silhouette_samples(X, y_km, metric='euclidean')\n", "y_ax_lower, y_ax_upper = 0, 0\n", "yticks = []\n", "for i, c in enumerate(cluster_labels):\n", " c_silhouette_vals = silhouette_vals[y_km == c]\n", " c_silhouette_vals.sort()\n", " y_ax_upper += len(c_silhouette_vals)\n", " color = cm.jet(float(i) / n_clusters)\n", " plt.barh(range(y_ax_lower, y_ax_upper), c_silhouette_vals, height=1.0, \n", " edgecolor='none', color=color)\n", "\n", " yticks.append((y_ax_lower + y_ax_upper) / 2.)\n", " y_ax_lower += len(c_silhouette_vals)\n", " \n", "silhouette_avg = np.mean(silhouette_vals)\n", "plt.axvline(silhouette_avg, color=\"red\", linestyle=\"--\") \n", "\n", "plt.yticks(yticks, cluster_labels + 1)\n", "plt.ylabel('Cluster')\n", "plt.xlabel('Silhouette coefficient')\n", "\n", "plt.tight_layout()\n", "#plt.savefig('images/11_06.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "VG76jedmGVue" }, "source": [ "- クラスタごとのシルエット係数とサンプル数(水平棒グラフの長さと幅)が、大きく異なっており、最適なクラスタリングではないことを示している。" ] }, { "cell_type": "markdown", "metadata": { "id": "jp203KbrGVuf" }, "source": [ "## 階層木 (hierarchical tree) \n", "\n", "- 階層的クラスタリングによって樹形図(dendrogram)をプロットできる\n", " - 二分木の階層的クラスタリングを可視化\n", "- 2つのアプローチ\n", " - 凝集型(agglomerative)(ボトムアップ方式)\n", " - 小さなクラスタをマージして大きなクラスタを作成していく\n", " - 分割型(divisive)(トップダウン方式) \n", " - 1つのクラスタから小さなクラスタに分割していく\n" ] }, { "cell_type": "markdown", "metadata": { "id": "uCgr494ZGVuf" }, "source": [ "### 凝集型階層的クラスタリング(ボトムアップ方式)\n", "\n", "- 標準アルゴリズム\n", " - 単連結方\n", " - 最も類似度の高いメンバーどうしの距離が最小になるように2つのクラスタをマージ\n", " - 完全連結法\n", " - 最も類似度の低いメンバーどうしの距離が最小になるように2つのクラスタをマージ\n", "\n", "今回は、「完全連結法に基づく凝集型階層的クラスタリング」に焦点をあてて説明する。\n", "\n", "---\n", "\n", "### 完全連結法に基づく凝集型階層的クラスタリングの主要な手順\n", "\n", "1. すべてのサンプルのデータ点を、単一のクラスタとみなす\n", "1. 全てのクラスタの距離行列(最も距離の離れたメンバー間の距離)を計算する\n", "1. 手順 2 で計算した距離に基づいて、2つの最も近いクラスターをマージする\n", "1. 距離行列を更新する\n", "1. クラスターが1つになるまで、手順 3, 4 を繰り返す\n" ] }, { "cell_type": "markdown", "metadata": { "id": "k-OYml3HBNlv" }, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "id": "9RF8tgwcGVuh", "outputId": "944010fe-2fc9-46c4-f0ab-8486dbd741dd" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
XYZ
ID_06.9646922.8613932.268515
ID_15.5131487.1946904.231065
ID_29.8076426.8482974.809319
ID_33.9211753.4317807.290497
ID_44.3857220.5967793.980443
\n", "
" ], "text/plain": [ " X Y Z\n", "ID_0 6.964692 2.861393 2.268515\n", "ID_1 5.513148 7.194690 4.231065\n", "ID_2 9.807642 6.848297 4.809319\n", "ID_3 3.921175 3.431780 7.290497\n", "ID_4 4.385722 0.596779 3.980443" ] }, "execution_count": 90, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# ダミーデータの作成\n", "# 特徴量は 3 つ\n", "\n", "import pandas as pd\n", "import numpy as np\n", "\n", "np.random.seed(123)\n", "\n", "variables = ['X', 'Y', 'Z']\n", "labels = ['ID_0', 'ID_1', 'ID_2', 'ID_3', 'ID_4']\n", "\n", "X = np.random.random_sample([5, 3])*10\n", "df = pd.DataFrame(X, columns=variables, index=labels)\n", "df" ] }, { "cell_type": "markdown", "metadata": { "id": "qWuZeH3-GVuk" }, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": { "id": "vD5zDmZKGVuk" }, "source": [ "### 階層木クラスタリングの実行" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 204 }, "id": "9Q2N59sTGVul", "outputId": "882894db-f6c5-4677-98c7-45222ae528bc" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
ID_0ID_1ID_2ID_3ID_4
ID_00.0000004.9735345.5166535.8998853.835396
ID_14.9735340.0000004.3470735.1043116.698233
ID_25.5166534.3470730.0000007.2442628.316594
ID_35.8998855.1043117.2442620.0000004.382864
ID_43.8353966.6982338.3165944.3828640.000000
\n", "
" ], "text/plain": [ " ID_0 ID_1 ID_2 ID_3 ID_4\n", "ID_0 0.000000 4.973534 5.516653 5.899885 3.835396\n", "ID_1 4.973534 0.000000 4.347073 5.104311 6.698233\n", "ID_2 5.516653 4.347073 0.000000 7.244262 8.316594\n", "ID_3 5.899885 5.104311 7.244262 0.000000 4.382864\n", "ID_4 3.835396 6.698233 8.316594 4.382864 0.000000" ] }, "execution_count": 53, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "from scipy.spatial.distance import pdist, squareform\n", "\n", "# 特徴量 X, Y, Z のユークリッド距離を求める \n", "row_dist = pd.DataFrame(squareform(pdist(df, metric='euclidean')),\n", " columns=labels,\n", " index=labels)\n", "# 距離行列\n", "row_dist\n", "\n", "# Ref: https://docs.scipy.org/doc/scipy/reference/spatial.distance.html" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 227 }, "id": "7p5EXGRjGVuo", "outputId": "40be177b-71d5-4194-eb6a-b553eb03d724" }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:4: ClusterWarning: scipy.cluster: The symmetric non-negative hollow observation matrix looks suspiciously like an uncondensed distance matrix\n", " after removing the cwd from sys.path.\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
row label 1row label 2distanceno. of items in clust.
cluster 10.04.06.5219732.0
cluster 21.02.06.7296032.0
cluster 33.05.08.5392473.0
cluster 46.07.012.4448245.0
\n", "
" ], "text/plain": [ " row label 1 row label 2 distance no. of items in clust.\n", "cluster 1 0.0 4.0 6.521973 2.0\n", "cluster 2 1.0 2.0 6.729603 2.0\n", "cluster 3 3.0 5.0 8.539247 3.0\n", "cluster 4 6.0 7.0 12.444824 5.0" ] }, "execution_count": 55, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# linkage 関数の間違った使い方: 正方距離行列\n", "# 詳しくは、 https://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.hierarchy.linkage.html#scipy.cluster.hierarchy.linkage を参照。\n", "\n", "from scipy.cluster.hierarchy import linkage\n", "\n", "row_clusters = linkage(row_dist, method='complete', metric='euclidean')\n", "pd.DataFrame(row_clusters,\n", " columns=['row label 1', 'row label 2',\n", " 'distance', 'no. of items in clust.'],\n", " index=['cluster %d' % (i + 1)\n", " for i in range(row_clusters.shape[0])])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 173 }, "id": "AEymToGTGVuq", "outputId": "9d0fc464-f736-433b-e2fe-87b3e6d2123d", "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
row label 1row label 2distanceno. of items in clust.
cluster 10.04.03.8353962.0
cluster 21.02.04.3470732.0
cluster 33.05.05.8998853.0
cluster 46.07.08.3165945.0
\n", "
" ], "text/plain": [ " row label 1 row label 2 distance no. of items in clust.\n", "cluster 1 0.0 4.0 3.835396 2.0\n", "cluster 2 1.0 2.0 4.347073 2.0\n", "cluster 3 3.0 5.0 5.899885 3.0\n", "cluster 4 6.0 7.0 8.316594 5.0" ] }, "execution_count": 56, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# linkage 関数の正しい使い方 1: 圧縮された距離行列(上三角のみの1次元配列)\n", "\n", "row_clusters = linkage(pdist(df, metric='euclidean'), method='complete')\n", "pd.DataFrame(row_clusters,\n", " columns=['row label 1', 'row label 2',\n", " 'distance', 'no. of items in clust.'],\n", " index=['cluster %d' % (i + 1) \n", " for i in range(row_clusters.shape[0])])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 173 }, "id": "NmNO0S3ZGVus", "outputId": "384bbc69-8c0a-4816-9703-c0430b2646f9" }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
row label 1row label 2distanceno. of items in clust.
cluster 10.04.03.8353962.0
cluster 21.02.04.3470732.0
cluster 33.05.05.8998853.0
cluster 46.07.08.3165945.0
\n", "
" ], "text/plain": [ " row label 1 row label 2 distance no. of items in clust.\n", "cluster 1 0.0 4.0 3.835396 2.0\n", "cluster 2 1.0 2.0 4.347073 2.0\n", "cluster 3 3.0 5.0 5.899885 3.0\n", "cluster 4 6.0 7.0 8.316594 5.0" ] }, "execution_count": 15, "metadata": { "tags": [] }, "output_type": "execute_result" } ], "source": [ "# linkage 関数の正しい使い方 2: 距離行列を作成する前の特徴量(サンプル数 x 次元数の2次元配列)\n", "\n", "row_clusters = linkage(df.values, method='complete', metric='euclidean')\n", "pd.DataFrame(row_clusters,\n", " columns=['row label 1', 'row label 2',\n", " 'distance', 'no. of items in clust.'],\n", " index=['cluster %d' % (i + 1)\n", " for i in range(row_clusters.shape[0])])" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "nmepSykkGVuu", "outputId": "e422042c-d650-4d1f-9aff-25518cf9a108" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# デンドログラム(樹形図)の作成\n", "from scipy.cluster.hierarchy import dendrogram\n", "\n", "# make dendrogram black (part 1/2)\n", "# from scipy.cluster.hierarchy import set_link_color_palette\n", "# set_link_color_palette(['black'])\n", "\n", "row_dendr = dendrogram(row_clusters, \n", " labels=labels,\n", " # make dendrogram black (part 2/2)\n", " # color_threshold=np.inf\n", " )\n", "plt.tight_layout()\n", "plt.ylabel('Euclidean distance')\n", "#plt.savefig('images/11_11.png', dpi=300, \n", "# bbox_inches='tight')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "TUiPAY86GVuw" }, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": { "id": "_lx5xCr1GVux" }, "source": [ "### デンドログラムとヒートマップを合わせて表示する\n", "\n", "- 樹形図とヒートマップは組み合わせて示されることが多い\n", "- ヒートマップは個々のサンプルの特徴量の値を示している\n", "- 特徴量の値と類似度の関係を視覚化できる\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 397 }, "id": "pTQ7EOqIGVux", "outputId": "eb9ee669-9128-4736-a7a7-b9b7eaf06bfd" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [] }, "output_type": "display_data" } ], "source": [ "# plot row dendrogram\n", "fig = plt.figure(figsize=(8, 8), facecolor='white')\n", "axd = fig.add_axes([0.09, 0.1, 0.2, 0.6]) # x 軸の位置、y 軸の位置、幅、高さ \n", "\n", "# 樹形図を 90 度回転\n", "# note: for matplotlib < v1.5.1, please use orientation='right'\n", "row_dendr = dendrogram(row_clusters, orientation='left')\n", "\n", "# 特徴量のサンプルの順序を、クラスタリング結果に従って変更する\n", "# reorder data with respect to clustering\n", "df_rowclust = df.iloc[row_dendr['leaves'][::-1]]\n", "\n", "# 樹形図の ticks を削除\n", "axd.set_xticks([])\n", "axd.set_yticks([])\n", "\n", "# remove axes spines from dendrogram\n", "for i in axd.spines.values():\n", " i.set_visible(False)\n", "\n", "# plot heatmap\n", "axm = fig.add_axes([0.23, 0.1, 0.6, 0.6]) # x-pos, y-pos, width, height\n", "cax = axm.matshow(df_rowclust, interpolation='nearest', cmap='hot_r')\n", "fig.colorbar(cax)\n", "axm.set_xticklabels([''] + list(df_rowclust.columns))\n", "axm.set_yticklabels([''] + list(df_rowclust.index))\n", "\n", "#plt.savefig('images/11_12.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "DQTRHnOy571F" }, "source": [ "特徴量を見ると、たしかに、ID_1 と ID_2 のサンプルが似ているということがわかる。" ] }, { "cell_type": "markdown", "metadata": { "id": "Q-SYN4XMGVu1" }, "source": [ "### scikit-learn を使った凝集型階層的クラスタリング\n", "\n", "- クラスタの数を指定することができる(階層クラスタ木の剪定)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "id": "c5n3c37IGVu1", "outputId": "06cdb70d-b4b8-48ad-f8b6-b6fe1f88675a" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cluster labels: [1 0 0 2 1]\n" ] } ], "source": [ "from sklearn.cluster import AgglomerativeClustering\n", "\n", "# クラスタ数 3\n", "ac = AgglomerativeClustering(n_clusters=3, # クラスタの個数\n", " affinity='euclidean', \n", " linkage='complete')\n", "labels = ac.fit_predict(X)\n", "print('Cluster labels: %s' % labels)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 34 }, "id": "pZKYGVDTGVu4", "outputId": "a5fc5733-0672-4dfa-836b-4d255141c7ed" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Cluster labels: [0 1 1 0 0]\n" ] } ], "source": [ "# クラスタ数 2\n", "ac = AgglomerativeClustering(n_clusters=2, \n", " affinity='euclidean', \n", " linkage='complete')\n", "labels = ac.fit_predict(X)\n", "print('Cluster labels: %s' % labels)" ] }, { "cell_type": "markdown", "metadata": { "id": "IsDSALyu-IYN" }, "source": [ "ラベルを見ると、たしかに、指定したクラスタ数で選定されていることがわかる。" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 298 }, "id": "iYf72NmU8BKj", "outputId": "2939abd8-ef95-4ae5-a3d9-a7c62d836f38" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# scikit-learn を使ったデンドログラムのプロット\n", "# Ref: https://scikit-learn.org/stable/auto_examples/cluster/plot_agglomerative_dendrogram.html#sphx-glr-auto-examples-cluster-plot-agglomerative-dendrogram-py\n", "import numpy as np\n", "\n", "from matplotlib import pyplot as plt\n", "from scipy.cluster.hierarchy import dendrogram\n", "from sklearn.datasets import load_iris\n", "from sklearn.cluster import AgglomerativeClustering\n", "\n", "\n", "def plot_dendrogram(model, **kwargs):\n", " # Create linkage matrix and then plot the dendrogram\n", "\n", " # create the counts of samples under each node\n", " counts = np.zeros(model.children_.shape[0])\n", " n_samples = len(model.labels_)\n", " for i, merge in enumerate(model.children_):\n", " current_count = 0\n", " for child_idx in merge:\n", " if child_idx < n_samples:\n", " current_count += 1 # leaf node\n", " else:\n", " current_count += counts[child_idx - n_samples]\n", " counts[i] = current_count\n", "\n", " linkage_matrix = np.column_stack([model.children_, model.distances_,\n", " counts]).astype(float)\n", "\n", " # Plot the corresponding dendrogram\n", " dendrogram(linkage_matrix, **kwargs)\n", "\n", "# for iris data set\n", "# iris = load_iris()\n", "# X = iris.data\n", "\n", "# setting distance_threshold=0 ensures we compute the full tree.\n", "# in this case, n_clusters must be \"None\"\n", "# model = AgglomerativeClustering(distance_threshold=0, n_clusters=None)\n", "\n", "model = AgglomerativeClustering(n_clusters=None, \n", " affinity='euclidean', \n", " linkage='complete',\n", " distance_threshold=0)\n", "\n", "model = model.fit(X)\n", "plt.title('Hierarchical Clustering Dendrogram')\n", "# plot the top three levels of the dendrogram\n", "plot_dendrogram(model, truncate_mode='level', p=3)\n", "plt.xlabel(\"Number of points in node (or index of point if no parenthesis).\")\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "eG1alCnwGVu7" }, "source": [ "## 密度ベースのクラスタリング (DBSCAN)\n", "\n", "### DBSCAN: Density-based Spatial Clustering of Applications with Noise\n", "\n", "- 指定された半径 $\\epsilon$ 以内に存在する点の個数を「密度」と定義する\n", "- 半径 $\\epsilon$ 以内の隣接店の個数が MinPts に少なくとも指定された個数(MinPts)の隣接点があるような点は Core point とラベル付けする\n", "- Core point の条件には当てはまらないが、Core point の半径 $\\epsilon$ 以内に位置する点を Border point とラベル付けする\n", "- Core point でも Border point でもない点は、Noise point とラベル付けする\n" ] }, { "cell_type": "markdown", "metadata": { "id": "f6Yj_8pu_Y0o" }, "source": [ "" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "4HG9x6WfGVu9", "outputId": "34df9e70-2dcb-43d8-d2e4-65ac8ad688b0" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "# 半月状に分布したダミーデータを作成する\n", "from sklearn.datasets import make_moons\n", "\n", "# 100 個ずつの2グループを作成し、ノイズをのせる\n", "X, y = make_moons(n_samples=200, noise=0.05, random_state=0)\n", "plt.scatter(X[:, 0], X[:, 1])\n", "plt.tight_layout()\n", "#plt.savefig('images/11_14.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "PCv8JiD-GVu-" }, "source": [ "#### k-means と 階層的クラスタリング" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 225 }, "id": "zTulZHpdGVu_", "outputId": "e2101810-a0f0-4c48-82df-215c47fc5dc0" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "f, (ax1, ax2) = plt.subplots(1, 2, figsize=(8, 3))\n", "\n", "km = KMeans(n_clusters=2, random_state=0)\n", "y_km = km.fit_predict(X)\n", "ax1.scatter(X[y_km == 0, 0], X[y_km == 0, 1],\n", " edgecolor='black',\n", " c='lightblue', marker='o', s=40, label='cluster 1')\n", "ax1.scatter(X[y_km == 1, 0], X[y_km == 1, 1],\n", " edgecolor='black',\n", " c='red', marker='s', s=40, label='cluster 2')\n", "ax1.set_title('K-means clustering')\n", "\n", "ac = AgglomerativeClustering(n_clusters=2,\n", " affinity='euclidean',\n", " linkage='complete')\n", "y_ac = ac.fit_predict(X)\n", "ax2.scatter(X[y_ac == 0, 0], X[y_ac == 0, 1], c='lightblue',\n", " edgecolor='black',\n", " marker='o', s=40, label='cluster 1')\n", "ax2.scatter(X[y_ac == 1, 0], X[y_ac == 1, 1], c='red',\n", " edgecolor='black',\n", " marker='s', s=40, label='cluster 2')\n", "ax2.set_title('Agglomerative clustering')\n", "\n", "plt.legend()\n", "plt.tight_layout()\n", "# plt.savefig('images/11_15.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "gNngKocXGVvC" }, "source": [ "#### 密度ベースのクラスタリング" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 297 }, "id": "baGEzQa5GVvC", "outputId": "b9e0dafc-de83-4309-e632-62a6261a3b7f" }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light", "tags": [] }, "output_type": "display_data" } ], "source": [ "from sklearn.cluster import DBSCAN\n", "\n", "db = DBSCAN(eps=0.2, min_samples=5, metric='euclidean')\n", "y_db = db.fit_predict(X)\n", "plt.scatter(X[y_db == 0, 0], X[y_db == 0, 1],\n", " c='lightblue', marker='o', s=40,\n", " edgecolor='black', \n", " label='cluster 1')\n", "plt.scatter(X[y_db == 1, 0], X[y_db == 1, 1],\n", " c='red', marker='s', s=40,\n", " edgecolor='black', \n", " label='cluster 2')\n", "plt.legend()\n", "plt.tight_layout()\n", "#plt.savefig('images/11_16.png', dpi=300)\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": { "id": "9-cdxkZHDlIW" }, "source": [ "k-means と階層的クラスタリングより、DBSCANの方が半月状に分布したデータをうまくクラスタリングできていることがわかる。\n", "\n", "- DBSCAN のメリット\n", " - クラスタが球状でなくても良い\n", " - クラスタ数を指定なくても良い\n", " - DBSCAN 自体にノイズ点を除去する能力がある\n", "- DBSCAN のデメリット\n", " - 2つのハイパーパラメータ、MinPts と $\\epsilon$ を最適化する必要がある\n", " - クラスター間で密度の違いがある場合は、適用が難しい\n" ] }, { "cell_type": "markdown", "metadata": { "id": "vS68Jsg3GVvE" }, "source": [ "
\n", "
" ] }, { "cell_type": "markdown", "metadata": { "id": "E1YWaNOpGVvE" }, "source": [ "## まとめ" ] }, { "cell_type": "markdown", "metadata": { "id": "4_Q7mldHGVvF" }, "source": [ "- 以下の3つのカテゴリのクラスタリング手法を紹介した\n", " - プロトタイプベース(k-means)\n", " - 階層的(完全連結法に基づく凝集型階層的クラスタリング)\n", " - 密度ベース(DBSCAN)\n", "- 特徴量の次元が増えるとクラスタリング性能に悪影響を与えるため、PCA等の次元削減を行うのが一般的" ] }, { "cell_type": "markdown", "metadata": { "id": "r3k7ap7fJuK_" }, "source": [ "## References\n", "\n", "1. [[第2版]Python機械学習プログラミング 達人データサイエンティストによる理論と実践](https://book.impress.co.jp/books/1117101099) , Code Repository: https://github.com/rasbt/python-machine-learning-book-2nd-edition\n", "1. [Andrew Ng先生の講義](https://www.coursera.org/learn/machine-learning)\n", "1. [scikit-learn](https://scikit-learn.org/stable/)\n", "1. [k-means++](http://ilpubs.stanford.edu:8090/778/1/2006-13.pdf)" ] }, { "cell_type": "markdown", "metadata": { "id": "7RZpvdaKLe9g" }, "source": [ "## Appendices\n", "\n", "様々なクラスタリング手法の比較\n", "\n", "https://gist.github.com/hnishi/f7bc10bd7d94da14507aab00096869fd\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "anaconda-cloud": {}, "colab": { "collapsed_sections": [], "include_colab_link": true, "name": "da_handson_clustering.ipynb", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.0" } }, "nbformat": 4, "nbformat_minor": 1 }