CourseraMLweek7で紛らわしかったところ(SVM,kernel)

SVM with kernelsを五行で、、

Training setのxをランドマークl(L)として置く、カーネル関数を使い、validation set のxとlとの距離を取る。y(validation set)を使ってθを調整し、何処までの距離なら陽性、どこまで離れていたら陰性と判定すればエラーが最小になるか学習させる。あと、正則化のCも同時に。

ロジスティック回帰

min 1/m * Σ[y * (-log(h)) + (1-y)* ( ( -log ( 1-h)))] + λ/2m * Σθ.^2

Support vector machine(SVM)

min C *Σ[ y *cost1(θ’X) + (1-y)*cost0(θ’x) ] + λ/2 * Σθ.^2    
mがなくなっている。しかしただの定数なので、出てくるθは変わらない。
ロジスティック回帰では、
A + λ*B を最小化するのに、λを使って調節した。

その代わり、support vector machineでは、
C * A + B という風に、Cを用いて調節する。

λを大きい値にすると、Bにとても大きい重みを加える
Cを小さい値にすると、Aに対してBにとても大きい重みを加える。同じものでしょ? ( C = 1/λ みたいな風に考えていいよ)

画像1

ロジスティックと比べて何が違うか。

直観的に言うと、ギリギリでなく、よりきっちり、陽性と陰性を分けるもの。よって大きなマージン分類器ともいわれる。


カーネル

複雑なバイナリー問題の時、次数を増やすのでは、計算量が膨大になるというデメリットがある。そこでほかのフィーチャーの選択肢がないか?

ランドマークを置き、そこに近いかどうかで陽性/陰性を判定できないか?

Q1.ランドマークどうやって置くの?

A1.training set のxをそのまま置く( l(landmark)という記号に変える)

その後、f : 入力データxとランドマークの距離を示す f を以下の式で計算する。

画像2

f1 = Similarity(x , l(1)) = exp(-||x-l(1)||^2/2σ^2)
|| || ←これはベクトルの距離のこと
Similarityのことをカーネル関数という。 xと l(i)の類似度を表す。

画像3

θの値によって、何処までの距離が1と判定されるか調節されているとわかる。
y=1のとき(validation setの) hが1と判定するように、エラーを少なくなるようにθを学習させる。

線形 vs 非線形


linerKernel __ 線形分離の時

C = 定数
Model = svmTrain(X, y, C, @linerKernel)

gaussianKernel__非線形分離の時
C= 定数 σ=定数
Model = svmTrain(X, y, C, @(x1, x2) gaussianKernel(x1, x2, sigma))


課題

gaussian kernel__

指令:Fill in this function to return the similarity between x1 and x2 computed using a Gaussian kernel with bandwidth sigma

らしいです。

sim = exp(-(sum((x1-x2).^2))/(2*sigma^2))

公式通りでした。



SVM with kernels で適当なσとCの値を求める問題

C_param = [0.01 0.03 0.1 0.3 1 3 10 30];
sigma_param = [0.01 0.03 0.1 0.3 1 3 10 30];
results = zeros(64,3);  ←eyeでもzerosでも動いた。謎、
errorRow = 0;

for C_test = [0.01 0.03 0.1 0.3 1, 3, 10 30]
for sigma_test = [0.01 0.03 0.1 0.3 1, 3, 10 30]
errorRow = errorRow+1
model = svmTrain(X, y, C_test, @(x1, x2) gaussianKernel(x1, x2, sigma_test));
predictions = svmPredict(model, Xval);
prediction_error = mean(double(predictions ~= yval));

results(errorRow,:) = [C_test, sigma_test, prediction_error];
end
end

sorted_results = sortrows(results, 3); 

C = sorted_results(1,1);
sigma = sorted_results(1,2);


sortrows(Matrix , no of 列) で、並び替えして、(今回だと列3はprediction_error)、C, σ共に最上列のもの(prediction_errorがmin)を選ぶ。

この記事が気に入ったらサポートをしてみませんか?