📄 ada_boost.m
字号:
function [test_targets, E] = ada_boost(train_patterns, train_targets, test_patterns, params)
% Classify using the AdaBoost algorithm
% Inputs:
% train_patterns - Train patterns
% train_targets - Train targets
% test_patterns - Test patterns
% Params - [NumberOfIterations, Weak Learner Type, Learner's parameters]
%
% Outputs
% test_targets - Predicted targets
% E - Errors through the iterations
%
% NOTE: Suitable for only two classes
%
[k_max, weak_learner, alg_param] = process_params(params);%alg_param:weak_learner's 参数
[Ni,M] = size(train_patterns);
W = ones(1,M)/M;
IterDisp = 10;
full_patterns = [train_patterns, test_patterns];
test_targets = zeros(1, size(test_patterns,2));
%Do the AdaBoosting
for k = 1:k_max,
%Train weak learner Ck using the data sampled according to W:
%...so sample the data according to W
randnum = rand(1,M);%产生M维均匀分布
cW = cumsum(W);%W为权值向量,cW为权向量的累积,考虑概率的定义
indices = zeros(1,M);
for i = 1:M,
%Find which bin the random number falls into,很巧妙的办法来根据W进行抽样
%桶这样定义,下标i对应的是桶的大小,大小与权值W(i)相关,任取一随机数,显然落在大桶中的概率
%要大于落在小桶中的概率。这样大桶有更多机会被选中
loc = max(find(randnum(i) > cW))+1;
if isempty(loc)
indices(i) = 1;
else
indices(i) = loc;
end
end
%...and now train the classifier,此时的测试样本为所有的训练集,这是AdaBoosting的基本做法
Ck = feval(weak_learner, train_patterns(:, indices), train_targets(indices), full_patterns, alg_param);
%Ek <- Training error of Ck
E(k) = sum(W.*(Ck(1:M) ~= train_targets));%这里使用的是传统的二值分类结果
if (E(k) == 0),
break
end
%alpha_k <- 1/2*ln(1-Ek)/Ek)%这个公式也有所不同,Ek也类似于论文中的r
alpha_k = 0.5*log((1-E(k))/E(k));
%W_k+1 = W_k/Z*exp(+/-alpha)
W = W.*exp(alpha_k*(xor(Ck(1:M),train_targets)*2-1));
W = W./sum(W);
%Update the test targets ,
%M为训练样本的数目,Ck实际上是所有样本的分类结果,这里当然只取对测试样本的结果并进行累加
test_targets = test_targets + alpha_k*(2*Ck(M+1:end)-1);%2*X-1是为了使0,1型变量变成-1,+1型。
if (k/IterDisp == floor(k/IterDisp)),
disp(['Completed ' num2str(k) ' boosting iterations'])
end
end
test_targets = test_targets > 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -