はじめてのパターン認識
第8章
「サポートベクトルマシーン」
後半 
2013/11/26 @リクルート

2013年11月26日火曜日
あんた誰?
名前           
伊藤 徹郎 (@tetsuroito)
所属
株式会社ALBERT データ分析部
好きなもの
サッカー、スキー、オレオ!

2013年11月26日火曜日
アジェンダ

1、動径基底カーネル(RBFカーネル)
2、ν-サポートベクトルマシーン
3、1クラスサポートベクトルマシーン

2013年11月26日火曜日
ちょっとSVMの復習
SVMは下記のように、分類したい識別境界を求めるのでしたね。
! 識 別境界:! T x + b = 0
" !:識別境界の係数ベクトル(学習データから求める)
" x:学習データ(d次元の特徴変数!データ数N→d!Nの

列)

" b:バイアス項(学習データから求める)
!
t = +1

t = -1

2013年11月26日火曜日

線形識別関数
! Tx + b = 0
ちょっとSVMの復習
制約条件付きの凸計画問題を解く場合、ラグランジュの未定乗数法を用いる
SVMの場合は制約条件が不等式となる

主問題
評価関数(最小化):Lp(ω) = ½・ωTω ←マージンの最小化
不等式制約条件:ti(ωTxi+b) ≧ 1

←判別

ラグランジュ関数(これで制約付き凸計画を解く)
N
1 T
~
L p (# , b, $ ) = # # " ! $ i (ti (# T xi + b )" 1)
2
i =1
αiはラグランジュ未定定数
α=(α1,・・・, αN)

2013年11月26日火曜日
ちょっとSVMの復習
! L d (!)を最
" L p (#)を最

化する問題を「双対問題」と呼ぶ"
化する#を求めるほうが主問題!

" 双対問題で対象とするラグランジュ関数
N
1 N N
評価関数 Ld (# ) = ! "" # i ti xi# j t j x j + " # i
2 i =1 j =1
i =1
(最 化)

1 T
= # 1 ! # H#
2
#Tt = 0
T

制約条件

T

H = ( H ij = ti t j xi x j )
t = (t1 , , , t N )T

2013年11月26日火曜日

#からじゃなく、

!から鞍点を探す
ちょっとカーネルトリックの復習
! 線 形分離が上 くできない場合でも、 線形変換で
元空間に写像すれば上 く分離できる場合がある

次

!  線形写像
" d次元の学習データx∈R d
線形変換!でM次元空間に写像

" !(x)=(! 0 (x)=1, ! 1 (x),…,! M
バイアス項

2013年11月26日火曜日

写像結果

(x)) T

識別境界
線形変換!
!0
動径基底カーネル(RBFカーネル)
多項式カーネルとは別にもう1つ内積で表すカーネルがあります。

σ:カーネル関数の広がりを制御するパラメータ
N

N

T
h (! ( x )) = ! 0 " ( x ) = !! i ti" T ( xi ) ! ( x ) = !! i ti K ( xi , x )
i=1

i=1
ココ!

σが大きいとき:入力データxから遠く離れている広範囲のサポートベクトルが関与
σが小さいとき:入力データxの近傍のサポートベクトルのみが関与

2013年11月26日火曜日
ちょっとだけ正規分布の話
正規分布といえば、下記の図がぱっと思い浮かびます。

σを大きくした場合、この正規分布の高さが低くなり横に散らばります。
σを小さくした場合は、山の凸が急になり、分布の裾野が薄くなります。

2013年11月26日火曜日
RBFカーネルの特徴
RBFカーネルの非線形特徴ベクトルは無限次元となるようです。

ただの式展開なので、詳細は教科書見てちょ

よく使われるガウシアンカーネルもこのRBFカーネルの一部のようです。
以前、同一種だと思っていましたが、完全一致ではないもよう。
詳しくはわからないので、誰か知ってたら教えてください。

2013年11月26日火曜日
Rでの実行例
library(MASS)内のPima.trでRBFカーネルの識別具合を実行する例が載っている。
WHOがインディアン女性の健康データを取得したものらしい。
> Pima.tr
npreg glu bp skin bmi ped age type
1
5 86 68 28 30.2 0.364 24 No
2
7 195 70 33 25.1 0.163 55 Yes
3
5 77 82 41 35.8 0.156 35 No
4
0 165 76 43 47.9 0.259 26 No
5
0 107 60 25 26.4 0.133 23 No
6
5 97 76 27 35.6 0.378 52 Yes
7
3 83 58 31 34.3 0.336 25 No
8
1 193 50 16 25.9 0.655 24 No
9
3 142 80 15 32.4 0.200 63 No
10
2 128 78 37 43.3 1.224 31 Yes

2013年11月26日火曜日

このtypeをglu、bmiを用いて
kernlabパッケージのksvm関数を用いて、
RBFカーネルのσとCのパラメータを
調整して、その識別精度を検証。
Rでの実行例
x1_svm1 <- ksvm(type~glu+bmi,data=x,kernel="rbfdot",kpar=list(sigma=0.2),C=1)
※実行コードがないので、とりあえず加法してみた。
※カーネル選択はRBF
※σとCは引数で調節

2013年11月26日火曜日
Νーサポートベクトルマシーン
ソフトマージン識別機では、誤識別数の上限を抑えるためにCという定数パラメー
タを使っていました。
N
N
N
1 T
~
L p ($ , b, % , # , µ ) = $ $ + C ! # i " ! % i (ti ($ T xi + b )" 1 + # i )" ! µi# i
2
i =1
i =1
i =1

しかし、母集団からの標本が変わると誤識別数も変化してしまいます。

学習器の複雑さと達成可能な誤識別率には関連性があるので、
そのトレードオフをνというパラメータを介したものがν-SVMです。

※タイトルのはどうしても小文字で表記できなかったので大文字表記です。
すみません。。

2013年11月26日火曜日
何を変えたの?
CクラスSVMの場合の損失関数は

ξi =f +(1- tif (xi))
ν-SVMの場合の損失関数は

ξi =f +(ρ- tif (xi))
ρの値を最適化することを考えます。
学習機械は損失を小さくする方にはたらくので、損失関数としては
マージンの大きさを決める値ρが小さければ小さいほど損失は小さくなる。

しかし、小さくなりすぎると汎化性能が下がる。

2013年11月26日火曜日
主問題
先ほどの汎化性能の問題もあり、次のように定式化します。
評価関数(最小化)

不等式制約条件

2013年11月26日火曜日
KKT条件
数式書くの心が折れたんで、P129の(8.36)と(1)∼(8)を参照ください。

(7),(8)式が相補性条件となるので、(8.36)式に代入することで、
次のような双対問題を得る事ができます!

2013年11月26日火曜日
双対問題
評価関数(最大化)

制約条件

2013年11月26日火曜日
ニューの意味って何
サポートベクトルはai>0となる学習データ
サポートベクトルでないデータに対しては、ai=0で、最大値は1/N

×サポートベクトル数
サポート
ベクトル

νはサポートベクトルの割合の下限を与えていることになります。

2013年11月26日火曜日
ニューの意味って何
また、KKT条件(8)からマージンを超えてξi>0となる場合、μi=0なので
KKT条件(3)から、αi=1/Nとなるので、

上限サポート

上限でない

ベクトル

サポートベクトル

=1/N×上限サポートベクトル数+
上限でない

※ν≧1/N×上限サポートベクトル数

サポートベクトル

νはマージン誤り(上限サポートベクトルの割合の上限)を与えている

2013年11月26日火曜日
Rでの実行例2
どうやらν-SVMは先ほどのksvm関数の引数のnuを指定すればできるようだ

サポート
ベクトルの割合
(上側)

上限
サポートベクトルの割合
(下側)

νmax=0.68以上の領域では意味がない。(下限と上限逆転しちゃうから?)

2013年11月26日火曜日
1クラスサポートベクトルマシン
C-SVMやν-SVMは2クラスの識別関数を構成するものだった。

SVMを1クラスの学習に用いて、入力データが
そのクラスに入るか入らないかのみを判断する
方法が、One-Class SVM
■主な用途
新規性判断、例外検出、外れ値検出など‥

2013年11月26日火曜日
やり方は2種類あるらしい
1、ν-SVMを用いてマージン境界の超平面を
  用いて、正負を判定する方法
2、サポートベクトル領域記述法
  正例を超球で包み、その半径を最適化
テキストでは1を紹介!

2013年11月26日火曜日
1クラスSVMの概念図
x

Φ(x)
!
w

!

○のデータを非線形変換して学習し、識別境界を挟んで原点と反対側に来るように
学習。
○が正例、×は負例ということになる。
※すべて正例でも外れ値検出される懸念があるので、注意!

2013年11月26日火曜日
主問題と双対問題

2013年11月26日火曜日
識別関数

f(x)=1の時が正例
f(x)=-1の時が外れ値となります。

2013年11月26日火曜日
Rでの実行例3
実はksvm関数の引数設定で、type=”one-svc”と指定するとできるっぽい

実行例では、σ=4、ν=0.01で学習した時の例が出ていますね。

2013年11月26日火曜日
1クラスSVMをRでやってみる
ちょっと途中で息切れしちゃったのですが、1クラスSVM試してみたので、
勘弁してください。
x,y座標に乱数を100個
RBFカーネルを選択
ν=0.01
σ=0.1
赤:正例
青:負例

2013年11月26日火曜日
1クラスSVMをRでやってみる
ちょっと途中で息切れしちゃったのですが、1クラスSVM試してみたので、
勘弁してください。
x,y座標に乱数を10000個
RBFカーネルを選択
ν=0.3
σ=0.1
赤:正例
青:負例

2013年11月26日火曜日
なんかちゃんとできてるっぽい!

2013年11月26日火曜日
コードも載せとくね
x <- rnorm(100)
y <- rnorm(100)
data <- data.frame(type=1, x, y)
library(kernlab)
data.ksvm<- ksvm(type~.,data=data,type="one-svc",kernel="rbfdot",kpar=list
(sigma=0.1),nu=0.01,cross=10)
data.ksvm.predict <- predict(data.ksvm)
data.ksvm.predict <- ifelse(data.ksvm.predict==TRUE, 1, 2)
data.result <- cbind(data,data.ksvm.predict)
plot(data.result[,2:3], pch=21, bg=c("red","blue")[data.result$data.ksvm.predict])
1万はちょっと時間かかったから、前者の例です

2013年11月26日火曜日
あ、そういえば!

2013年11月26日火曜日
Japan.Rでトークします

マサカリ投げないでくだしあ
2013年11月26日火曜日
おわり

ご清聴ありがとうございました!

2013年11月26日火曜日

はじパタ8章 svm