6月になり2週目が終わろうとしています。全国的に梅雨入り宣言がされいよいよ雨が降り続く時期になります。さて洗濯物をどうしようか。。。
それはさておき今週も元気よく機械学習について書いていきたいと思います。
前回はクラスタリングについて書いていきましたが今回はその続きです。代表的なクラスタリングの手法としてk-meansを使った方法を書いていきました。
今回はk-means以外のクラスタリングの手法と特徴について書いていきます
①階層的クラスタリングと非階層的クラスタリング
そもそもクラスタリングの手法には大きく分けて2つにわけることができます。それが階層的クラスタリングと非階層的クラスタリングです。
まず階層的クラスタリングについて。名前の通りデータを階層的に分類していく方法です。手法としては、トップダウン的に分割する手法とボトムアップ的に分割する手法とに分けられます。
つぎに非階層的クラスタリングですが、階層を意識せず評価関数を定義することにより最適になるように分割する手法です。前回記載したk-meansがまさにこの方法です。
②階層的凝集型クラスタリング
階層的凝集型クラスタリングとはデータ1つがクラスタ1つに属する状態から始め、距離の近いクラスタ同士を併合し凝集させることで全データを必要数のクラスタにまとめる手法です。
それでは実装例を見ていきましょう
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import matplotlib.pyplot as plt from sklearn import cluster from sklearn import datasets from sklearn import metrics # iris データをロード iris = datasets.load_iris() data = iris['data'] # 学習 → クラスタの生成 model = cluster.AgglomerativeClustering(n_clusters=3, linkage='ward') model.fit(data) print(metrics.confusion_matrix(iris['target'], model.labels_)) |
前回同様irisデータを用いています。結果は
1 2 3 |
[[ 0 50 0] [49 0 1] [15 0 35]] |
となりました。前回とほとんど同じ精度でクラスタリングされていることがわかります。
③非階層的クラスタリング Affinity propagation
次にk-meansと同じ非階層的クラスタリングであるAffinity propagationについてです。Affinity propagationは近年提案された非階層的クラスタリングです。
k-meansよりも誤差が少なくクラスタ数をあらかじめ決めておく必要性がないこと、初期状態に依存しないことが特徴でありメリットです。
実装方法としては
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
import matplotlib.pyplot as plt from sklearn import cluster from sklearn import datasets from sklearn import metrics # iris データをロード iris = datasets.load_iris() data = iris['data'] # 学習 → クラスタの生成 model = cluster.AffinityPropagation() model.fit(data) print(metrics.confusion_matrix(iris['target'], model.labels_)) |
結果は
1 2 3 4 5 6 7 |
[[24 26 0 0 0 0 0] [ 0 0 21 25 4 0 0] [ 0 0 0 1 15 9 25] [ 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0] [ 0 0 0 0 0 0 0]] |
となりました。他と違い7つに分割され比較しにくいですが概ねクラス分けされているように思われます。
以上でクラスタリングについて2回に分けて紹介していきました。次回は何について書こうかな。。。