今度はMahoutでクラスタリング

Mahoutシリーズを最初から読む場合はこちらApache Mahoutで機械学習してみるべ - 都元ダイスケ IT-PRESS

さて、前回まではMahoutで「協調フィルタリングによるレコメンデーション」を解説してきました。まだレコメンドの処理をHadoopで分散させたりしていませんし、そのほかにもレコメンドにはまだまだ奥が深い世界があるのですが、ひとまずはここまでにしておきましょう。(分散レコメンドの話は、またしばらくしてから書きます。)

で、Mahoutは「協調フィルタリングライブラリ」じゃありません。機械学習ライブラリです。機械学習にも色々あるのですが、Mahoutでは大きく分けて以下の3つをサポートしています。


そして今日からはクラスタリングの話。

クラスタリング

クラスタリングとは何でしょうか。複数の要素を「クラスタ」と呼ばれるいくつかの集まりに分類することです。同じクラスタに属する要素同士は似ていて、異なるクラスタに属する要素は似ていない状態です。

例えば 1, 2, 30, 5, 35, 32, 4, 31 という数字の要素があったとして、それを「1, 2, 5, 4」と「30, 35, 32, 31」に分けるのが狭義のクラスタリングです。値が近い同士を同じクラスタに属させたわけですね。これを下のように数直線で表してみました。

上の例では、「要素」というのは「ただの数字」でした。次に、2次元平面(XYグラフ)上の点を要素として分類してみましょう。座標とそのグラフは以下の通り。下の表では既に「人間の感覚による答え」を出してしまいましたが、これはA〜C群にクラスタリングできます。グラフ上で距離が近い同士を同じクラスタに属させたわけです。(さらにここでは、整数じゃなくて小数でも大丈夫、ということがわかります。)

A群 (1, 1) (2, 1) (1, 1.8) (1.3, 1.2)
B群 (8.2, 6.6) (9.1, 7) (9, 7.4) (7.9, 7.7)
C群 (2, 9) (2, 7.7) (2.5, 7.8) (2, 7)

では、要素を3次元空間上の点としたらどうでしょうか? 座標とグラフは以下の通り。3次元グラフは視点が動いていないと見づらいので動画です。これも、座標を見ているだけでは関連性はなかなか見えて来ませんが、グラフにすると一目瞭然ですね。これもa〜c群にクラスタリングできるのです。(さらにここでは、要素の値は負数でも大丈夫ということがわかります。)

a群 (8, 8, 8) (8, 7.5, 9) (7.7, 7.5, 9.8)
b群 (0, 7.5, 9) (0.1, 8, 8) (-1, 9, 7.5)
c群 (9, -1, -0.8) (7.7, -1.2, -0.1) (8.2, 0.2, 0.2)

ここまで考えると、最初の数直線の世界というのは実は「1次元」だったのです。4次元以上は図示するのが難しいので説明は省きますが、この勢いで、いくらでも多次元の要素をクラスタリングできるのが感覚的に分かると思います。多次元の要素であっても、その2つの要素の距離を数値として出すことができるのです。これを「ユークリッド距離」と呼びます。

さらに、要素として今まで扱ってきた「括弧に囲まれた固定数個の数値の順序付きリスト」を「ベクトル」と呼びます。おっと、数学の時間に昔習いましたかね。あの矢印の奴。あれです。ただし、今はあんまり矢印として考えずに、やはりX次元座標上の一点とイメージしておいた方が良いと思います。

さてさて、狭義のクラスタリングはこんな感じ。で、広義には、「ある要素をベクトルに変換する」こともクラスタリングの分野に入ります。これを「ベクトル化」とか「vectorize」と呼んだりします。

例えば、大量の本をクラスタリングしたい場合、本自体は固定数個の数値の順序付きリストではありません。この本の分類の根拠になるような情報をベクトルの形で表現しないとクラスタリングはできないのです。

まぁ、ベクトル化の話はまた今度ということで。今日はベクトル化が終わった後の、狭義のクラスタリングです。ソースいきたいところですが、前置きが長くなっちまいましたので、続きは明日。