說明:
1. 此處是臺大林軒田老師主頁上的hw6,對應coursera上“機器學習技法”作業二;
2. 本文給出大作業(19-20題)的代碼;
3. Matlab代碼;
4. 非職業碼農,代碼質量不高,變量命名也不規範,湊合着看吧,不好意思;
5. 如有問題,歡迎指教,QQ:50834。
題目19-20,分爲主程序和一個函數。
主程序:
<pre name="code" class="plain">clear all;
close all;
data = csvread('hw6_lssvm_all.dat');
Nsum = length(data);
xtrn = [ones(400,1),data(1:400,1:end-1)];
ytrn = data(1:400,end);
xtst = [ones(Nsum-400,1), data(401:end,1:end-1)];
ytst = data(401:end,end);
clear data;
clear Nsum
[N,k]=size(xtrn);
[Ntst,dummy]=size(xtst);
lambdas = [0.001,1,1000];
gammas = [32,2,0.125];
K = ones(N,N);
Ein = ones(length(gammas),length(lambdas));
Eout = ones(length(gammas),length(lambdas));
for i = 1:length(gammas)
gamma = gammas(i);
K = hw6_RBFKernel(xtrn, xtrn, gamma);
for j = 1:length(lambdas)
lambda = lambdas(j);
beta = pinv(lambda * eye(N) + K) * ytrn;
ytrnpred = sign(K'*beta);
Ein(i,j) = sum(ytrn~=ytrnpred)/N;
Kpred = hw6_RBFKernel(xtrn, xtst, gamma);
ytstpred = sign(Kpred'*beta);
Eout(i,j) = sum(ytst~=ytstpred)/Ntst;
end;
end;
fprintf('==== *Q19-20* ====\n');
fprintf(' Ein ');
for j = 1:length(lambdas),
fprintf('Lambda = 10^(%2.0f) ', log10(lambdas(j)));
end;
fprintf('\n');
for i = 1:length(gammas),
fprintf('Gamma = 2^(%2.0f)', log2(gammas(i)));
for j = 1:length(lambdas),
fprintf('%19.4f', Ein(i,j));
end;
fprintf('\n');
end;
fprintf('\n Eout ');
for j = 1:length(lambdas),
fprintf('Lambda = 10^(%2.0f) ', log10(lambdas(j)));
end;
fprintf('\n');
for i = 1:length(gammas),
fprintf('Gamma = 2^(%2.0f)', log2(gammas(i)));
for j = 1:length(lambdas),
fprintf('%19.4f', Eout(i,j));
end;
fprintf('\n');
end;
函數:
function K = hw6_RBFKernel(x1,x2,g)
N1 = length(x1);
N2 = length(x2);
K = zeros(N1,N2);
for i = 1:N1,
for j = 1:N2,
K(i,j) = exp(-g*(x1(i,:)-x2(j,:))*(x1(i,:)-x2(j,:))');
end;
end;
end
結果輸出:
==== *Q19-20* ====
Ein Lambda = 10^(-3) Lambda = 10^( 0) Lambda = 10^( 3)
Gamma = 2^( 5) 0.0000 0.0000 0.0000
Gamma = 2^( 1) 0.0000 0.0000 0.0000
Gamma = 2^(-3) 0.0000 0.0300 0.2425
Eout Lambda = 10^(-3) Lambda = 10^( 0) Lambda = 10^( 3)
Gamma = 2^( 5) 0.4500 0.4500 0.4500
Gamma = 2^( 1) 0.4400 0.4400 0.4400
Gamma = 2^(-3) 0.4600 0.4500 0.3900