クラスタリングの意義と目的
昨日はクラスタリングの概要と scikit-learn を使って実際にクラスタリングをする流れを説明しました。
ここで基本に立ち返りそもそもクラスタリングとは何なのかを探っていきます。
多くの機械学習のアルゴリズムでは、特徴量 (素性) をベクトルで表現します。
線形代数では和とスカラー積が内部で定義されている集合をベクトル空間、その要素をベクトルと言います。
クラスタリングとはすごくざっくり言うと、特徴量同士がどれくらい似ているかを計算、似たものをグルーピングしようという方法です。
元データが文字だろうが画像だろうが、パターンを認識して特徴量に落とした時点で、教師となるデータを与えることなく、グルーピングができるようになるわけですね。
たとえば不特定多数のアンケート回答を似た者同士で寄せ集めたり、画像の肌色部分を抽出したり、などなど様々な技術に応用ができます。
類似度の算出
ここまで読んで、集合の類似度をいかに求めるかがクラスタリングの鍵であることがおわかりになったかと思います。
scikit-learn のチュートリアルに沿ってコードで説明してきます。
Clustering
labels_true = [0, 0, 0, 1, 1, 1]
labels_pred = [0, 0, 1, 1, 2, 2]
print ( metrics.adjusted_mutual_info_score(labels_true, labels_pred) )
# => 0.225042310598
labels_true = [0, 1, 2, 0, 3, 4, 5, 1]
labels_pred = [1, 1, 0, 0, 2, 2, 2, 2]
print ( metrics.adjusted_mutual_info_score(labels_true, labels_pred) )
# => -0.105263430575
labels_true = [0, 0, 0, 1, 1, 1]
labels_pred = [0, 0, 1, 1, 2, 2]
print ( metrics.homogeneity_score(labels_true, labels_pred) )
# => 0.666666666667
print ( metrics.completeness_score(labels_true, labels_pred) )
# => 0.420619835714
このように scikit-learn ではさまざまな類似度を求めることができることがわかります。
クラスタリング
では昨日のコードを利用して実際にクラスタリングを試してみます。
scikit-learn にはデータセットが用意されているのでこれをそのまま使います。
まずはデータセットの用意をします。
from sklearn import metrics
from sklearn.metrics import pairwise_distances
from sklearn import datasets
dataset = datasets.load_iris()
X = dataset.data
y = dataset.target
# 内容をちょっと覗き見してみる
print (X)
print (y)
昨日のコードでクラスタリングしてみましょう。
import numpy as np
from sklearn.cluster import KMeans
kmeans_model = KMeans(n_clusters=3, random_state=1).fit(X)
labels = kmeans_model.labels_
# ユークリッド距離を算出してみる
print ( metrics.silhouette_score(X, labels, metric='euclidean') )
# 昨日のコードを利用してクラスタリングをおこなう
clusters = make_cluster(X)
# 結果をファイルに出力する
write_cluster(clusters, 'out.txt')
# 生成したクラスタリングの内容を覗き見する
print ( clusters )
考察
強力なクラスタリングライブラリを利用することで、パターン認識により対象の素性さえ抽出してしまえば、簡単にグルーピングができ、それを様々な分野に応用できるということが言えます。