Boosting算法MATLAB实现

算法描述

  • 从大小为n的原始样本集D中不放回得随机选取n1个样本点,得到样本集D1,根据D1训练第一个弱分类器C1。
  • 采用掷硬币方式,如果是正面就选取D中剩余样本点一个一个送到C1中进行分类,遇到第一个被错分的样本加入集合D2中;如果是反面就选取一个被C1正确分类的样本点加入集合D2中。集合D2有一半样本被C1正确分类,另一半样本被C1错误分类,利用D2训练弱分类器C2。
  • 取样本集D中剩余样本点,如C1和C2分类结果不同,就把该样本加入集合D3,训练弱分类器C3。
  • 用这3个分类器进行分类,如果C1和C2判决结果相同,则样本标记为这个类别。如果C1和C2判决结果不同,则样本标记为C3类别。

代码思路

  • 构造弱分类器:

    .由于所用的数据只是一维的,所以弱分类器构建为直接用阈值分类,弱分类器就是找到一个阈值threshold和一个标签y,当大于threshold时,标记为y, 小于threshold时标记为-y


function [y,threshold]=classifier(D)
[m,n]=size(D);
y=1;
erro=4;
threshold=0.5;%大于阈值为y.小于为-y?怎么能写成自动判断大于还是小于
for j=1:n
    f=D(1,j)+0.5;%阈值取所有可能的值,遍历一遍
    er1=0; %y为1时分类错误的个数
    er2=0;%y为-1时分类错误的个数
    for k=1:n
        if((D(1,k)>f && D(2,k)==-1)||(D(1,k)<f && D(2,k)==1))
            er1=er1+1;
        end
    end
    for k=1:n
        if((D(1,k)>f && D(2,k)==1)||(D(1,k)<f && D(2,k)==-1))
            er2=er2+1;
        end
    end
    if(er1<er2)
        y=1;     
        if(er1<erro)
            erro=er1;
            threshold=f;
        end
    else
        y=-1;
        if(er2<erro)
            erro=er2;
            threshold=f;
        end
    end
end

  • 构造训练集,D1随机挑选4个样本点:

D=[
     1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20;
     1 1 1 1 -1 -1 -1 1 1 -1 1 1 1 -1 -1 -1 -1 1 -1 -1 
];
D0=D;
%第一个分类器
D1=zeros(2,4);
for i=1:4
    x=ceil(1+(20-i)*rand(1,1));
    D1(:,i)=D0(:,x);
    D0(:,x)=[];
end

  • 构造数据集D2,一共有四个样本点,是除了D1中的元素,2个是分类器1分对的,两个是分错的。

D2=zeros(2,4);
t=2;f=2;
while(t>0||f>0)
    y=ceil(1+(11+t+f)*rand(1,1));
    if((D0(1,y)>threshold1&&D0(2,y)==lab1)||(D0(1,y)<threshold1&&D0(2,y)==-lab1))%正确分类
        if(t>0)
            D2(:,(5-t-f))=D0(:,y);
            D0(:,y)=[];
            t=t-1;
        end

    else
        %错误分类
        if(f>0)
            D2(:,(5-t-f))=D0(:,y);
            D0(:,y)=[];
            f=f-1;
        end 
    end
end

  • 构造D3数据集,有剩下的数据中D1和D2分类结果不同的数据组成。

D3=zeros(2,12);
for j=12:-1:1
    if(D0(1,j)>threshold1)
        l1=lab1;
    else
        l1=-lab1;
    end
     if(D0(1,j)>threshold2)
        l2=lab2;
    else
        l2=-lab2;
    end
     if(l1==l2)%怎么看分类结果相同不
         D3(:,j)=[];
     else
         D3(:,j)=D0(:,j);
     end
end

实现后的结果

由于数据是自己编的的所以不太好。
这里写图片描述

  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值