k-Meansの概要
k-Meansは教師なし学習の一つであり、あらかじめ指定された数にグループを分ける。
例えば今身長である程度まとまって席に座っている生徒を考えます。k-Meansでは最初に分けるグループ数のみ指定されています。これを例えば3とします。
一回目のサイクルは以下のように始まります。
- k-Meansは最初にクラス内の適当な場所に旗を3つ立てます。
- この旗に生徒をすべての所属させます。所属方法は生徒と旗の距離から計算します。
- 次に所属している生徒すべての中心となる点を探しここに旗を移します。
2回目のサイクルは以下の陽なります
- 移った旗の位置に従って生徒の所属を変えます。大部分の生徒は同じ旗に残ることが予測されますが、何人かの生徒は移動します。
- 移動が終わったら新たに中心となる点を探しここに旗を移します。
3回目以降は2回目のサイクルを繰り返します。旗が移動しなくなるあるいはあらかじめ指定されたより移動しなくなれば終了です。この時点で旗に所属している状態によりクラスタリングをします。
Expectations – Maximization
E-Step : データを最も近い中心点に割り当てる
M-Step : クラスタの中心をデータの中心点に割り当てる
k-Means法のデメリット
最初のランダムポイントによっては最適解を得られない可能性がある。
- 最初の選択位置が理想とするクラスタの位置とは異なる場合、例えば同じクラスタに複数の中心が入るなど、最適なクラスタを得られない可能性がある。
- 複数のランダムシードでクラスタリングを実施する
クラスタ数を指定する必要がある
- あらかじめクラスタ数を指定する必要がある。
- クラスタ数の指定にはデータの可視化もしくは何らかの方法によりクラスタ数を予測しなければならない。
- しかしそもそもクラスタ数が予測できるならば、データの割り当てもk-Meansによらなくてよい
複雑なクラスタには向いてない
- データの境界が複雑になっている場合には良い結果にはならない
- カーネル化したk-Meansを利用する
データ数に比例して時間が極端に遅くなる
- 試行のたびにすべてのデータについて計算をする。
- データが増えるとそのまま処理にかかる時間も増える。
- ミニバッチを利用する(クラスタ内の一部のデータを利用して中心を更新する)
k-Means on Digits
クラスタリング自体は正しい数値ラベルを持たないで、各クラスタのデータからラベルを付けなおす必要がある
from scipy.stats import mode # 値が0の10次元のリスト labels = np.zeros_like(clusters) for i in range(10): mask = (clusters == i) # 0~9のクラスタについてTrue, Falseリスト labels[mask] = mode(digits.target[mask])[0] # digits.target[mask]で該当マスクのデータをすべて取得 # modeで最頻値を取得 # リスト0番目に最頻値が入っている # labelを正しい数値で付け替える
検証方法のステップ
- 正解率からモデルの信頼度を確認する
- 混同行列から間違いに傾向があるかを確認する
k-Means on Color Compression
RGBから生成される色は16million通りある。これはR=255, G=255, B=255であるからRGBの組み合わせは255*255*255=16581375となる。
しかし実際にRed/Gree, Red/Blueを見てみると使っている使っている色は対角線上に集まっている。プロットがないスペースが広くみられる。これより色を集約できると考えられる。
k-Meansにより16色まで減らしてみる。画面右上の青~青白が不自然に境界が出ていることがわかる。
実際のイメージで確認すると空の部分が不自然に境界ができている。しかし他の部分は16色まで減らしても不自然さは感じられない。