机器学习(周志华) 参考答案 第十三章 半监督学习 13.4

机器学习(周志华西瓜书) 参考答案 总目录

* http://blog.csdn.net/icefire_tyh/article/details/52064910
<http://blog.csdn.net/icefire_tyh/article/details/52064910>
机器学习(周志华) 参考答案 第十三章 半监督学习

* http://blog.csdn.net/icefire_tyh/article/details/52345060
<http://blog.csdn.net/icefire_tyh/article/details/52345060>

4.实现TSVM算法,选择两个UCI数据集,将其中30%作为测试样本,10%作为训练样本,60%作为无标记样本,分别训练出利用无标记样本的TSVM和仅利用有标记样本的SVM,并比较其性能。


与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<cl %使用训练样本和伪标记样本训练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

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信