サポートベクターマシンをMATLABとCで

サポートベクターマシンSupport Vector Machine:SVM)をMATLABでコーディングしてみよう!!
こまったらここ>http://www.neuro.sfc.keio.ac.jp/~masato/study/SVM/demo.htm
まずは線形SVMにとりかかります.

線形SVMのコーディング

データのプロット

まずはデータのプロットの仕方をおさらいします

%num=10
%X1=randn(2, num) + 2*ones(2,num)
%X2=randn(2, num) - 2*ones(2,num)
%plot(X1(1,:),X1(2,:), '.b',X2(1,:),X2(2,:), 'xr')

とかやるとこんな分布をするデータが出来ます.
randn関数使っているので微妙に違うだろうけど,右上に青丸10個,左下に赤い×が10個出来ると思う.
非常に線形分離しやすい分布になっているでしょう.


マージン最大化

そもそも線形サポートベクターマシンが解きたい問題についてもう一度おさらいしよう.

N次元のデータ集合があります.その集合をx={xi}としましょう.
それぞれのxiにはyiというその事例がどのクラスに所属しているかという,まぁラベルみたいなのが与えられているとします.yiは1か-1の値をとると仮定します.
(それは,yi>0ならyi=1にして,yi<0ならyi=-1にする)
この二つのクラスを分離する超平面(wT・x)+b=0を求めるという問題を考えるわけだ.
(wは超平面に対して垂直な法線ベクトルのことです)

つまり,この2クラスを分離する線形分離超平面を作りたいわけだが,その引き方は何通りも考えられる.
んで,その引き方に基準を設けたいわけだが,識別境界と各クラスのデータから出来るだけ大きな幅を持っているのがうれしい.
その幅のことをマージンと呼ぶ.
マージンとは具体的に各データから識別境界までの距離のことを指す.
このパラメータを最大にするようなところに線を引くことからマージン最大化と呼ぶ.