個人的なSVMへの理解。

個人的にはこんな感じで理解している。
間違っていたらごめんねー。

境界を決める

10円から10000円まであります。
あなたは道でお金を落としたとします。
いくらまでなら我慢できますか?いくら以上は悲しいですか?

10円 50円 100円 500円 1000円 5000円 10000円

いろんな人に聞いてみる。

Aさん:俺は1000円が基準、1000円以上は悲しい。逆に500円までなら我慢できる。

なるほど。Aさんは1000円以上は悲しいらしい。
よって、基準はこうなる。

10円 50円 100円 500円 |Aさん基準| 1000円 5000円 10000円

この基準により、基準より左側の金額だったら悲しくない。
100円落としても悲しくないし、50円落としても悲しくない。

逆に、基準の右側では悲しい。
5000円落としても悲しいし、10000円落としても悲しい。

別の人にも聞いてみる。

Bさん:私は100円未満までしか我慢できない。

少しケチなBさんは、100円までしか我慢できないだった場合と答えた。
グラフにすると、このようになる。

10円 50円 |Bさん基準| 100円 500円 1000円 5000円 10000円

これにより、Bさんは10円落としても悲しくない。
逆に500円落とすと悲しいし、1000円落としても悲しいことが一目で分かる。

ようするに、基準の線を決めることで、悲しいか、悲しくないかを決めることができる。

軸を増やす

ただ、落として悲しくないかはその人の年収や環境によっても変わるだろう。
そこでもう一つ軸を加えて、給料日まであと何日というのを加えてみた。

給料日まであと何日
     |
当日 |                                ・
     |
20日 |                        ・
     |
10日 |             ・
     |
 5日 |      ・
     |
--------------------------------------------------------
       10円 50円 100円 500円 1000円 5000円 10000円  落としたら悲しい金額

これで二次元の図になりました。
これでこの人が 5000円落としたとしても、給料日当日だったら、それほど悲しくないことが分かります。リッチメンめっ。
逆に給料日前は100円落としただけでも悲しいようです。

で、先ほどのように悲しいか悲しくないかを分ける基準を引きます。
この場合、悲しいか悲しくないかを分ける基準は、二次元なので線分になります。
点の最初と最後をつなげて線を引いてみます。

給料日まであと何日
     |
当日 |                              /・
     |                          /
20日 |                      / ・
     |                   /
10日 |                /
     |             /・ 
 5日 |        ・/
     |       /
--------------------------------------------------------
       10円 50円 100円 500円 1000円 5000円 10000円  落としたら悲しい金額

これで、お金を落としたと彼が言ったきたら、金額と給料日までの日数からグラフを見れば、彼が悲しいのか悲しくないのか、だいたい分かります。
線分の左側だと悲しくないわけですし、右側だと悲しいわけです。


もちろん、給料日だけが因子ではないですよね。たとえば住宅ローンや子供の養育費などでたくさんお金を払っているなどの外的要因があります。
それを軸に加えると、今度は、三次元(住宅ローンの残金)、四次元(子供の養育費)のグラフを描くことができます。
三次元だと、基準線は平面になり、四次元だと、四次元なのでよくわからない何かwになります。

とにかく、、大切なのことは基準の線を引いてしまえば、判別は可能であるということです。
これを応用して、さまざまなものの基準の線を引くことができます。

コンピュータに引かせる

この基準の線をデータからコンピュータに計算させて引かせることができたら便利だと思いますせんか?

以下のようなデータがあったとします。
データAのグループとデータBのグループを分ける基準の線はどこでしょうか?

     |
     |       A              A 
     |       
     |   A       A                 B
     |                            
     |       A               B
     |                              B
     |   A           B          B
     |      
--------------------------------------------------------

多分、こんな感じの線分になります。

     |
     |       A              A     /
     |                          /
     |   A       A          /       B
     |                   /          
     |       A        /      B
     |              /               B
     |   A      /    B          B
     |      /
--------------------------------------------------------

これって何か計算で出せそうな気がしますよね?
これをいいように計算してくれるのがSVMです。

さまざまなデータをあげてあげると、そのデータを解析し、どこが基準なのかを考えて、基準の線を引いてくれます。
なんかいろいろなデータを分類できそうですね。

上の例では、二次元だから分離するのは線ですが、三次元だと面になります。
で、この基準の線のことを超平面といいます。

カーネル関数で次元を超える

上の例ではきれいに分かれてくれましたが、現実は結構複雑です。
たとえば、このようなデータを分けるにはどうすればいいでしょうか?

     |
     |       A              A        A
     |       
     |   A       B       B          A
     |            B     B           
     |       A   B            A
     |              B  B              A
     |   A           A          A
     |      
--------------------------------------------------------

これは単純な線ではわけならなさそうですね。
どうすれば、、、、と、いう問題を解く前に、別のことを考えます。

AさんとBさんが廊下を歩いています。
それぞれ左右に移動しようとしています。

Aさん→                   ←Bさん
--------------------------------
      廊下

Aさんは右に移動します。
Bさんは左に移動します。
このままではAさんとBさんは、ぶつかってしまいます。

どうやったらぶつからずに廊下を移動できますか?


答え:横によければOK。

   ----------------------------------
  /                        ←Bさん /
 /                                /
/  Aさん→                       /
--------------------------------
      廊下

横(奥く)によければ、AさんとBさんはぶつからずに移動できます。

横(X軸)移動しかない一次元だと、どうやってもAさんとBさんはぶつかっていました。
そこで、もう一つ軸を追加して、奥行きを加えて二次元すればAさんとBさんはぶつからずに移動できました。

ようするに、、、その次元では無理でも、もっと高次元で考えれば問題を解決することができるかもしれないということです。


で、先ほどの例を考えます。

     |
     |       A              A        A
     |       
     |   A       B       B          A
     |            B     B           
     |       A   B            A
     |              B  B              A
     |   A           A          A
     |      
--------------------------------------------------------

これをAとBに分類する基準の線(超平面)を引くにはどうればいいんでしょうか?
二次元だとどうやっても線を引くことができません。
だったら、さきほどのAさんとBさんのすれ違いの例のように、もっと高次元で考えればいいのです。

                  /
                /  |                           
              /    |                           
            /      |    A                      
         /         | A                         
       /           |     A                     
     /             A                           
     |             |                           
     |           A |--------------------------
     |              /                         /
     |            /                        /
     |          /              B    B      /
     |        /                   B       /
     |      /                 B         /
     |    /                 B          /
     |  /                             /
     |/                             /
     ----------------------------/
     図が下手でごめんね。

これなら分類のする基準の線(三次元なので面)が引けそうですね。
で、こんな感じに別次元の空間にマッピングしてくれるのがカーネル関数です。

カーネル関数を利用すると、座標に特定の計算式を追加することで、もう一つの次元を作り出し、問題を解きやすくします。

これにより、一見解けなさそうな問題を解くことができるようになります。(無理な場合もあるけど)

で、これらをコンピュータにいいようにやらせるのがSVMです。
具体的な計算式とかは高度すぎて、?な私にはさっぱり理解できません。
ですが、世の中、親切な人がいて、libsvmというのがあります。これを利用するとうまく計算してくれるようです。
http://www.csie.ntu.edu.tw/~cjlin/libsvm/

ライセンスは独自ライセンスですが、修正BSDライセンス互換だそうですので、非オープンソースな製品にも組み込めます。

http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html
翻訳はgoogle翻訳w

■Q: I would like to use libsvm in my software. Is there any license problem?
■A:
The libsvm license ("the modified BSD license") is compatible with many free software licenses such as GPL.
Hence, it is very easy to use libsvm in your software. It can also be used in commercial products.

■Q: 私はソフトウェア私のlibsvmのを使用することが好きです。 問題があるが任意のライセンス?
■A:
libsvmのライセンスは、("修正済みBSDライセンス")はGPLのような多くのフリーソフトウェアライセンス互換性があります。 したがって、それはソフトウェアですあなたのlibsvmのを使用して、非常に簡単です。それができる製品には商業で使用されるもされる。

いい時代になったもんですなー。