一、强分类器训练过程

算法原理如下(参考自VIOLA P, JONES M. Robust real time object detection[A] . 8th IEEE International Conference on Computer Vision[C] . Vancouver , 2001.)

  • 给定样本 (x1; y1) , . . . , (xn; yn) ; 其中yi = 0表示负样本,yi =1表示正样本;
  • 初始化权重:负样本权重W0i= 1/2m, 正样本权重W1i = 1/ 2l,其中m为负样本总数,l为正样本总数;
  • 对于t = 1, ... T(T为训练次数):
    1. 权重归一化,简单说就是使本轮所有样本的权重的和为1;
    2. 根据每一个特征训练简单分类器,仅使用一个特征;
    3. 从所有简单分类器中选出一个分错率最低的分类器,为弱分类器;
    4. 更新权重
  • 最后组合T个弱分类器为强分类器

二、代码实现及说明(python)

目的:训练得到一个强分类器,该强分类器分错率低于预设值,且该强分类器由若干个弱分类器(对应单个特征)组成,通过若干个分类器及其权重计算得到的值对样本进行分类。

  1. def adaBoostTrainDS(dataArr,classLabels,numIt=40):
  2. weakClassArr = [] #存放强分类器的所有弱分类器信息
  3. m = shape(dataArr)[0]
  4. D = mat(ones((m,1))/m) #权重初始化
  5. aggClassEst = mat(zeros((m,1)))
  6. for i in range(numIt):
  7. bestStump,error,classEst = buildStump(dataArr,classLabels,D)#根据训练样本、权重得到一个弱分类器
  8.  
  9. print "D:",D.T
  10. alpha = float(0.5*log((1.0-error)/max(error,1e-16)))#计算alpha值,该值与分错率相关,分错率越小,该值越大,弱分类器权重
  11. #max(error,1e-16)用于确保错误为0时不会发生除0溢出
  12. bestStump['alpha'] = alpha
  13. weakClassArr.append(bestStump) #存储该弱分类
  14. print "classEst: ",classEst.T
  15. expon = multiply(-1*alpha*mat(classLabels).T,classEst)
  16. D = multiply(D,exp(expon)) #重新计算样本权重
  17. D = D/D.sum() #归一化
  18. #计算当前强分类器的分错率,达到预期要求即停止
  19. aggClassEst += alpha*classEst
  20. print "aggClassEst: ",aggClassEst.T
  21. aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1))) #计算数据点哪个是错误
  22. print 'aggErrors: ',sign(aggClassEst) != mat(classLabels).T
  23. print 'aggErrors: ',aggErrors
  24. errorRate = aggErrors.sum()/m #计算错误率
  25. print "total error: ",errorRate
  26. if errorRate == 0.0: break
  27. return weakClassArr

三、运行结果

训练样本:

datMat = matrix([[ 1. ,  2.1,  0.3],
                                 [ 2. ,  1.1,  0.4],
                                 [ 1.3,  1. ,  1.2],
                                 [ 1. ,  1. ,  1.1],
                                 [ 2. ,  1. ,  1.3],
                                 [ 7. ,  2. ,  0.35]])
    classLabels = [1.0, 1.0, 1.0, -1.0, -1.0, -1.0]

训练得到的强分类器(强分类器分错率:0%,单个弱分类器最小分错率为33%,在上一篇已经测试过):

[{'dim': 0, 'ineq': 'gt', 'thresh': 1.6000000000000001, 'alpha': 0.34657359027997275},

{'dim': 1, 'ineq': 'lt', 'thresh': 1.0, 'alpha': 0.5493061443340549},

{'dim': 0, 'ineq': 'gt', 'thresh': 2.2000000000000002, 'alpha': 0.5493061443340549},

{'dim': 2, 'ineq': 'gt', 'thresh': 0.29999999999999999, 'alpha': 0.4777557225137181},

{'dim': 0, 'ineq': 'lt', 'thresh': 1.0, 'alpha': 0.49926441505556346}]

手动计算分类:

针对第一个样本[ 1. ,  2.1, 
0.3],利用强分类器计算结果如下:
- 0.34657359027997275

- 0.5493061443340549

-
0.5493061443340549

+
0.4777557225137181

+
0.49926441505556346

= -0.468165741378801--->小于0,正样本

针对第六个样本[
7. ,  2. ,  0.35],利用强分类器计算结果如下:
+ 0.34657359027997275

- 0.5493061443340549

+
0.5493061443340549

+
0.4777557225137181

-
0.49926441505556346

= +0.3250648977381274--->大于0,负样本

其它样本的计算类似

结论:

强分类器分类,即通过若干个分类器的权重的正负号计算得出,而正负号是通过该若分类器的阈值判断得到;

强分类器比弱分类器准确率高。

【AdaBoost算法】强分类器训练过程的更多相关文章

  1. 【AdaBoost算法】弱分类器训练过程

    一.加载数据(正样本.负样本特征) def loadSimpData(): #样本特征 datMat = matrix([[ 1. , 2.1, 0.3], [ 2. , 1.1, 0.4], [ 1 ...

  2. SIGAI机器学习第二十一集 AdaBoost算法2

    讲授Boosting算法的原理,AdaBoost算法的基本概念,训练算法,与随机森林的比较,训练误差分析,广义加法模型,指数损失函数,训练算法的推导,弱分类器的选择,样本权重削减,实际应用. 大纲: ...

  3. adaboost算法

    三 Adaboost 算法 AdaBoost 是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器,即弱分类器,然后把这些弱分类器集合起来,构造一个更强的最终分类器.(很多博客里说的三个臭皮匠 ...

  4. AdaBoost 算法-分析波士顿房价数据集

    公号:码农充电站pro 主页:https://codeshellme.github.io 在机器学习算法中,有一种算法叫做集成算法,AdaBoost 算法是集成算法的一种.我们先来看下什么是集成算法. ...

  5. 使用 AdaBoost 元算法提高分类器性能

    前言 有人认为 AdaBoost 是最好的监督学习的方式. 某种程度上因为它是元算法,也就是说它会是几种分类器的组合.这就好比对于一个问题能够咨询多个 "专家" 的意见了. 组合的 ...

  6. 第九篇:使用 AdaBoost 元算法提高分类器性能

    前言 有人认为 AdaBoost 是最好的监督学习的方式. 某种程度上因为它是元算法,也就是说它会是几种分类器的组合.这就好比对于一个问题能够咨询多个 "专家" 的意见了. 组合的 ...

  7. 机器学习——提升方法AdaBoost算法,推导过程

    0提升的基本方法 对于分类的问题,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类的分类规则(强分类器)容易的多.提升的方法就是从弱分类器算法出发,反复学习,得到一系列弱分类器(又 ...

  8. 基于AdaBoost算法——世纪晟结合Haar-like特征训练人脸检测识别

      AdaBoost 算法是一种快速人脸检测算法,它将根据弱学习的反馈,适应性地调整假设的错误率,使在效率不降低的情况下,检测正确率得到了很大的提高.   系统在技术上的三个贡献: 1.用简单的Haa ...

  9. 【Adaboost算法】C++转C, 分类器结构设计

    一.参考OpenCV的CascadeClassifier类LBPEvaluator类 如下,筛选出存放分类器相关信息的成员变量: class CV_EXPORTS_W CascadeClassifie ...

随机推荐

  1. [转载]SharePoint 2013测试环境安装配置指南

    软件版本 Windows Server 2012 标准版 SQL Server 2012 标准版 SharePoint Server 2013 企业版 Office Web Apps 2013 备注: ...

  2. Robot Framework自动化测试(五)--- 开发系统关键字

    最近一直在用robot framework 做自动化测试项目,老实说对于习惯直接使用python的情况下,被框在这个工具里各种不爽,当然,使用工具的好处也很多,降低了使用成本与难度:当然,在享受工具带 ...

  3. 使用 PSD Validator 在线校验 PSD 文件的质量

     PSD Validator 可以帮助你在线校验 PSD 文件的质量,使用的规则来自 Photoshop Etiquette.Photoshop Etiquette 整理了 PSD 文件的规范,例如删 ...

  4. Xcode 报错信息

    1.CUICatalog: Invalid asset name supplied: 原因是: 使用的方法[UIImage imageNamed:@""]; @"&quo ...

  5. iOS-文字自适应

    1.自动改变Label的宽和高 - (void)createLabel1 { UILabel * label = [[UILabel alloc] initWithFrame:CGRectZero]; ...

  6. Mysql学习笔记(十一)临时表+视图

    学习内容: 临时表和视图的基本操作... 临时表与视图的使用范围... 1.临时表   临时表:临时表,想必大家都知道这个概念的存在...但是我们什么时候应该使用到临时表呢?当一个数据库存在着大量的数 ...

  7. Android上的事件流操作数据库

    最近在浏览某篇有关事件流的文章时,里面提到了数据的流处理,兴趣来了,就想看看能否在Android端实现一个. 根据文章的介绍,将每次数据的变更事件,像是插入,删除或者更新等,记为一个不可变的事件,让数 ...

  8. 基于HTML5的电信网管3D机房监控应用

    先上段视频,不是在玩游戏哦,是规规矩矩的电信网管企业应用,嗯,全键盘的漫游3D机房: 随着PC端支持HTML5浏览器的普及,加上主流移动终端Android和iOS都已支持HTML5技术,新一代的电信网 ...

  9. Struts 2 拦截器

    什么是Struts 2 拦截器  拦截器就是当用户请求后台Action类时在Action的Excute()方法执行前和Result返回魔板试图之后(将页面(数据)发送给浏览器渲染之前)所需要的一些通用 ...

  10. ASP.Net中Session失效的一种编程思路

    在写一个客户的B/S结构应用程序时,突然发现一个技巧,不知道是否是MS的一个BUG,给相关的有研究的朋友原先考虑写一个检查Session的类,Session失效后,必须转向登陆页面,可每一个调用该类的 ...