MeanShiftによって、データをクラスタリング解析する手法を、実装・解説します。
本シリーズでは、Pythonを使用して機械学習を実装する方法を解説します。
各アルゴリズムの数式だけでなく、その心、意図を解説していきたいと考えています。
本記事ではMeanShift・Clusteringを実装します。
MeanShiftはクラスター数が分からない場合に、データをクラスターに分類する手法です。
複数のガウス分布を仮定して、各データがどのガウス分布に所属するのかを決定し、クラスター分析します。
以下のscikit-learnマップの黒矢印に対応します。
教師なしデータ→クラスター数不明→サンプル数1万以下→[MeanShift・Clustering]
です。
MeanShift・Clusteringの実装
本記事では、ワインの分類データでMeanShiftを実装します。
まずは、実際のデータ、kMeansによる分類(クラスター数を3と規定)、MeanShift・Clusteringによる分類の結果を見てみます。
上図、真ん中のKMeansは中心点(★)からの距離でクラスターが決まります。
一方で、MeanShiftでの結果はクラスター数が2となり、中心点は(★)の位置となりました。
クラスター数を未知にしており、実際とは異なる結果となりました。
実装コードは以下の通りです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | # 1:ライブラリのインポート-------------------------------- import numpy as np #numpyという行列などを扱うライブラリを利用 import pandas as pd #pandasというデータ分析ライブラリを利用 import matplotlib.pyplot as plt #プロット用のライブラリを利用 from sklearn import cluster, preprocessing, mixture #機械学習用のライブラリを利用 # 2:Wineのデータセットを読み込む-------------------------------- df_wine_all=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None) #品種(0列、1~3)と色(10列)とプロリンの量(13列)を使用する df_wine=df_wine_all[[0,10,13]] df_wine.columns = [u'class', u'color', u'proline'] pd.DataFrame(df_wine) #この行を実行するとデータが見れる # 3:データの整形------------------------------------------------------- X=df_wine[["color","proline"]] sc=preprocessing.StandardScaler() sc.fit(X) X_norm=sc.transform(X) # 4:プロットしてみる------------------------------------------ %matplotlib inline x=X_norm[:,0] y=X_norm[:,1] z=df_wine["class"] plt.figure(figsize=(10,10)) plt.subplot(3, 1, 1) plt.scatter(x,y, c=z) plt.show # 5:k-meansを実施--------------------------------- km=cluster.KMeans(n_clusters=3) z_km=km.fit(X_norm) # 6: 結果をプロット----------------------------------------------- plt.subplot(3, 1, 2) plt.scatter(x,y, c=z_km.labels_) plt.scatter(z_km.cluster_centers_[:,0],z_km.cluster_centers_[:,1],s=250, marker='*',c='red') plt.show # 解説7:MeanShiftを実施--------------------------------- ms = cluster.MeanShift(seeds=X_norm) ms.fit(X_norm) labels = ms.labels_ cluster_centers = ms.cluster_centers_ print(cluster_centers) # 8: 結果をプロット----------------------------------------------- plt.subplot(3, 1, 3) plt.scatter(x,y, c=labels) plt.plot(cluster_centers[0,0], cluster_centers[0,1], marker='*',c='red', markersize=14) plt.plot(cluster_centers[1,0], cluster_centers[1,1], marker='*',c='red', markersize=14) plt.show |
解説7の部分が新しいので解説します。
ms = cluster.MeanShift(seeds=X_norm)
MeanShiftは、おおざっぱにはKMeansをクラスター数を仮定せずに行う手法です。
その際に規定の距離より近くなったクラスターは合体させて1つにしてしまいます。
ここでseedsは最初のクラスターを決めており、最初は各データを中心とするデータ数分のクラスターを用意しています。
ここで規定の距離が非常に重要になり、デフォルトで計算されますが、自分で設定することもできます。
それでは「結局、MeanShift・Clusteringって何をやっていたの?」を説明します。
MeanShift・Clusteringの心
正確な情報は以下をご覧ください。
MeanShift・Clusteringは教師なし学習の一種です。
データを自動的にクラスターに分けます。
その際にいくつのクラスターが存在するのかを、指定せずにクラスタリングします。
その方法は上で説明したとおり、KMeansをベースとしつつ、近いクラスターはまとめていきます。
個人的には、MeanShiftは大雑把すぎて好きではないです。
次に紹介するVBGMMの方が良いです。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第12回:MeanShiftでのクラスター分析でした。
次回は、VBGMMについて解説します。