クラスタリング

sklearnとmatplotlibでsihoutte係数を見てみようとして失敗した話とyellowbrick

投稿日:


sihoutteって何て読むのか...と思うけども"シルエット"だそう。フランス語源。
ポートレート写真を背景白、顔を黒に減色した例の"シルエット"。"輪郭"みたいな。

データ達を複数のクラスタに分割したとして、各々のデータがそのクラスタに存在することの
収まりの良さを表すことができる。
本来(相対的に)他のクラスタに属しているべきデータ達の割合が分かったり、
クラスタ境界で(相対的に)どちらのクラスタに属しても良さそうなデータ達の割合が分かったりする。

sklearnは教師なしクラスタリングまでで、それをグラフ化しないといけないのだけど、
matplotlibに対応するのがなく、"線を書く"みたいなコマンドを並べて作っていかないといけない様子。
yellowbrickというパッケージを使うとそれもやってくれる。

Yellowbrick is a suite of visual diagnostic tools called “Visualizers” that extend the Scikit-Learn API to allow human steering of the model selection process. In a nutshell, Yellowbrick combines scikit-learn with matplotlib in the best tradition of the scikit-learn documentation, but to produce visualizations for your models!

sklearnとmatplotloibだけで出力するバージョンと、yellowbrickで出力するバージョンの
両方を試してみた(前者はクラスタのラベルを出力できずsihoutteグラフとの対応関係が理解できずに
中途半端で終了)。

sihoutte係数

全データ達は\(x_i\)。データ\(x_i\)がクラスタ\(A\)に属し、最近傍にクラスタ\(B\)があるという状況。
\(A\)のクラスタ中心は\(x_A\)、\(B\)のクラスタ中心は\(x_B\)。
"最近傍のクラスタ中心との距離の平均"から"自分のクラスタ中心との距離の平均"を引いた値。
わざわざ1行に全ての変数が出てくるように書いてみる。
\begin{eqnarray}
s_i = \frac{\sum_{i=1}^{n}|x_i-x_B|/n - \sum_{i=1}^{n}|x_i-x_A|/n }{max \bigl\{\sum_{i=1}^{n}|x_i-x_A|/n,\sum_{i=1}^{n}|x_i-x_B|/n \bigr\}}
\end{eqnarray}

データが\(n\)個あるので、sihoutte係数も\(n\)個できる。
自分が属しているクラスタ\(A\)よりも、隣のクラスタ\(B\)の方が居心地が良いと
分子はマイナスになる。

今属しているクラスタでも隣のクラスタでも、どちらもさほど居心地が変わらないとゼロ近辺になる。
大きければ迷いなく今のクラスタで良いことを表せる。

sklearnとmatplotlibだけでsihoutte係数

乱数で作った偽データに6-meansをかけた図。
どうやってもクラスタ中心のラベルが取り出せない!!..(スルー..)

sklearnとmatplotlibだけでsihoutte係数のグラフを出してみる。
"線を書く"みたいなコマンドを並べて規格通りの図を作るのか...。

全体的に茶色のクラスタのsilhouette係数が低め。
残念ながら、どのクラスタと対応するのか出力できず何の考察も出来ず...。

yellowbrickでsilhouette係数を出力

無茶苦茶簡単に出せる。

出てきた図。自作したものと全然合っていないように見える..
自作したものとラベルが合っていないだけだと信じたい。
似た形の塊があるので..

以上、完全な失敗だけれども一旦終了...

-クラスタリング
-

Copyright© ikuty.com , 2019 AllRights Reserved Powered by AFFINGER4.