何らかのブログ

日記とか備忘録

ランプ損失サポートベクタ―マシン

ICML2006のTrading convexity for scalabilityを元にざっくりとした解説。

 

SVMは凸関数の最適化問題であることによって、理論的にその性能が保証されているのが売りだけど、非凸関数も最適化したい!っていうのがモチベっぽい。

分類器

{ \displaystyle f_{w,b}(x) = w^T x + b }

の最適化において、パラメタを

{ \displaystyle \theta = (w,b) }

として、

{ \displaystyle \theta \rightarrow \frac{1}{2}{\|w\|}^2 + C \sum_{l=1}^L H_1(y_lf_\theta(x_l)) }

{\displaystyle H_s(z)=\max(0,s-z)}

を最適化するのが通常のSVM

この論文ではランプ損失を

{\displaystyle R_s(z)=H_1(z)-H_s(z)}

とおいて、

{\displaystyle \begin{eqnarray*} J^s(\theta) = \frac{1}{2}{\|w\|}^2 + C \sum_{l=1}^L R_s(y_lf_\theta(x_l))\\ = \frac{1}{2}{\|w\|}^2 + C \sum_{l=1}^L H_1(y_lf_\theta(x_l)) - C \sum_{l=1}^L H_s(y_lf_\theta(x_l)) \end{eqnarray*} }

となる式をCCCP法を用いて最適化する。

式書くのだるくなったので論文からコピペ引用

f:id:censored:20151206214314p:plain

で、pythonで実装してみた。

gist6f2fee705a197a608839

で、前回とおんなじ感じで適当に作ったサンプルを分類してみた。

f:id:censored:20151206214912p:plain

matplotlib使ったせいか色がきつくてあれだけど、綺麗に分類てきてるっぽいので上手くいってるかも。

 

ただ、論文読んでもbの決定方法がよく分からなくてサポートベクトル?それぞれについて求まるbの平均を取ってしまったんだけど、詳しい人いたら教えてください。