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

版权声明:本文为博主原创文章,技术有限,如果发现错误或问题请告知博主,转载请注明出处,谢谢。 https://blog.csdn.net/icefire_tyh/article/details/52345053

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

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

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


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

猜你喜欢

转载自blog.csdn.net/icefire_tyh/article/details/52345053
今日推荐