Sideswipe

情報工学、計算論的神経科学など、真面目なこと書くブログ。お仕事の話は Twitter: @kazoo04 にお願いします。

教師なし学習

これは 人工知能アドベントカレンダー の12日目の記事です。

前回は機械学習の大まかな解説をしました。今回はそのうちの教師なし学習(unsupervised learning)について詳しく見ていきましょう。

教師なし学習とはなにか

教師なし学習は、学習対象のデータはあるが、それが何かという正解(文脈によってはラベル、教師信号ともいう)は与えられていないので、どうにかしてなにかしらの構造や法則を見出すための手法です。

大抵の場合、クラスタリング系のアルゴリズムを扱うことが多いので、ここでもクラスタリングを中心にします。

クラスタリングとはなにか

クラスタリング(clustering)は機械学習に限らずによく使われる言葉なので親しみやすいかと思います。
簡単に言えば、与えられたデータに対して、似たような物をまとめる処理です*1

たとえば、以下の図を見てください。いくつかの図形が書いてありますね。このひとつひとつをデータだと思ってください。データには普通複数の属性(attribute)があります。ここでいえば、パッと見でも色と形の属性がありそうです。

f:id:kazoo04:20151211211020p:plain

この図形をクラスタリング、つまりグループわけしてくださいと言われたら、どのようにしますか?これには正解がありませんよね。なにしろ何を基準にしてグループ分けすればいいのかもわからないし、いくつのグループに分けるのかもわからないからです。以下のようにいろいろなわけかたが考えられます。

f:id:kazoo04:20151211211030p:plain

Aは色で3つに分けたもの、Bは形で3つにわけたものです。これがそこそこ妥当な感じがします。でも分け方はほかにもいろいろ考えられます。Cは「丸いかどうか(角があるかどうか)」で分けたものですし、Dは「図の下のほうに描かれているかどうか」で分けたものです。なんでもアリですね。でも分け方の基準がないのだから、仕方ありません。

このように、クラスタリングは正解がわからないデータに対して、どのような法則があるかを見やすくする*2ことが目的であって、どう解釈されるかはまた別の話になります。

言い換えると、クラスタリングのためにはなにかしらの前提を設ける必要があります。この場合だと、たとえば「どのグループも同じ数だけの図形が含まれるようにする」という条件を設けることによって、Bの分類方法が妥当だということになります。

代表的な方法

k-means

k-meansは非常に広い分野で用いられているアルゴリズムで、クラスタリングの代表格です。派生アルゴリズムもたくさんあります。

k-meansは、「どのクラスタも同じくらいの個数のデータが含まれる」ことを前提においている*3ため、この条件にそぐわないデータを分析しようとするとメチャクチャな結果になることもあるのですが、それでもよく用いられています。

以下のようなデータを考えます。XとY軸があって、点がいくつかあります。これをクラスタリングしてみましょう。

f:id:kazoo04:20151211215543p:plain

先に正解を言ってしまうと、これは左下と右下にそれぞれ100個ずつ点をある程度バラけさせて生成したものなので、

f:id:kazoo04:20151211215648p:plain

このようになります。妥当な感じに分割されました。これはよく出来たパターンですが、実際には次のようにうまく分割できないこともあります*4

f:id:kazoo04:20151211215733p:plain

また、そもそもk-meansはいくつのクラスタに分けるのかは予め人間が指定しなければいけないので、たとえば以下のランダムに生成したデータでも、クラスタ数を6と指定すれば無理矢理にでも6個に分割します*5

f:id:kazoo04:20151211215859p:plain

k-meansは一見簡単そうなのにうまく分類できないパターンがたくさんあることが欠点の一つです。この理由の一つは、k-meansは理論的に似たグループをまとめるときに、円で囲うようにしてまとめていくことが原因です。

f:id:kazoo04:20151211220556p:plain

上の図を見てください。左のケースでは、両方のクラスタをうまく円で囲むことができ、きちんとクラスタリングできています。真ん中のケースでは、中央にある青いデータは円で囲めるのですが、赤のデータもかこおうとすると青のクラスタを飲み込んでひとつのクラスタになってしまうのでうまくいきません。右のケースも同様で、青いデータはいいのですが赤いデータを囲おうとするとやはり青いデータと被るのでうまくいきません(この場合は、左右や上下に無理矢理分けてクラスタリングされることになる)。

こういったときには、カーネル(kernel)という方法を使ってk-meansする方法*6や、DBSCANなど囲み方が円でなくてもいい方法を使うことになりますが、どの手法も一長一短あり最強の手法はありません*7

おわりに

今回は簡単ではありますが、教師なし学習とはなにか、また教師なし学習の一手法であるk-meansによるクラスタリングについて触れました。次回は教師あり学習について見ていきましょう。

*1:もうすこしだけ詳しく言うと、同じグループ内のデータはお互いに似ていて、別のグループのデータはお互いに似ていないようにデータを分割すること

*2:見やすくするといっても、「人間がわかりやすい形にする」場合と「機械が処理しやすい形にする」場合がある

*3:この書き方はあまり正確ではない。詳しく言うなら、クラスタの形状が超球状になり、どのクラスタもその半径が同じくらいになる

*4:この例では、クラスタに含まれるデータの数が大きく異なるので失敗している

*5:クラスタ数も自動的に推定するアルゴリズムもある

*6:kernel法は様々なアルゴリズムに応用されている非常に強力な手法だが、理論が難しいのでここでは触れない

*7:たとえば人間が決めなければならない値(パラメータ)が更に増える、時間がかかる、メモリ消費量が多い、など