当前位置:首页 > 代码 > 正文

adaboost算法代码java(adaboost算法例题)

admin 发布:2022-12-19 03:58 140


今天给各位分享adaboost算法代码java的知识,其中也会对adaboost算法例题进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

谁能帮忙帮下面这个Adaboost算法的matlab代码加个详细注释

clear all

clc

tr_n=200; %the population of the train set

te_n=200; %the population of the test set

weak_learner_n=20; %the population of the weak_learner

tr_set=[1,5;2,3;3,2;4,6;4,7;5,9;6,5;6,7;8,5;8,8];

te_se=[1,5;2,3;3,2;4,6;4,7;5,9;6,5;6,7;8,5;8,8];

tr_labels=[2,2,1,1,2,2,1,2,1,1];

te_labels=[2,2,1,1,2,2,1,2,1,1];

figure;

subplot(2,2,1);

hold on;axis square;

indices=tr_labels==1;

plot(tr_set(indices,1),tr_set(indices,2),'b*');

indices=~indices;

plot(tr_set(indices,1),tr_set(indices,2),'r*');

title('Training set');

subplot(2,2,2);

hold on;axis square;

indices=te_labels==1;

plot(te_set(indices,1),te_set(indices,2),'b*')3

;

indices=~indices;

plot(te_set(indices,1),te_set(indices,2),'r*');

title('Training set');

% Training and testing error rates

tr_error=zeros(1,weak_learner_n);

te_error=zeros(1,weak_learner_n);

for i=1:weak_learner_n

adaboost_model=adaboost_tr(@threshold_tr,@threshold_te,tr_set,tr_labels,i);

第 1 页

无标题

[L_tr,hits_tr]=adaboost_te(adaboost_model,@threshold_te,te_set,te_labels);

tr_error(i)=(tr_n-hits_tr)/tr_n;

[L_te,hits_te]=adaboost_te(adaboost_model,@threshold_te,te_set,te_labels);

te_error(i)=(te_n-hits_te)/te_n;

end

subplot(2,2,3);

plot(1:weak_learner_n,tr_error);

axis([1,weak_learner_n,0,1]);

title('Training Error');

xlabel('weak classifier number');

ylabel('error rate');

grid on;

subplot(2,2,4);axis square;

plot(1:weak_learner_n,te_error);

axis([1,weak_learner_n,0,1]);

title('Testing Error');

xlabel('weak classifier number');

ylabel('error rate');

grid on;

这里需要另外分别撰写两个函数,其中一个为生成adaboost模型的训练函数,另外为测试测

试样本的测试函数。代码如下:

function

adaboost_model=adaboost_tr(tr_func_handle,te_func_handle,train_set,labels,no_of_

hypothesis)

% 训练函数

adaboost_model = struct('weights',zeros(1,no_of_hypothesis),...

'parameters',[]); %cell(1,no_of_hypothesis));

sample_n = size(train_set,1);

samples_weight = ones(sample_n,1)/sample_n;

for turn=1:no_of_hypothesis

adaboost_model.parameters{turn} =

tr_func_handle(train_set,samples_weight,labels);

[L,hits,error_rate] = te_func_handle(adaboost_model.parameters{turn},...

train_set,samples_weight,labels);

if(error_rate==1)

error_rate=1-eps;

elseif(error_rate==0)

error_rate=eps;

end

% The weight of the turn-th weak classifier

adaboost_model.weights(turn) = log10((1-error_rate)/error_rate);

C=likelihood2class(L);

t_labeled=(C==labels); % true labeled samples

% Importance of the true classified samples is decreased for the next weak

classifier

samples_weight(t_labeled) = samples_weight(t_labeled)*...

((error_rate)/(1-error_rate));

% Normalization

第 2 页

无标题

samples_weight = samples_weight/sum(samples_weight);

end

% Normalization

adaboost_model.weights=adaboost_model.weights/sum(adaboost_model.weights);

-------------

function [L,hits]=adaboost_te(adaboost_model,te_func_handle,test_set,...

true_labels)

%测试函数

hypothesis_n=length(adaboost_model.weights);

sample_n=size(test_set,1);

class_n=length(unique(true_labels));

temp_L=zeros(sample_n,class_n,hypothesis_n);

for i=1:hypothesis_n

[temp_L(:,:,i),hits,error_rate]=te_func_handle(adaboost_model.parameters{i},...

test_set,ones(sample_n,1),true_labels);

temp_L(:,:,i)=temp_L(:,:,i)*adaboost_model.weights(i);

end

L=sum(temp_L,3);

hits=sum(likelihood2class(L)==true_labels);

-------

其中上面函数由于体积太大,另外还需要分别撰写两个阈值函数和一个隶属分配函数。

function model=threshold_tr(train_set,sample_weights,labels)

% 训练阈值函数

model=struct('min_error',[],'min_error_thr',[],'pos_neg',[],'dim',[]);

sample_n=size(train_set,1);

min_error=sum(sample_weights);

min_error_thr=0;

pos_neg='pos';

% for each dimension

for dim=1:size(train_set,2)

sorted=sort(train_set(:,dim),1,'ascend');

% for each interval in the specified dimension

for i=1:(sample_n+1)

if(i==1)

thr=sorted(1)-0.5;

elseif(i==sample_n+1)

thr=sorted(sample_n)+0.5;

else

thr=(sorted(i-1)+sorted(i))/2;

end

ind1=train_set(:,dim)thr;

ind2=~ind1;

tmp_err=sum(sample_weights((labels.*ind1)==2))+sum(sample_weights((labels.*ind2)

==1));

if(tmp_errmin_error)

第 3 页

无标题

min_error=tmp_err;

min_error_thr=thr;

pos_neg='pos';

model.dim=dim;

end

ind1=train_set(:,dim)thr;

ind2=~ind1;

tmp_err=sum(sample_weights((labels.*ind1)==1))+sum(sample_weights((labels.*ind2)

==2));

if(tmp_errmin_error)

min_error=tmp_err;

min_error_thr=thr;

pos_neg='neg';

model.dim=dim;

end

end

end

model.min_error=min_error;

model.min_error_thr=min_error_thr;

model.pos_neg=pos_neg;

function

[L,hits,error_rate]=threshold_te(model,test_set,sample_weights,true_labels)

% 测试阈值函数

feat=test_set(:,model.dim);

if(strcmp(model.pos_neg,'pos'))

ind=(featmodel.min_error_thr)+1;

else

ind=(featmodel.min_error_thr)+1;

end

hits=sum(ind==true_labels);

error_rate=sum(sample_weights(ind~=true_labels));

L=zeros(length(feat),2);

L(ind==1,1)=1;

L(ind==2,2)=1;

function classes=likelihood2class(likelihoods)

% 隶属分配函数

[sample_n,class_n] = size(likelihoods);

maxs = (likelihoods==repmat(max(likelihoods,[],2),[1,class_n]));

classes=zeros(sample_n,1);

for i=1:sample_n

classes(i) = find(maxs(i,:),1);

end

分类算法 - adaboost

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。

Adaboost算法已被证明是一种有效而实用的Boosting算法。该算法是Freund和Schapire于1995年对Boosting算法的改进得到的,其算法原理是通过调整样本权重和弱分类器权值,从训练出的弱分类器中筛选出权值系数最小的弱分类器组合成一个最终强分类器。基于训练集训练弱分类器,每次下一个弱分类器都是在样本的不同权值集上训练获得的。每个样本被分类的难易度决定权重,而分类的难易度是经过前面步骤中的分类器的输出估计得到的。

Adaboost算法在样本训练集使用过程中,对其中的关键分类特征集进行多次挑选,逐步训练分量弱分类器,用适当的阈值选择最佳弱分类器,最后将每次迭代训练选出的最佳弱分类器构建为强分类器。其中,级联分类器的设计模式为在尽量保证感兴趣图像输出率的同时,减少非感兴趣图像的输出率,随着迭代次数不断增加,所有的非感兴趣图像样本都不能通过,而感兴趣样本始终保持尽可能通过为止。

1. 先通过对N个训练样本的学习得到第一个弱分类器

2. 将分错的样本和其他的新数据一起构成一个新的N个的训练样本,通过对这个样本的学习得到第二个弱分类器

3. 将1和2都分错了的样本加上其他的新样本构成另一个新的N个的训练样本,通过对这个样本的学习得到第三个弱分类器

4. 最终经过提升的强分类器。即某个数据被分为哪一类要由各分类器权值决定

由Adaboost算法的描述过程可知,该算法在实现过程中根据训练集的大小初始化样本权值,使其满足均匀分布,在后续操作中通过公式来改变和规范化算法迭代后样本的权值。样本被错误分类导致权值增大,反之权值相应减小,这表示被错分的训练样本集包括一个更高的权重。这就会使在下轮时训练样本集更注重于难以识别的样本,针对被错分样本的进一步学习来得到下一个弱分类器,直到样本被正确分类。在达到规定的迭代次数或者预期的误差率时,则强分类器构建完成。

(1)很好的利用了弱分类器进行级联

(2)可以将不同的分类算法作为弱分类器

(3)AdaBoost具有很高的精度

(4)相对于bagging算法和Random Forest算法,AdaBoost充分考虑的每个分类器的权重

(1)AdaBoost迭代次数也就是弱分类器数目不太好设定,可以使用交叉验证来进行确定

(2)数据不平衡导致分类精度下降

(3)训练比较耗时,每次重新选择当前分类器最好切分点

看到这个算法你是不是似曾相识?对,他们都是由多个弱算法组合成一个强算法的原理。印证了“三个臭皮匠赛过诸葛亮”。但是其实他们棣属于不同的算法框架:

1)Bagging + 决策树 = 随机森林

2)AdaBoost + 决策树 = 提升树

那么bagging和boosting分别是什么呢?

Bagging和Boosting都是将已有的分类或回归算法通过一定方式组合起来,形成一个性能更加强大的分类器,更准确的说这是一种分类算法的组装方法。即将弱分类器组装成强分类器的方法。

A)从原始样本集中抽取训练集。每轮从原始样本集中使用Bootstraping的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中)。共进行k轮抽取,得到k个训练集。(k个训练集之间是相互独立的)

B)每次使用一个训练集得到一个模型,k个训练集共得到k个模型。(注:这里并没有具体的分类算法或回归方法,我们可以根据具体问题采用不同的分类或回归方法,如决策树、感知器等)

C)对分类问题:将上步得到的k个模型采用投票的方式得到分类结果;对回归问题,计算上述模型的均值作为最后的结果。(所有模型的重要性相同)

其主要思想是将弱分类器组装成一个强分类器。在PAC(概率近似正确)学习框架下,则一定可以将弱分类器组装成一个强分类器。关于Boosting的两个核心问题:

通过提高那些在前一轮被弱分类器分错样例的权值,减小前一轮分对样例的权值,来使得分类器对误分的数据有较好的效果。

通过加法模型将弱分类器进行线性组合,比如AdaBoost通过加权多数表决的方式,即增大错误率小的分类器的权值,同时减小错误率较大的分类器的权值。而提升树通过拟合残差的方式逐步减小残差,将每一步生成的模型叠加得到最终模型。

Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。

Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。

Bagging:使用均匀取样,每个样例的权重相等

Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。

Bagging:所有预测函数的权重相等。

Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。

Bagging:各个预测函数可以并行生成

Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。

这两种方法都是把若干个分类器整合为一个分类器的方法,只是整合的方式不一样,最终得到不一样的效果,将不同的分类算法套入到此类算法框架中一定程度上会提高了原单一分类器的分类效果,但是也增大了计算量。

如何用OpenCV自带的adaboost程序训练并检测目标

OpenCV

整个项目的结构图:

编写DetectFaceDemo.java,代码如下:

[java] view

plaincopyprint?

package com.njupt.zhb.test;

import org.opencv.core.Core;

import org.opencv.core.Mat;

import org.opencv.core.MatOfRect;

import org.opencv.core.Point;

import org.opencv.core.Rect;

import org.opencv.core.Scalar;

import org.opencv.highgui.Highgui;

import org.opencv.objdetect.CascadeClassifier;

//

// Detects faces in an image, draws boxes around them, and writes the results

// to "faceDetection.png".

//

public class DetectFaceDemo {

public void run() {

System.out.println("\nRunning DetectFaceDemo");

System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());

// Create a face detector from the cascade file in the resources

// directory.

//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());

//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());

//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误

/*

* Detected 0 faces Writing faceDetection.png libpng warning: Image

* width is zero in IHDR libpng warning: Image height is zero in IHDR

* libpng error: Invalid IHDR data

*/

//因此,我们将第一个字符去掉

String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);

CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);

Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));

// Detect faces in the image.

// MatOfRect is a special container class for Rect.

MatOfRect faceDetections = new MatOfRect();

faceDetector.detectMultiScale(image, faceDetections);

System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));

// Draw a bounding box around each face.

for (Rect rect : faceDetections.toArray()) {

Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));

}

// Save the visualized detection.

String filename = "faceDetection.png";

System.out.println(String.format("Writing %s", filename));

Highgui.imwrite(filename, image);

}

}

package com.njupt.zhb.test;

import org.opencv.core.Core;

import org.opencv.core.Mat;

import org.opencv.core.MatOfRect;

import org.opencv.core.Point;

import org.opencv.core.Rect;

import org.opencv.core.Scalar;

import org.opencv.highgui.Highgui;

import org.opencv.objdetect.CascadeClassifier;

//

// Detects faces in an image, draws boxes around them, and writes the results

// to "faceDetection.png".

//

public class DetectFaceDemo {

public void run() {

System.out.println("\nRunning DetectFaceDemo");

System.out.println(getClass().getResource("lbpcascade_frontalface.xml").getPath());

// Create a face detector from the cascade file in the resources

// directory.

//CascadeClassifier faceDetector = new CascadeClassifier(getClass().getResource("lbpcascade_frontalface.xml").getPath());

//Mat image = Highgui.imread(getClass().getResource("lena.png").getPath());

//注意:源程序的路径会多打印一个‘/’,因此总是出现如下错误

/*

* Detected 0 faces Writing faceDetection.png libpng warning: Image

* width is zero in IHDR libpng warning: Image height is zero in IHDR

* libpng error: Invalid IHDR data

*/

//因此,我们将第一个字符去掉

String xmlfilePath=getClass().getResource("lbpcascade_frontalface.xml").getPath().substring(1);

CascadeClassifier faceDetector = new CascadeClassifier(xmlfilePath);

Mat image = Highgui.imread(getClass().getResource("we.jpg").getPath().substring(1));

// Detect faces in the image.

// MatOfRect is a special container class for Rect.

MatOfRect faceDetections = new MatOfRect();

faceDetector.detectMultiScale(image, faceDetections);

System.out.println(String.format("Detected %s faces", faceDetections.toArray().length));

// Draw a bounding box around each face.

for (Rect rect : faceDetections.toArray()) {

Core.rectangle(image, new Point(rect.x, rect.y), new Point(rect.x + rect.width, rect.y + rect.height), new Scalar(0, 255, 0));

}

// Save the visualized detection.

String filename = "faceDetection.png";

System.out.println(String.format("Writing %s", filename));

Highgui.imwrite(filename, image);

}

}

3.编写测试类:

[java] view

plaincopyprint?

package com.njupt.zhb.test;

public class TestMain {

public static void main(String[] args) {

System.out.println("Hello, OpenCV");

// Load the native library.

System.loadLibrary("opencv_java246");

new DetectFaceDemo().run();

}

}

//运行结果:

//Hello, OpenCV

//

//Running DetectFaceDemo

///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml

//Detected 8 faces

//Writing faceDetection.png

package com.njupt.zhb.test;

public class TestMain {

public static void main(String[] args) {

System.out.println("Hello, OpenCV");

// Load the native library.

System.loadLibrary("opencv_java246");

new DetectFaceDemo().run();

}

}

//运行结果:

//Hello, OpenCV

//

//Running DetectFaceDemo

///E:/eclipse_Jee/workspace/JavaOpenCV246/bin/com/njupt/zhb/test/lbpcascade_frontalface.xml

//Detected 8 faces

//Writing faceDetection.png

Adaboost算法

链接:

1. 线性回归总结

2. 正则化

3. 逻辑回归

4. Boosting

5. Adaboost算法

转自: 原地址

提升方法(boosting)是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类的性能。

本章首先介绍提升方法的思路和代表性的提升算法AdaBoost,然后通过训练误差分析探讨AdaBoost为什么能够提高学习精度,并且从前向分布加法模型的角度解释AdaBoost,最后叙述提升方法更具体的事例——提升术(boosting tree)。AdaBoost算法是1995年由Freund和Schapire提出的,提升树是2000年由Friedman等人提出的。(开头几段内容来自《统计学习方法》)

Adaboost算法基本原理

提升方法的基本思路

提升方法是基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。通俗点说,就是”三个臭皮匠顶个诸葛亮”。

Leslie Valiant 首先提出了“强可学习(strongly learnable)”和”弱可学习(weakly learnable)”的概念,并且指出:在概率近似正确(probably approximately correct, PAC)学习的框架中,一个概念(一个类),如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么就称这个概念是强可学习的,如果正确率不高,仅仅比随即猜测略好,那么就称这个概念是弱可学习的。 2010年的图灵奖给了L. Valiant,以表彰他的PAC理论

。非常有趣的是Schapire后来证明强可学习与弱可学习是等价的,也就是说,在PAC学习的框架下,一个概念是强可学习的充要条件是这个概念是可学习的。

这样一来,问题便成为,在学习中,如果已经发现了“弱学习算法”,那么能否将它提升(boost)为”强学习算法”。大家知道,发现弱学习算法通常比发现强学习算法容易得多。那么如何具体实施提升,便成为开发提升方法时所要解决的问题。关于提升方法的研究很多,有很多算法被提出。最具代表性的是AdaBoost算法(Adaptive Boosting Algorithm),可以说,AdaBoost实现了PAC的理想。

对于分类问题而言,给定一个训练数据,求一个比较粗糙的分类器(即弱分类器)要比求一个精确的分类器(即强分类器)容易得多。提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器,然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(训练数据中的各个数据点的权值分布),调用弱学习算法得到一个弱分类器,再改变训练数据的概率分布,再调用弱学习算法得到一个弱分类器,如此反复,得到一系列弱分类器。

这样,对于提升方法来说,有两个问题需要回答:一是在每一轮如何如何改变训练数据的概率分布;而是如何将多个弱分类器组合成一个强分类器。

关于第一个问题,AdaBoost的做法是,提高那些被前几轮弱分类器线性组成的分类器错误分类的的样本的权值。这样一来,那些没有得到正确分类的数据,由于权值加大而受到后一轮的弱分类器的更大关注。于是,分类问题被一系列的弱分类器”分而治之”。至于第二个问题,AdaBoost采取加权多数表决的方法。具体地,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。

AdaBoost的巧妙之处就在于它将这些想法自然而然且有效地实现在一种算法里。

AdaBoost算法

输入:训练数据集T={(x1,y1),(x2,y2),…,(xN,yN)},其中xi∈X⊆Rn,表示输入数据,yi∈Y={-1,+1},表示类别标签;弱学习算法。

输出:最终分类器G(x)。

流程:

初始化训练数据的概率分布,刚开始为均匀分布

D1=(w11,w12,…,w1N), 其中w1i=

, i=1,2,..,N . Dm表示在第m轮迭代开始前,训练数据的概率分布(或权值分布),wmi表示在第i个样本的权值,

计算Gm(x)在训练数据集上的分类误差率

更新训练数据的权值分布

这里,Zm是规范化因子

,它使Dm+1称为一个概率分布。将M个基本分类器进行线性组合

得到最终分类器

对AdaBoost算法作如下说明:

步骤(1) 初始时假设训练数据集具有均匀分布,即每个训练样本在弱分类器的学习中作用相同。

步骤(2) (c) αm表示Gm(x)在最终分类器中的重要性。由式(公式 2)可知,当em ≤1/2时,αm≥0,并且αm随着em的减小而增大,即意味着误差率越小的基本分类器在最终分类器中的作用越大。

(d) 式可以写成:

由此可知,被弱分类器Gm(x)误分类的样本的权值得以扩大,而被正确分类的样本的权值得以缩小。因此误分类样本在下一轮学习中起到更大的作用。不改变所给的训练数据,而不断改变训练数据权值的分布,使得训练数据在基本分类器的学习中起不同的作用,这是AdaBoost的一个特点。

步骤(3) 这里,αm之和并不等于1。f(x)的符号决定实例x的类别,f(x)的绝对值表示分类的确信度。利用基本分类器进行线性组合得到最终分类器是AdaBoost的另一个特点。

AdaBoost的例子

例 1 给定如表 1所示训练数据。假设弱分类器由G(x)=sign(x-v)产生,其中v为常量,表示阀值。试用AdaBoost算法学习一个强分类器。

表 1 训练数据样本

序号 1 2 3 4 5 6 7 8 9 10

x 0 1 2 3 4 5 6 7 8 9

y 1 1 1 -1 -1 -1 1 1 1 -1

初始化训练数据的权值分布

当m=1,进行第一轮迭代

在权值分布为D1的情况下,用一根垂直扫描线从左到右扫描,会发现,阀值v取2.5时分类误差率最低,故基本分类器G1(x)=sign(x-2.5)。

,第7,8,9个实例被误分类。

=0.4236。

更新训练数据的权值分布:

分类器sign[f1(x)]在训练数据集上有3个误分类点,因此,继续迭代。

当m=2,进行第二轮迭代

在权值分布为D2的情况下,阀值v取8.5时分类误差率最低,故基本分类器G2(x)=sign(x-8.5)。

G2(x)在训练数据集上的误差率e2=0.07143+0.07143+0.07143+0.07143,第4,5,6个实例被错误分类。

计算G2(x)的系数:α2=0.6496。

更新训练数据的权值分布:

分类器sign[f2(x)]在训练数据集上有3个误分类点,因此,继续迭代。

当m=3,进行第三轮迭代

在权值分布为D3的情况下,阀值v取5.5时分类误差率最低,故基本分类器G3(x)=-sign(x-5.5),注意,这里符号反向了。

G3(x)在训练数据集上的误差率e3=0.0455+0.0455+0.0455+0.0455=0.1820,第1,2,3,10个实例被误分类。

计算G3(x)的系数:α2=0.7514。

更新训练数据的权值分布:

分类器sign[f3(x)]在训练数据集上的误分类点个数为0,因此,终止迭代。

于是,最终分类器为

注意,G1(x),G2(x)和G3(x),是一个sign函数,从图像看是一个方波图,而最终分类器G(x)也是一个方波图,由三个波形图叠加合成。从信号的角度看,这是振幅叠加。G1(x),G2(x)和G3(x)都是弱分类器,分类正确率仅大于0.5,但线性组合而成的分类器G(x)正确率是100%,是一个强分类器。

AdaBoost算法的训练误差分析

AdaBoost最基本的性质是它能在学习过程中不断减少训练误差,关于这个问题有下面的两个定理:

**定理 1 (AdaBoost的训练误差界****) **AdaBoost算法的最终分类器的训练误差界为

先推导如下:

( 定理**** 1 的证明@特级飞行员舒克有很大贡献)

这一定理说明,可以在每一轮选取最适当的Gm使得Zm最小,从而使训练误差下降最快。对二类分类问题,有如下结果:

定理 2 (二类分类问题AdaBoost的训练误差界)

因此等式

(十 七)boosting\adaBoosting--迭代算法

Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器)。其算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值。将修改过权值的新数据集送给下层分类器进行训练,最后将每次训练得到的分类器最后融合起来,作为最后的决策分类器。使用adaboost分类器可以排除一些不必要的训练数据特徵,并将关键放在关键的训练数据上面。

(1) 二分类,多类单标签问题、多类多标签问题、大类单标签问题

(2)回归问题

注意 :每一次都会更新样本的权重(数据的划分正确,降低该样本的权重,数据划分错误就增大它的权重)---》计算该弱分类器的误差率--》更新公式---》再根据公式更新下一轮的样本的权重。

通过以上的操作----经过T次的循环。就得到了最终想要的强分类器。

具体的公式及详细说明如下:

每次迭代都是选择相同的模型,上面的ht(x)表示的是弱学习器,前面的αt表示的是该弱学习器的权重。

多个弱学习器经过多次的迭代,最终得到的就是强学习器H(x)。

其中:sign代表的是符号函数

其最终返回的是那种分类

adaboost算法代码java的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于adaboost算法例题、adaboost算法代码java的信息别忘了在本站进行查找喔。

版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;

本文地址:http://ahzz.com.cn/post/2037.html


取消回复欢迎 发表评论:

分享到

温馨提示

下载成功了么?或者链接失效了?

联系我们反馈

立即下载