Boosting算法MATLAB实现

时间:2022-09-09 07:31:26

算法描述

  • 从大小为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

实现后的结果

由于数据是自己编的的所以不太好。
Boosting算法MATLAB实现