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