算法描述
1.初始化训练数据的权重分布
D1=(w11,w12,⋯,w1,n),w1,i=1n
2.对具有Dm权值分布的训练数据,执行下面的操作
- 学习基本分类器Gm
- 计算在Gm上的分类误差率
em=P(Gm(xi)≠yi)=∑i=1NwmiI(Gm(xi)≠yi) 计算Gm的系数
αm=12log1−emem更新权值分布
Dm+1=(wm+1,1,wm+1,2,⋯,wm+1,n)wm+1,i=wm,iZmexp(−αmGm(xi)yi)Zm=∑i=1Nwm,iexp(−αmGm(xi)yi)
3.构建基本分类器
f(x)=∑i=1MαmGm(x)
得到最准分类器
G(x)=sign(f(x))
## 代码实现 ##
- 学习基本分类器的代码
基本分类器用的是最简单的,用一个阈值来分类的方法
输入是训练数据和权重数组
输出为分类器的阈值和大于阈值时的标签,以及分类误差率
function [y,threshold,e]=classifierG(D,Dw)
[m,n]=size(D);
y=1;
e=1;
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+Dw(1,k);
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+Dw(1,k);
end
end
if(er1<er2)
y=1;
if(er1<e)
e=er1;
threshold=f;
end
else
y=-1;
if(er2<e)
e=er2;
threshold=f;
end
end
end
- 循环的学习分类器,知道分错的样本点个数为0
while(erro>0)
erro=10;%分类错误的样本点的个数
%训练出分类器G ,误差率
[y,t,e]=classifierG(D,Dw);
%计算G的系数
a=0.5*log((1-e)/e);
G(:,g)=[
t;
y;
a
];
g=g+1;
%更新权Dw
for i=1:10
if(D(1,i)>t)
gy=y;
else
gy=-y;
end
Dw(1,i)=Dw(1,i)*exp(-a*D(2,i)*gy);
end
Z=sum(Dw(1,:));
Dw=1/Z*Dw;
%更新erro
for j=1:10
fy=0;
for k=1:10
if(D(1,j)>G(1,k))
fy=fy+G(2,k)*G(3,k);
else
fy=fy-G(2,k)*G(3,k);
end
end
if((fy>0&&D(2,j)==1)||(fy<0&&D(2,j)==-1))
erro=erro-1;
end
end
end