本文共 3094 字,大约阅读时间需要 10 分钟。
简要叙述一下AdaBoost算法的主要过程:
AdaBoost为每个数据样本分配权重,权重符合概率分布,初始权重符合均匀分布,串行训练M个模型,依据每轮训练的模型的错误率(被误分类样本的权重之和)确定当前模型在最终模型中的权重,以及更新训练样本的权重,误分类样本权重升高,分类正确的样本权重降低。
下图的算法流程来自于《统计学习方法》。
下面通过具体的实例来理解AdaBoost算法的流程,例子来自于《统计学习方法》。
第一轮迭代:
此时得到的组合模型中只有一个 ,此时 的分类结果就是最终模型的分类结果。第一轮迭代中6,7,8(6,7,8指的是x的值,不是指的序号)被误分类。此时得到的组合模型在训练数样本上的预测结果如下:
X | y | 分类结果 | |||
0 | 1 | 0.4236 | 0.4236 | 1 | 正确 |
1 | 1 | 0.4236 | 0.4236 | 1 | 正确 |
2 | 1 | 0.4236 | 0.4236 | 1 | 正确 |
3 | -1 | -0.4236 | -0.4236 | -1 | 正确 |
4 | -1 | -0.4236 | -0.4236 | -1 | 正确 |
5 | -1 | -0.4236 | -0.4236 | -1 | 正确 |
6 | 1 | -0.4236 | -0.4236 | -1 | 错误 |
7 | 1 | -0.4236 | -0.4236 | -1 | 错误 |
8 | 1 | -0.4236 | -0.4236 | -1 | 错误 |
9 | -1 | -0.4236 | -0.4236 | -1 | 正确 |
其中sign符号函数如下:
第二轮迭代:
第二轮迭代中3,4,5被误分类,此时得到的最终模型是前两轮模型的线性组合。那么在当前的组合条件下 的分类结果是怎样的?
X | y | 分类结果 | ||||
0 | 1 | 0.4236 | 0.6496 | 1.0732 | 1 | 正确 |
1 | 1 | 0.4236 | 0.6496 | 1.0732 | 1 | 正确 |
2 | 1 | 0.4236 | 0.6496 | 1.0732 | 1 | 正确 |
3 | -1 | -0.4236 | 0.6496 | 0.226 | 1 | 错误 |
4 | -1 | -0.4236 | 0.6496 | 0.226 | 1 | 错误 |
5 | -1 | -0.4236 | 0.6496 | 0.226 | 1 | 错误 |
6 | 1 | -0.4236 | 0.6496 | 0.226 | 1 | 正确 |
7 | 1 | -0.4236 | 0.6496 | 0.226 | 1 | 正确 |
8 | 1 | -0.4236 | 0.6496 | 0.226 | 1 | 正确 |
9 | -1 | -0.4236 | -0.6496 | -1.0732 | -1 | 正确 |
第三轮迭代:
第三轮迭代中0,1,2,9被误分类,此时得到的最终模型是前三轮模型的线性组合。那么在当前的组合条件下 的分类结果是怎样的?
X | y | 分类结果 | |||||
0 | 1 | 0.4236 | 0.6496 | -0.7514 | 0.3218 | 1 | 正确 |
1 | 1 | 0.4236 | 0.6496 | -0.7514 | 0.3218 | 1 | 正确 |
2 | 1 | 0.4236 | 0.6496 | -0.7514 | 0.3218 | 1 | 正确 |
3 | -1 | -0.4236 | 0.6496 | -0.7514 | -0.5254 | -1 | 正确 |
4 | -1 | -0.4236 | 0.6496 | -0.7514 | -0.5254 | -1 | 正确 |
5 | -1 | -0.4236 | 0.6496 | -0.7514 | -0.5254 | -1 | 正确 |
6 | 1 | -0.4236 | 0.6496 | 0.7514 | 0.9774 | 1 | 正确 |
7 | 1 | -0.4236 | 0.6496 | 0.7514 | 0.9774 | 1 | 正确 |
8 | 1 | -0.4236 | 0.6496 | 0.7514 | 0.9774 | 1 | 正确 |
9 | -1 | -0.4236 | -0.6496 | 0.7514 | -0.3218 | -1 | 正确 |
经过三轮迭代之后,在训练集上的错误率为0。
nTrainPosData = 200;nTrainNegData = 200;nLevels = 200;W = 19;H = 19; PTrainData = zeros(W, H, nTrainPosData);NTrainData = zeros(W, H, nTrainNegData);%% read train datafileFolder = '.\Datasets\FACES\';pfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));fileNames = {pfiles.name}'; %转换成细胞数组aa = 1:length(pfiles); %这段程序还没有看懂 a = randperm(length(aa));trainPosPerm = aa(a(1:nTrainPosData));for i=1:size(PTrainData,3) PTrainData(:,:,i) =imread(strcat(fileFolder,fileNames{i}));endfileFolder = '.\Datasets\FACES\';nfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));fileNames = {nfiles.name}'; %转换成细胞数组aa = 1:length(nfiles); %这段程序还没有看懂 a = randperm(length(aa)); trainNegPerm = aa(a(1:nTrainNegData));for i=1:size(NTrainData,3) NTrainData(:,:,i) =imread(strcat(fileFolder,fileNames{i}));end%% read test datatestPosPerm = setdiff(1:length(pfiles), trainPosPerm);testNegPerm = setdiff(1:length(nfiles), trainNegPerm);PTestData = zeros(W, H, length(testPosPerm));NTestData = zeros(W, H, length(testNegPerm));fileFolder = '.\Datasets\FACES\';pfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));fileNames = {pfiles.name}'; %转换成细胞数组% for i=1:size(PTestData,3)for i=1:200 PTestData(:,:,i) =imread(strcat(fileFolder,fileNames{i}));endfileFolder = '.\Datasets\FACES\';nfiles = dir(fullfile(strcat(fileFolder,'*.pgm')));fileNames = {nfiles.name}'; %转换成细胞数组% for i=1:size(NTestData,3)for i=1:200 NTestData(:,:,i) =imread(strcat(fileFolder,fileNames{i}));end%%Cparams = Train(PTrainData, NTrainData, PTestData, NTestData, nLevels);save('.\Cparams.mat', 'Cparams');
完整代码添加QQ1575304183
转载地址:https://blog.csdn.net/qq_34763204/article/details/116352802 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!