说明:
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