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。
toself: 程序改变心境
分享到:
相关推荐
在AdaBoost算法中,每一个弱分类器都会被赋予一个权重,这些权重的大小反映了该分类器在最终集成分类器中的重要程度。对于分类错误的样本,AdaBoost会增加它们的权重,使得错误分类的样本在后续的分类器中得到更大的...
在提供的文档"AdaBoost Optimal threshold.doc"中,可能会详细阐述如何在Matlab环境中实现这个过程,包括编写代码来训练弱分类器,更新权重,以及优化阈值。代码可能涉及了矩阵运算、循环结构以及错误率的计算。 ...
Adaboost算法是一种迭代算法,核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次...
总的来说,AdaBoost算法的训练过程是一个迭代优化的过程,通过不断挑选和调整弱分类器,最终构建出能够高效、准确地识别目标的强分类器。这一过程涉及特征提取、弱分类器生成以及权重分配等多个步骤,是机器学习和...
Adaboost算法是一种集成学习...总之,Adaboost算法通过迭代优化弱分类器并调整样本权重,构建出一个能够综合多个分类判断的强分类器。MATLAB中的实现直观地展示了这个过程,并通过图形化输出帮助我们理解模型的性能。
**AdaBoost算法简介** AdaBoost(Adaptive Boosting)是一种...通过不断的迭代和优化,AdaBoost能够从弱分类器中构建出强大的分类系统。在实际项目中,理解并掌握AdaBoost的原理和实现细节,有助于提升模型的性能。
该算法首先使用Adaboost算法提取类Harr小波特征,然后采用进化算法在低维的Adaharr特征空间中寻找全局最优解,得到相应的弱分类器及其权重与阈值,最后将其加权求和得到最优的强分类器,以此建立最优人脸识别系统。...
3. 阈值分类器:我们使用阈值分类器来实现弱分类器,该分类器根据样本的特征值来进行分类。 4. Adaboost模型的训练:我们使用for循环来迭代地训练每个弱分类器,并使用这些弱分类器来构建强分类器。 5. 误差率的计算...
Adaboost算法是一种集成学习方法,它通过迭代的方式结合多个弱分类器,形成一个强分类器。这个PPT,"Adaboost_Tutorial.ppt",显然是为了详细讲解Adaboost算法的核心概念和应用,对于想要深入理解或学习Adaboost的人...
3. **Adaboost训练脚本(train_adaboost.py)**:实现Adaboost算法的Python代码,可能使用了`sklearn`库中的`AdaBoostClassifier`。 4. **Demo演示脚本(demo.py)**:一个简单的示例,演示如何使用训练好的Adaboost...
这个算法的核心思想是迭代地训练一系列的弱分类器,并赋予它们不同的权重,使得在每次迭代中,错误率较高的样本在下一轮训练中被赋予更高的权重,从而引导后续的弱分类器更关注这些难以分类的样本。 1. **基本原理*...
总结来说,Adaboost算法在人脸检测中的应用是机器学习与计算机视觉领域的经典案例,它通过组合多个弱分类器构建出强分类器,有效地解决了复杂问题,如在各种条件下识别和定位人脸。通过深入研究和实践,我们可以更好...
对于初学者来说,这段代码应该包含了从数据准备到结果输出的完整流程,通过详细的注释,可以帮助理解Adaboost算法在目标检测中的应用。通过学习和运行这段代码,不仅可以掌握Adaboost的基本原理,还能了解到MATLAB在...
总结来说,这个MFC程序代码实现了Adaboost算法,用于组合弱分类器构建强分类器,特别是在视频分析中,如人车分离的场景。通过理解和应用这样的代码,开发者可以提升其在机器学习和计算机视觉领域的技能。
它通过迭代的方式组合多个弱分类器,每个弱分类器在训练过程中被赋予不同的权重,使得最终的强分类器能够在整体上表现优秀。在C++中实现AdaBoost算法,我们可以遵循以下几个关键步骤: 1. **数据准备**:首先,我们...
3. 使用AdaBoost算法进行特征选择和分类器训练:AdaBoost算法是一种集成学习算法,通过迭代选择最优特征和最优阈值,并更新样本权重,构建一个强分类器,用于区分人脸和非人脸。 4. 应用级联分类器进行人脸检测:...
其中,\(\alpha_t\)是弱分类器的系数,它与分类器的错误率有关,用于调整弱分类器在最终强分类器中的影响力。为了保证权重之和不变,还需要乘以一个归一化因子。 4. **强分类器构建**:重复步骤2和3,直到得到\(T\...
总结来说,AdaBoost算法通过迭代和权重调整,将多个弱分类器融合为一个强分类器,有效提升分类性能。其灵活性和适应性使其成为解决复杂分类问题的有力工具。理解并熟练运用AdaBoost,有助于我们在实际项目中取得更好...
在实际应用中,我们需要注意调整Adaboost的参数,比如弱分类器的数量、每个分类器的权重调整因子等,以优化模型性能。同时,为了防止过拟合,还可以采用交叉验证等方式进行模型选择和评估。 通过深入理解Adaboost的...