AdaBoost每一轮的训练获得一个当前权重条件下的最优阈值
% 逐步求精的方法获取第j个特征值上的最优分类器
% 输入:
% X 训练样本,rows X cols 维矩阵,rows个样本,每个样本cols个特征值
% Y 每个样本所属类别的标识,向量,长度为rows
% rows 样本容量
% weight 权重向量,存放当前每个样本的权重值
% j 当前查找最佳弱分类器的特征列
% 输出:
% bestError %搜索到第j列最佳弱分类器得到的最小错误率
% bestThresh %搜索到第j列最佳弱分类器的阈值
% bestBias %搜索到第j列最佳弱分类器的偏置
%
% 迭代4次,每次将区间划分为12个小段
%
% 调用格式为 [bestError,bestThresh,bestBias]=findBestWeakLearner(X,Y,rows,weight,j)
% 最后更新 2007-03-25
function [bestError,bestThresh,bestBias]=findBestWeakLearner(X,Y,rows,weight,j)
% 检查输入特征向量与类标需为列向量
iptcheckinput(X,{'logical','numeric'},{'2d','nonempty','real'},mfilename, 'X', 1);
iptcheckinput(Y,{'logical','numeric'},{'column','nonempty','integer'},mfilename, 'Y', 2);
iteration=4; % 迭代次数
sectNum=12; % 每次迭代,将搜索区域划分的片段
maxFea=max(X(:,j)); % 搜索空间的最大值
minFea=min(X(:,j)); % 搜索空间的最小值
step=(maxFea-minFea)/(sectNum-1); % 每次搜索的递增量
bestError=rows; % 初值:最好的分类器错误率
for iter=1:iteration % 迭代iteration次,范围逐步缩小,寻找最优值
tempError=rows; % 初值:第iter次迭代的分类器错误率
for i=1:sectNum % 第iter次迭代的搜索次数
thresh=minFea+(i-1)*step; % 第i次搜索的阈值
for p=1:-2:-1 % !这个循环可去掉
h=zeros(rows,1); %每个样本对弱分类器的输出
for ii=1:rows %!这个循环可向量化
if((p*X(ii,j))<(p*thresh))
h(ii)=1;
else
h(ii)=0;
end
end %end for
error=sum(weight(find(h~=Y))); % 第iter次迭代第i次搜索加权错误率
%! 这段属冗余代码
if(error<tempError) % 第iter次迭代最优的错误率 阈值 偏置
tempError=error; % 第iter次迭代最小的错误率
tempThresh=thresh; % 第iter次迭代最小错误分类情况下的阈值
tempBias=p; % 第iter次迭代最小错误分类情况下的偏置
end
end%end for p
end%end for i
if(tempError<bestError) % 迭代获取的最优错误率 阈值 偏置
bestError=tempError;
bestThresh=tempThresh;
bestBias=tempBias;
end
%将搜索范围缩小,继续进行搜索
span=(maxFea-minFea)/8; % 搜索范围减为原有的1/4
maxFea=tempThresh+span; % 减少搜索范围后搜索空间的最大值
minFea=tempThresh-span; % 减少搜索范围后搜索空间的最小值
step=(maxFea-minFea)/(sectNum-1);% 减少搜索范围后每次搜索的递增量
end
在将循环向量化,并删除一些重复的赋值运算后。代码量大大减少,计算效率也得到极大改善。
% 在特征列上获得最优的阈值分类器
%
% 假设分布满足高斯分布
% 通过高斯模型求取两个类别的均值
% 在两个类别的均值中间搜索最有阈值分类器
% 采用逐步求精的搜索策略
%
% 输入:
% FeatureVector 特征向量,查找最佳弱分类器的特征列;列向量
% Y 每个样本所属类别的标识,长度为rows;列向量
% rows 样本容量
% weight 权重向量,存放当前每个样本的权重值
%
% 输出:
% bestError 搜索到第j列最佳弱分类器得到的最小错误率
% bestThresh 搜索到第j列最佳弱分类器的阈值
% bestBias 搜索到第j列最佳弱分类器的偏置
%
% 迭代4次,每次将区间划分为8个小段
%
% 调用格式为
% [bestError,bestThresh,bestBias]=searchBestWeakLearner(FeatureVector,Y,rows,weight)
%
% 2007-11-07
%
% findBestWeakLearner 扩展版本
%
function [bestError,bestThresh,bestBias]=searchBestWeakLearner(FeatureVector,Y,rows,weight)
% 检查输入特征向量与类标需为列向量
iptcheckinput(FeatureVector,{'logical','numeric'},{'column','nonempty','real'},mfilename, 'FeatureVector', 1);
iptcheckinput(Y,{'logical','numeric'},{'column','nonempty','integer'},mfilename, 'Y', 2);
u1=mean(FeatureVector(find(Y==1))); % 类别1均值
u2=mean(FeatureVector(find(Y==0))); % 类别2均值
iteration=4; % 迭代次数
sectNum=8; % 每次迭代,将搜索区域划分的片段
maxFea=max(u1,u2); % 搜索空间的最大值
minFea=min(u1,u2); % 搜索空间的最小值
step=(maxFea-minFea)/(sectNum-1); % 每次搜索的递增量
bestError=rows; % 初值:最好的分类器错误率
for iter=1:iteration % 迭代iteration次,范围逐步缩小,寻找最优值
tempError=rows; % 初值:第iter次迭代的分类器错误率
for i=1:sectNum % 第iter次迭代的搜索次数
thresh=minFea+(i-1)*step; % 第i次搜索的阈值
h=FeatureVector<thresh; % 所有样本的阈值分类结果
error=sum(weight(find(h~=Y)));% 第iter次迭代第i次搜索加权错误率
p=1;
if(error>0.5) % 若错误率超过0.5,则将偏置反向
error=1-error;
p=-1;
end
if( error<bestError ) % 第iter次迭代最优的错误率 阈值 偏置
bestError=error; % 第iter次迭代最小的错误率
bestThresh=thresh; % 第iter次迭代最小错误分类情况下的阈值
bestBias=p; % 第iter次迭代最小错误分类情况下的偏置
end
end%end for i
% 将搜索范围缩小,继续进行搜索
span=(maxFea-minFea)/8; % 搜索范围减为原有的1/4
maxFea=bestThresh+span; % 减少搜索范围后搜索空间的最大值
minFea=bestThresh-span; % 减少搜索范围后搜索空间的最小值
step=(maxFea-minFea)/(sectNum-1); % 减少搜索范围后每次搜索的递增量
end
针对2000个样本,训练50轮AdaBoost分类器,采用findBestWeakLearner搜索最优分类器耗时150s,采用searchBestWeakLearner耗时50s,仅为原有1/3。
评论0