机器学习(周志华西瓜书) 参考答案 总目录
机器学习(周志华) 参考答案 第十三章 半监督学习
与SVM不同的是,TSVM利用为标记的样本不断去修正仅用有标记样本生成的SVM。每次修正中,TSVM在伪标记中各选择一个有很可能错误的标记,更改他们的伪标记,并重新训练一个SVM,直到无法找出明显错误的标记。
数据集使用UCI-IRIS数据集,100样本,2分类各50例,4连续属性。
训练样本,无标记样本与测试样本都从各类中选相同数目的样本。
训练结果,30例测试样本中,SVM分类错误5例,错误率16.6%,TSVM分类错误2例,错误率6.6%。
由于数据集属性较少,直接使用二次规划求解原始SVM。
主代码:
%TSVM
data = xlsread('C:\Users\icefire\Desktop\ml\UCI-iris数据集.xlsx', 'sheet1', 'A13:CV18');
data(6,:)=3-2*data(6,:);
%训练样本
xl=data(1:5,[1:5,51:55]);
yl=data(6,[1:5,51:55]);
%测试样本
xc=data(1:5,[6:20,56:70]);
tyc=data(6,[6:20,56:70]);
%无标记样本
xt=data(1:5,[21:50,71:100]);
tyt=data(6,[21:50,71:100]);
%训练样本属性与分类数
[nl,ml]=size(xl);
%训练样本的折中参数
cl=1;
%使用训练样本训练SVM
w=pl_svm(xl,yl,cl);
%计算未使用无标记样本时SVM的错误率
err_svm=sum(abs(sign(w'*xt)-tyt))/2;
%对无标记进行伪标记
yc=sign(w'*xc);
%初始的无标记样本的折中参数
cu=0.01;
%为了计算方便需要改变xc的排序,所以使用临时变量
txc=xc;
while cu%使用训练样本和伪标记样本训练SVM
[w,p]=plc_svm(xl,yl,cl,txc,yc,cu);
while(1)
%为了简化计算,每次选出正负伪标记中最大的松弛变量对应的伪标记样本,更换伪标记。
yc_nums=histc(yc,[-1,1]);
[yc,arr]=sort(yc);
txc=txc(:,arr);
p=p(ml+arr);
pp=p(1:yc_nums(1));
pn=p(1+yc_nums(1):end);
[pp,arrp]=sort(pp,'descend');
[pn,arrn]=sort(pn,'descend');
if(pn(1)+pp(1)>2)
yc(arrp(1))=-1*yc(arrp(1));
yc(arrn(1)+yc_nums(1))=-1*yc(arrn(1)+yc_nums(1));
[w,p]=plc_svm(xl,yl,cl,txc,yc,cu);
else
%如果对应的松弛变量都很小,就不再更改,并加大无标记样本的折中参数
break;
end
end
cu=min(cu*2,cl);
end
%计算TSVM的错误率
err_tsvm=sum(abs(sign(w'*xt)-tyt))/2;
为了调用方便,使用了无标记样本的SVM与直接训练的SVM分开写了。
仅使用训练样本:
%使用训练样本训练SVM
function w=pl_svm(xl,yl,cl)
[nl,ml]=size(xl);
%设置二次规划的参数,参考quadprog
H=zeros(ml+nl);
H(1:nl,1:nl)=diag(ones(1,nl));
f=[zeros(1,nl),cl*ones(1,ml)];
A=zeros(2*ml,ml+nl);
for i=1:ml
A(i,1:nl)=-yl(i)*xl(:,i)';
A(i,nl+i)=-1;
A(ml+i,nl+i)=-1;
end
b=[-1*ones(ml,1);zeros(ml,1)];
%使用二次规划求解
%仅返回超平面参数
w=quadprog(H,f,A,b);
w=w(1:nl);
end
使用无标记样本
%使用训练样本和无标记样本训练SVM
function [w,p]=plc_svm(xl,yl,cl,xc,yc,cu)
[nl,ml]=size(xl);
[nc,mc]=size(xc);
%设置二次规划的参数,参考quadprog
H=zeros(ml+nl+mc);
H(1:nl,1:nl)=diag(ones(1,nl));
f=[zeros(1,nl),cl*ones(1,ml),cu*ones(1,mc)];
A=zeros(2*(ml+mc),ml+nl+mc);
for i=1:ml
A(i,1:nl)=-yl(i)*xl(:,i)';
A(i,nl+i)=-1;
A(ml+mc+i,nl+i)=-1;
end
for i=1:mc
A(ml+i,1:nl)=-yc(i)*xc(:,i)';
A(ml+i,nl+ml+i)=-1;
A(2*ml+mc+i,nl+ml+i)=-1;
end
b=[-1*ones(ml+mc,1);zeros(ml+mc,1)];
%使用二次规划求解
%由于需要用到松弛变了,返回松弛变量和超平面参数
p=quadprog(H,f,A,b);
w=p(1:nl);
p=p(nl+1:ml+nl+mc);
end