提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
adaboost 算法升级版MATLAB实现:https://blog.csdn.net/weixin_41146894/article/details/111315192
前言
提升方法基于这样一种思想:对于一个复杂任务来说,将多个专 家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独 的判断好。实际上,就是“三个臭皮匠顶个诸葛亮”的道理。这里主要是对李航统计学习书上的例子复现,对于理论不做介绍。
一、例子
二、算法实现
代码如下(示例):
clc
clear
%初始权重
w = [1 1 1 1 1 1 1 1 1 1];
%对应的输出
H = [];
Y = [1 1 1 -1 -1 -1 1 1 1 -1];
Y_1 = Y;
fprintf('目标分类:\n');
fprintf('%4d',Y);
fprintf('\n');
%对应的X
X = [0 1 2 3 4 5 6 7 8 9];
%保存错误的个数
error = [];
X_process = [0 0 0 0 0 0 0 0 0 0];
%对应的切分点
cut = [0.5 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5];
h_1 = [];
%用来保存误差
e = [];
%保存系数
a = [];
%设置最大的迭代步数
m = 10;
%开始迭代
for i=1:m
%初始化权值大小,归一化到(0,1)
sumW = sum(w);
w = w ./ sumW;
for j=1:length(cut)
for k=1:length(X)
if X(k) < cut(j)
h(j,k) = 1;
else
h(j,k) = -1;
end
end
end
%计算误差率
for j = 1:size(h,1)
if isempty(find( X_process==j))==0
e(j) = 999;
else
%误差率大于0.5,
e(j) = sum(w.*((Y - h(j,:)).*Y) / 2);
if e(j) > 0.5
e(j) = 1 - e(j);
for k=1:length(X)
if X(k) < cut(j)
h(j,k) = -1;
else
h(j,k) = 1;
end
end
end
end
end
%找出最小误差
minE = min(e);
%算弱分类器前的系数
minI = find(e == minE);
%判断是否有两个或则更多的最小误差
if (size(minI,2) > 1)
minI = minI(1);
end
minE;
minI;
%得到系数
a(i) = log((1 - minE)/minE)/2;
%更新权值
Y_1 = h(minI,:);
Z = sum(w.*exp(-a(i) * h(minI,:).*Y));
w = w/Z .* exp(-a(i) * h(minI,:).*Y);
%保存已经使用过的判断点
X_process(i) = minI;
fprintf('\n')
fprintf('第%d迭代,划分点为 %f, 对于的弱分类函数为:\n',i,cut(minI));
fprintf('%4d',Y_1)
fprintf('\n');
H(i,:) =a(i)*Y_1;
sign(sum(H));
error(i)=sum(abs(sign(sum(H))- Y))/2;
%
if sign(sum(H))- Y==0
break;
end
% h_1(i) = h(colum,:);
end
fprintf('迭代结束,误差率为0:\n');
subplot(2,1,1);
plot(error,'rs--')
xlabel('iterationtime');
ylabel('errornumber');
legend('error numbers');
subplot(2,1,2);
plot(X,Y,'r*')
axis([-5 15 -2 6]);
结果