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: 程序改变心境