`
kofsky
  • 浏览: 201780 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

AdaBoost算法中寻找最优阈值分类器的代码优化

阅读更多

    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会增加它们的权重,使得错误分类的样本在后续的分类器中得到更大的...

    AdaBoost-Optimal-threshold.rar_Adaboost分类_adaboost阈值_matlab adab

    在提供的文档"AdaBoost Optimal threshold.doc"中,可能会详细阐述如何在Matlab环境中实现这个过程,包括编写代码来训练弱分类器,更新权重,以及优化阈值。代码可能涉及了矩阵运算、循环结构以及错误率的计算。 ...

    Adaboost算法.docx

    Adaboost算法是一种迭代算法,核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次...

    AdaBoost算法的训练过程

    总的来说,AdaBoost算法的训练过程是一个迭代优化的过程,通过不断挑选和调整弱分类器,最终构建出能够高效、准确地识别目标的强分类器。这一过程涉及特征提取、弱分类器生成以及权重分配等多个步骤,是机器学习和...

    adaboost算法matlab实现

    Adaboost算法是一种集成学习...总之,Adaboost算法通过迭代优化弱分类器并调整样本权重,构建出一个能够综合多个分类判断的强分类器。MATLAB中的实现直观地展示了这个过程,并通过图形化输出帮助我们理解模型的性能。

    AdaBoost算法java实现

    **AdaBoost算法简介** AdaBoost(Adaptive Boosting)是一种...通过不断的迭代和优化,AdaBoost能够从弱分类器中构建出强大的分类系统。在实际项目中,理解并掌握AdaBoost的原理和实现细节,有助于提升模型的性能。

    Adaboost算法在人脸识别系统中的应用.pdf

    该算法首先使用Adaboost算法提取类Harr小波特征,然后采用进化算法在低维的Adaharr特征空间中寻找全局最优解,得到相应的弱分类器及其权重与阈值,最后将其加权求和得到最优的强分类器,以此建立最优人脸识别系统。...

    【老生谈算法】adaboost算法matlab实现.doc.doc

    3. 阈值分类器:我们使用阈值分类器来实现弱分类器,该分类器根据样本的特征值来进行分类。 4. Adaboost模型的训练:我们使用for循环来迭代地训练每个弱分类器,并使用这些弱分类器来构建强分类器。 5. 误差率的计算...

    一个非常好的学习Adaboost算法的ppt

    Adaboost算法是一种集成学习方法,它通过迭代的方式结合多个弱分类器,形成一个强分类器。这个PPT,"Adaboost_Tutorial.ppt",显然是为了详细讲解Adaboost算法的核心概念和应用,对于想要深入理解或学习Adaboost的人...

    Adaboost算法代码

    3. **Adaboost训练脚本(train_adaboost.py)**:实现Adaboost算法的Python代码,可能使用了`sklearn`库中的`AdaBoostClassifier`。 4. **Demo演示脚本(demo.py)**:一个简单的示例,演示如何使用训练好的Adaboost...

    adaboost算法代码包

    这个算法的核心思想是迭代地训练一系列的弱分类器,并赋予它们不同的权重,使得在每次迭代中,错误率较高的样本在下一轮训练中被赋予更高的权重,从而引导后续的弱分类器更关注这些难以分类的样本。 1. **基本原理*...

    基于adaboost算法的人脸检测简介

    总结来说,Adaboost算法在人脸检测中的应用是机器学习与计算机视觉领域的经典案例,它通过组合多个弱分类器构建出强分类器,有效地解决了复杂问题,如在各种条件下识别和定位人脸。通过深入研究和实践,我们可以更好...

    基于adaboost算法的目标检测MATLAB代码

    对于初学者来说,这段代码应该包含了从数据准备到结果输出的完整流程,通过详细的注释,可以帮助理解Adaboost算法在目标检测中的应用。通过学习和运行这段代码,不仅可以掌握Adaboost的基本原理,还能了解到MATLAB在...

    adaboost弱分类器的mfc程序代码

    总结来说,这个MFC程序代码实现了Adaboost算法,用于组合弱分类器构建强分类器,特别是在视频分析中,如人车分离的场景。通过理解和应用这样的代码,开发者可以提升其在机器学习和计算机视觉领域的技能。

    AdaBoost算法 的简单C ++实现_代码_下载

    它通过迭代的方式组合多个弱分类器,每个弱分类器在训练过程中被赋予不同的权重,使得最终的强分类器能够在整体上表现优秀。在C++中实现AdaBoost算法,我们可以遵循以下几个关键步骤: 1. **数据准备**:首先,我们...

    毕业设计-基于Haar特征与AdaBoost算法的人脸检测系统(源码+使用说明+6000个人脸样本数据集).zip

    3. 使用AdaBoost算法进行特征选择和分类器训练:AdaBoost算法是一种集成学习算法,通过迭代选择最优特征和最优阈值,并更新样本权重,构建一个强分类器,用于区分人脸和非人脸。 4. 应用级联分类器进行人脸检测:...

    AdaBoost算法流程和证明

    其中,\(\alpha_t\)是弱分类器的系数,它与分类器的错误率有关,用于调整弱分类器在最终强分类器中的影响力。为了保证权重之和不变,还需要乘以一个归一化因子。 4. **强分类器构建**:重复步骤2和3,直到得到\(T\...

    AdaBoost算法原理

    总结来说,AdaBoost算法通过迭代和权重调整,将多个弱分类器融合为一个强分类器,有效提升分类性能。其灵活性和适应性使其成为解决复杂分类问题的有力工具。理解并熟练运用AdaBoost,有助于我们在实际项目中取得更好...

    adaboost经典的分类算法代码.rar

    在实际应用中,我们需要注意调整Adaboost的参数,比如弱分类器的数量、每个分类器的权重调整因子等,以优化模型性能。同时,为了防止过拟合,还可以采用交叉验证等方式进行模型选择和评估。 通过深入理解Adaboost的...

Global site tag (gtag.js) - Google Analytics