オタクの何か

オタクの戯言

今日のあれこれ

これから書いていこうかなって思って作った...が...

今日自分が発表したのは

SVM

自分の理解の浅さを痛感した.先輩の話聞きながらほーって思って多少理解が深まったはず

まとめるのもキツイので重要なとこ要約

  • SVMの特徴は?
  • パラメータの意味するところ

たぶんこんなところだと思う

SVMの特徴は?
  • マージン最大化

これは先人の教え

www.slideshare.net

こういうのを見るのが感覚的な理解は深まるんじゃないかなって思う.これとか視覚的にカーネル法を用いて分離が見れるしふむ...って思うよね




SVM with polynomial kernel visualization


ラグランジュ定数が意味するところ

SVMの主問題を解く中でラグランジュの未定乗数法を用いると思うんだが

ハードマージンのSVMラグランジュ関数は
{ \tilde{L} _p(\vec{w},b,\vec{\alpha})=\frac{\vec{\|w\|}^2}{2}-\sum^N_{i=1}\alpha_i(t_i(\vec{w}^{\mathrm{T}}\vec{x}_i+b)-1)  }

ここで言いたいのはこの{\alpha_i}が何を示すかってことだけど

ラグランジュの計算を進めたりして出てくるKuhn-Tucker条件から

{
\begin{cases}
t_i(\vec{w}^{\mathrm{T}}\vec{x}_i+b)-1=0\mbox{では},\alpha_i>0\\
t_i(\vec{w}^{\mathrm{T}}\vec{x}_i+b)-1\neq0\mbox{では},\alpha_i=0
\end{cases}}

こんな感じの関係式が出てくる

これ直感的になんだろうなあってずっとパッと理解しきれてなかったけど

{\alpha=0のときの\vec{x}_i}はサポートベクターではない点,すなわちマージン最大化に関わらない点を示す.

言われてみればそうやなってなったわね

逆に{\alpha>0のときの\vec{x}_i}がサポートベクターであり,これのみが超平面の決定に寄与する

字面だけ眺めてても図を見ながら考えるとわかることではあるしさっきのスライドとか見ながら考えるとわかりやすいのでは?

パラメータの意味するところ

眠いのですぐ書く

ソフトマージンを作るのに変数{\xi_i}を導入した.

C-SVMの主問題の目的関数は{[L_p(\vec{w},\vec{\xi})=\frac{\vec{\|w\|}^2}{2}+
C\sum^N_{i=1}\xi_i \to minimize]}

スラック変数の総和は誤識別数の上限である

パラメータCはどこまで誤識別数を許容するかを指定するパラメータ

今回ガウシアンカーネルに焦点を当てたので

\begin{equation}
K_\sigma(\vec{u},\vec{v})=exp(-\frac{1}{2\sigma^2}\|\vec{u}-\vec{v}\|^2)
\end{equation}

この\sigmaカーネル関数の広がりを制御するパラメータ



  • \sigmaが大きい場合は入力データ\vec{x}から遠く離れている広範囲のサポートベクトルが識別に寄与する
  • \sigmaが小さな場合は,入力データの近傍のサポートベクトルのみが識別に寄与する

結局は,これくらいはわかった上で実装してないと解析やる上でパッケージを使えるってだけの人になってしまうよねっていうのは感じるから一定レベルで理論の理解は大事だよね

irisのデータで実装

めんどいからコードはっつけとく

library(kernlab)
library(caret)

#行の長さ
rowdata<-nrow(iris)
iris<-iris

#ランダムに全体の半分の行を取り出す
random_ids<-sample(rowdata,rowdata*0.5)
random_ids

#学習データ作成
iris_training<-iris[random_ids, ]
iris_training

#予測データ作成
iris_predicting<-iris[-random_ids, ]
iris_predicting

#SVMによって学習,予測を行う
iris_svm<-ksvm(Species ~., data=iris_training )
iris_svm

#予測データを評価
result_predict<-predict(iris_svm, iris_predicting)
result_predict

#テーブルで比較
first<-table(result_predict,iris_predicting$Species)
first

#チューニング
fitControl<-trainControl(method="repeatedcv",number=10,repeats=10)
tGrid<-expand.grid(sigma=(1:10)*0.01, C= (1:10)*1)
model.tune<-train(Species~.,data=iris_training,trace=T,method="svmRadial",trControl=fitControl,tuneGrid=tGrid)
model.tune
plot(model.tune)

#結果を使って再度
iris_svm<-ksvm(Species ~., data=iris_training,kpar=list(sigma=0.05),C=4 )
iris_svm

#予測データを評価
result_predict<-predict(iris_svm, iris_predicting)
result_predict

#テーブルで比較
second<-table(result_predict,iris_predicting$Species)
second
first


こんな時間まで起きてないで寝ましょう

数式の表記微妙すぎて直したかったけどもう眠いからいいや