kmeans 関数の 'singleton' オプション
kmeans について何にも知らないのに、今回は kmeans について書いてみることにします。
Matlab では、kmeans 法を行う関数 kmeans() が準備されていて、
参考:Statistics and Machine Learning Toolbox Documentation
いろいろオプションも充実していて便利なようです。
kmeans() のアルゴリズムは、朱鷺の杜↓
k-means法 - 機械学習の「朱鷺の杜Wiki」
に書かれているのと多分同じなので、以後、このサイトの表記を使うことにします。
kmeans アルゴリズムを行うときは、セントロイドの初期値 *1 を決めなくてはいけないのですが、Matlab では、これをランダムにも手動ででも決めることが出来ます。
ただし、クラスターの種を変に設定すると、空のクラスターが出てくる場合があります。
クラスターが空になる例
1 次元ユークリッド直線上でクラスタリングを行う。
を 2 つのクラスターに分類する。
クラスターの種を
とする。
このとき、《kmeans アルゴリズムの 3》 を行うと、
上のどの点 においても、
なので、
は空集合になってしまう。
このままだと、《kmeans アルゴリズムの 2》で 0 で割り算をすることになってしまうので、通常はエラーとなってしまうのですが、「何とかしてクラスター数を減らさずに計算を続行したい!」というときのためのオプションが、タイトルにある 'singleton' オプションです。
kmeans([データ], [クラスター数], 'emptyaction', 'singleton' [ ,その他オプション])
とするだけです。
こうすると、空のクラスターがある空でないクラスターと入れ替わって、kmeans アルゴリズムが続行するのですが、恥ずかしながら最初は内部でどういう操作が行われているか全然意味が分かりませんでした。
マニュアルには
Action to take if a cluster loses all its member observations.
'singleton': Create a new cluster consisting of the one point furthest from its centroid.
と書かれてたんだけど、まず、『its centroid』がどれを指してるのか意味不明。
だから、『a new cluster consisting of the one point』がどれか良く分かっていませんでした。
『its centroid』ですが、ぼくは最初はてっきり、「空のクラスターのセントロイド」のことかと思ってました。
下図
(ここで、 は、 の種を表しています。初めて《kmeans アルゴリズムの 3》 を行った直後の状況です。)
で言うならば、『its centroid』とは、スッカラカンのクラスター の種 のことで、『そこから最も遠い点』というのは のことかと思っていました。
だから、この操作で、 が を から奪って、
となると思ってたんだけど、どうやらこういう意味ではないみたいです。
実際、この状況で、 とか とかを動かして計算してみると、結果が変わってくるので、「空のクラスターのセントロイドと、各点との距離」という問題ではない、ということが分かります。
それで、いろいろ観察してみたんですけど、多分こういうアルゴリズムを行っているんじゃないかと思います。
だから、上の図で言うならば、『the one point』は であり、この操作で、 が を から奪って、
となるわけです。
誤訳したぼくが悪いといえば全くその通りなんだけど、このマニュアルではやっぱり分かりにくいと思う。。