机器学习在数据挖掘、计算机视觉、搜索引擎、医学诊断、证券市场分析、语言与手写识别等领域有着十分广泛的应用,特别是在数据分析挥着越来越重要的作用。在机器学习中,决策树是最基础且应用最广泛的归纳推理算法之一,基于决策树算法,衍生出很多出色的集成算法,如random forest、adaboost、gradient tree boostiong等。

决策树构建的基本步骤如下:

1.开始,所有记录看作一个节点

2.遍历每个变量的每一种分割方式,找到最好的分割点

3.分割成两个节点N1和N2

4.对N1和N2分别继续执行2-3步,直到每个节点足够“纯”为止

决策树归纳是从有类标号的训练元中学习决策模型。常用的决策树算法有ID3,C4.5和CART。它们都是采用贪心(即非回溯的)方法,自顶向下递归的分治方法构造。这几个算法选择属性划分的方法各不相同,ID3使用的是信息增益,C4.5使用的是信息增益率,而CART使用的是Gini基尼指数。

何为信息熵?信息熵是跟所有可能性有关系的。每个可能事件的发生都有个概率。信息熵就是平均而言发生一个事件我们信息量大小。所以数学 上,信息熵其实是信息量的期望。熵越大,说明系统越混乱,携带的信息就越少。熵越小,说明系统越有序,携带的信息就越多。

以下是根据4个条件的成立与否,来决定是否报考深圳大学,通过这10个样本生成决策树,进而对输入的4个条件来判断是否报考深大,以下是样本数据:

  1. #include "opencv2/core/core.hpp"
  2. #include "opencv2/highgui/highgui.hpp"
  3. #include "opencv2/imgproc/imgproc.hpp"
  4. #include "opencv2/ml/ml.hpp"
  5. #include <iostream>
  6. using namespace cv;
  7. using namespace std;
  8. int main( int argc, char** argv )
  9. {
  10. //10个训练样本
  11. float trainingDat[10][4]={{1,0,0,0},{1,1,0,1},{0,0,1,0},
  12. {0,1,1,1},{1,0,0,0},{1,0,1,1},{1,1,1,1},{0,1,1,0},{1,1,0,1},{0,0,0,1}};
  13. Mat trainingDataMat(10,4,CV_32FC1,trainingDat);
  14. //样本的分类结果,作为标签供训练决策树分类器
  15. float responses[10]={1,1,0,0,0,0,1,1,1,0}; // 1代表考取,0代表不考
  16. Mat responsesMat(10,1,CV_32FC1,responses);
  17. float priors[4]={1,1,1,1}; //先验概率,这里每个特征的概率都是一样的
  18. //定义决策树参数
  19. CvDTreeParams params(15, //决策树的最大深度
  20. 1, //决策树叶子节点的最小样本数
  21. 0, //回归精度,本例中忽略
  22. false, //不使用替代分叉属性
  23. 25, //最大的类数量
  24. 0, //不需要交叉验证
  25. false, //不需要使用1SE规则
  26. false, //不对分支进行修剪
  27. priors //先验概率
  28. );
  29. //掩码
  30. Mat varTypeMat(5,1,CV_8U,Scalar::all(1));
  31. CvDTree tree;
  32. tree.train(trainingDataMat, //训练样本
  33. CV_ROW_SAMPLE, //样本矩阵的行表示样本,列表示特征
  34. responsesMat, //样本的响应值矩阵
  35. Mat(),
  36. Mat(),
  37. varTypeMat, //类形式的掩码
  38. Mat(), //没有属性确实
  39. params //决策树参数
  40. );
  41. CvMat varImportance;
  42. varImportance=tree.getVarImportance();
  43. cout<<"各项所占的权重分别为:\n\n";
  44. string item;
  45. for(int i=0;i<varImportance.cols*varImportance.rows;i++)
  46. {
  47. switch (i)
  48. {
  49. case 0:
  50. item="马化腾深大毕业:";
  51. break;
  52. case 1:
  53. item="深大妹子多:";
  54. break;
  55. case 2:
  56. item="深圳台风多:";
  57. break;
  58. case 3:
  59. item="深圳房价高:";
  60. break;
  61. default:
  62. break;
  63. }
  64. float value =varImportance.data.db[i];
  65. cout<<item<<value<<endl<<endl;
  66. }
  67. float myData[4]={0,1,1,0}; //测试样本
  68. Mat myDataMat(4,1,CV_32FC1,myData);
  69. double r=tree.predict(myDataMat,Mat(),false)->value; //获得预测结果
  70. if(r==(double)1.0)
  71. {
  72. cout<<endl<<"预测结果是: 考取深圳大学"<<endl<<endl;
  73. }
  74. else
  75. {
  76. cout<<endl<<"预测结果是: 不考取深圳大学"<<endl<<endl;
  77. }
  78. system("pause");
  79. return 0;
  80. }

输入预测参数 0,1,1,0,结果为:

Opencv决策树分类器应用的更多相关文章

  1. OpenCV训练分类器制作xml文档

    OpenCV训练分类器制作xml文档 (2011-08-25 15:50:06) 转载▼ 标签: 杂谈 分类: 学习 我的问题:有了opencv自带的那些xml人脸检测文档,我们就可以用cvLoad( ...

  2. 基于Python的决策树分类器与剪枝

    作者|Angel Das 编译|VK 来源|Towards Data Science 介绍 决策树分类器是一种有监督的学习模型,在我们关心可解释性时非常有用. 决策树通过基于每个层次的多个问题做出决策 ...

  3. Opencv——级联分类器(AdaBoost)

    API说明: cv::CascadeClassifier::detectMultiScale(InputArray image,//输入灰度图像 CV_OUT std::vector<Rect& ...

  4. 使用opencv训练分类器时,traincascade训练报错:Train dataset for temp stage can not be filled.解决方法

    opencv分类器训练中,出错一般都是路径出错,例如, 1.opencv_traincascade.exe路径 2.负样本路径文件,neg.dat中的样本前路径是否正确 3.移植到别的电脑并修改完路径 ...

  5. OpenCV——级联分类器(CascadeClassifier)

    级联分类器的计算特征值的基础类FeatureEvaluator 功能:读操作read.复制clone.获得特征类型getFeatureType,分配图片分配窗口的操作setImage.setWindo ...

  6. Opencv级联分类器实现人脸识别

    在本章中,我们将学习如何使用OpenCV使用系统相机捕获帧.org.opencv.videoio包的VideoCapture类包含使用相机捕获视频的类和方法.让我们一步一步学习如何捕捉帧 - 第1步: ...

  7. OpenCV 级联分类器

    #include "opencv2/objdetect/objdetect.hpp" #include "opencv2/highgui/highgui.hpp" ...

  8. opencv 训练自己的分类器汇总

    原地址:http://www.cnblogs.com/zengqs/archive/2009/02/12/1389208.html OpenCV训练分类器 OpenCV训练分类器 一.简介 目标检测方 ...

  9. 机器学习之路:python 集成分类器 随机森林分类RandomForestClassifier 梯度提升决策树分类GradientBoostingClassifier 预测泰坦尼克号幸存者

    python3 学习使用随机森林分类器 梯度提升决策树分类 的api,并将他们和单一决策树预测结果做出对比 附上我的git,欢迎大家来参考我其他分类器的代码: https://github.com/l ...

随机推荐

  1. OpenGL_ES-纹理

    OpenGL_ES2.0 -纹理 一:纹理基础: 1: 纹素的概念: 一个二维纹理在OpenGLES2.0中是非经常见的,二维纹理就是一个二维数组,每一个数据元素称为纹素,详细格式例如以下: GL_R ...

  2. swift学习第九天:可选类型以及应用场景

    可选类型的介绍 注意: 可选类型时swift中较理解的一个知识点 暂时先了解,多利用Xcode的提示来使用 随着学习的深入,慢慢理解其中的原理和好处 概念: 在OC开发中,如果一个变量暂停不使用,可以 ...

  3. php实现合并两个排序的链表(很多情况下新建数组装东西比连东西逻辑快很多)($cur=$cur->next;的理解)

    php实现合并两个排序的链表(很多情况下新建数组装东西比连东西逻辑快很多)($cur=$cur->next;的理解) 一.总结 $cur=$cur->next;这句话需要好好理解 指$cu ...

  4. 【u118】日志分析

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况 ...

  5. ios开发网络学习十二:NSURLSession实现文件上传

    #import "ViewController.h" // ----WebKitFormBoundaryvMI3CAV0sGUtL8tr #define Kboundary @&q ...

  6. [Django] Auth django app with rest api

    First, start the env: . bin/activate Then cd to our module cd djangular Create a new app: python man ...

  7. MySQL的表空间管理

    表空间: MySQL没有真正意义上的表空间管理. MySQL的Innodb包含两种表空间文件模式,默认的共享表空间和每个表分离的独立表空间. 一般来说,当数据量很小的时候建议使用共享表空间的管理方式. ...

  8. MySQL key分区(五)

    具体描写叙述总结请看MySQL分区(一) 样例:该样例为本人个人学习总结分享->具体说明-->有问题欢迎前来交流

  9. Hadoop源码分析(MapReduce概论)

    大家都熟悉文件系统,在对HDFS进行分析前,我们并没有花非常多的时间去介绍HDFS的背景.毕竟大家对文件系统的还是有一定的理解的,并且也有非常好的文档.在分析Hadoop的MapReduce部分前,我 ...

  10. Delphi 7验证XML合法性(利用DTD、XSD)

    拥有正确语法的XML被称为“形式良好”的XML.通过DTD验证的XML是“合法”的XML.DTD(文档类型定义)的作用是定义XML 文档的合法构建模块.它使用一系列的合法元素来定义文档结构.XML S ...