LoginSignup
2
4

More than 1 year has passed since last update.

SVM どこよりもわかるカーネル関数

Last updated at Posted at 2021-08-13

はじめに

SVMのスクラッチを実装するなかで、カーネルの違いについてしらべた。

データセット

from sklearn.datasets import make_moons
X, y = make_moons(n_samples=100, noise=0.15)

linear(線形カーネル)

$$k(x_1, x_2) = x_1^T x_2$$

poly_svm = Pipeline([
        ('scaler', StandardScaler()),
        ('svm_clf', SVC(kernel='linear'))
])

Imgur

poly(多項式回帰)

線形カーネルとは異なり、特徴量を自分で加えなくともSVCの内部で加えてくれる。
また、カーネルトリックを使用しているため(内積の計算を楽にすること)直接特徴量を加えるより計算速度が断然早くなる。

$$k(x_1, x_2) = (\gamma x_1^T x_2 + r)^d$$

poly_karnel_svm = Pipeline([
    ('sclear', StandardScaler()),
    ('svm', SVC(kernel='poly', degree=3, coef0=1, C=5))
])

Imgur

ガウスRBFカーネル

各サンプルに対してガウスRBFという分布を用いて、類似性特徴量を求める事を

カーネルトリックを使って計算量を落としたやり方。

元の特徴量を捨て(本当の意味では捨ててない)サンプル数ごとに分布(影響領域)を定めそれによって決定領域を描く。

カーネルの式は
$$k(x_1,x_2)=exp(\gamma||x_1 - x_2||^2)$$

$\gamma$をあげると各インスタンスが持つ影響領域が小さくなる。そのため過適合しやすくなる。

$C$をあげると誤差のペナルティが大きくなるので、過適合する。

rbf_karnel_svm = Pipeline([
    ('sclear', StandardScaler()),
    ('svm', SVC(kernel='rbf', gamma=gamma, C=C, random_state=0))
])

Imgur

シグモイドカーネル

gammaをあげると適合はするものの、過適合になるというよりかはずれていくイメージ。

切片はそのままのイメージ、累乗すると複雑になる。
$$k(x_1,x_2)=tanh(\gamma x_1^Tx_2'+r)$$

Imgur

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4