間違いがありました…。
先日書いた kmeans() 関数についての記事ですが、
kmeans 関数の 'singleton' オプション - ひらのの日記
間違いがありました。。すいません。
何も考えずにこう書いちゃったのですが↓
kmeans() のアルゴリズムは、朱鷺の杜↓
k-means法 - 機械学習の「朱鷺の杜Wiki」
に書かれているのと多分同じなので、以後、このサイトの表記を使うことにします。
実は Matlab だと、朱鷺の杜でいうところの「3」のアルゴリズムが微妙に違ってて、距離に "重み付け" がなされています。
誤:
全てのデータ を,各クラスタのセントロイド との距離 を最小にするクラスタ へ割り当てる
正: *1
データ を,(クラスター に対し定義される) 以下の評価関数 を最小にするクラスター へ割り当てる.
( は のセントロイドとする. )
ここで, は以下のように定義される.
ソースコードを見たので、多分間違ってないと思うんだけど、、間違ってたら訂正します。
ぼくのような素人から見ると、ややこしいことやってるな〜と思うけど、こうやって、評価関数が、
設定されることで、所属するクラスターの変更が頻繁に起きるようになる、というメリットがあるのではないか…と個人的には思っています。
この 2 つの方法で結果が違ってくる例はいくらでも作ることが出来て、1 次元の場合でも、次のような例があります。
例
1 次元ユークリッド空間上に 4 点 , , , を取り、 とする。
を、2 つのクラスター , に分ける。
ここで、 の種 、 の種 とする。
このとき、クラスタリングの実行結果は以下のように異なってくる。
- 「朱鷺の杜」版:,
- Matlab 版:,
…それにしても、、こういうアルゴリズムって統一できないものなのでしょうかねぇ?
(もしくは、「違うことやってる!」ということがちゃんと分かる名前にするとか。)
「Kmeans」といったときに、人によっててんでばらばらのアルゴリズムを指している、というのはちょっとヤバイんじゃないか…と思います。
何となく、「宇治茶」騒動を連想してしまいます。
参考:宇治茶 - Wikipedia