opencv3/C++ 机器学习-决策树/DTrees

2023-10-27

决策树/Decision Tree

决策树/Decision Tree是一棵二叉树(每棵非叶子节点有两个子节点的树)。可用于分类或回归问题。对于分类问题(形成分类树),每个叶节点都标有一个类标签;多个叶节点可能具有相同的标签。对于回归问题(形成回归树),每个叶结点分配一个常量,所以回归函数是分段常量。

决策树从根结点递归构造。所有训练数据(特征向量和响应)用于分割根节点。在每个节点中,根据一些标准找到最佳决策规则(最好的“主要”分割)。如分类问题用“不/纯度”,回归问题用方差和。
关于不纯度,不同算法使用的计算方法不一,如ID3用信息增益/Information Gain作为不纯度;C4.5用信息增益率/Information Gain Ratio作为不纯度;CART用基尼系数/Gini Index作为不纯度。

然后,若有必要,找到替代分裂点。替代分裂点类似于训练数据的主要分割结果。 所有的数据根据初始和替代分裂点来划分给左、右孩子结点(就像在预测算法里做的一样)。然后算法递归地继续分裂左右孩子结点。

节点递归过程的终止条件:

  • 树的深度达到了指定的最大值。
  • 在该结点训练样本的数目少于指定阈值。
  • 在该结点所有的样本属于同一类(如果是回归的话,变化已非常小)。
  • 能选择到的最好的分裂跟随机选择相比已经基本没有什么有意义的改进了。

树创建好之后,如有必要,可以使用交叉验证对其进行修剪。将可能导致模型过拟合的某些分支剪掉。通常仅适用于单决策树。树集合通常会建立一些足够小的树并且用他们自身的保护机制来防止过拟合。

变量重要性:
决策树除了用于预测之外,还可以用在多变量分析上。 构建的决策树算法的一个关键特性是它能够计算每个变量的重要性(相对决策力)。 每个变量的重要性的计算是在所有的在这个变量上的分裂进行的,不管是初始的还是替代的。这样的话,要准确计算变量重要性,即使没有缺失数据,替代分裂也必须包含在训练参数中。

OpenCV DTrees类

DTree可以表示一个单独的决策树,也可以表示树集成分类器中的一个基础分类器(Boosting或Random Trees)。

常用函数
  • virtual void setMaxDepth(int val) ;
    树的最大可能深度。 训练算法在节点深度小于maxDepth的情况下分割节点。根节点具有零深度。如果符合其他终止标准或修剪树,则实际深度会更小。默认值为INT_MAX。

  • virtual void setMinSampleCount(int val) ;
    节点最小样本数量。若节点中的样本数量小于该值,则不会被分割。默认为10。

  • virtual void setUseSurrogates(bool val) ;
    若为true,则建立替代分裂点。 这些分裂点可以处理丢失的数据并正确计算变量的重要性。 默认值为false。

  • virtual void setCVFolds(int val);
    如果CVFolds> 1,则算法使用K折叠交叉验证修剪构建好的决策树,其中K等于CVFolds。 默认值是10。

  • virtual void setUse1SERule(bool val);
    若为true,则修剪将更加严格,使树更紧凑,抗噪声能力更强,但会降低部分准确度。 默认值为true。

  • virtual void setTruncatePrunedTree(bool val);
    若为true,则修剪后的分支会被完全移除。否则分支将被保留,并可能从原决策树中获得结果。 默认值为true。

决策树示例

从文件points.txt中读取点坐标以及对应的分类,然后建立决策树对点所在区域进行划分。

#include <opencv2/opencv.hpp>
#include <opencv2/ml.hpp>
#include <iostream>  
#include <fstream> 

using namespace std;
using namespace cv;
using namespace cv::ml;

int main()
{
    vector<Point>  trainedPoints;
    vector<int>    trainedPointsMarkers;
    //读取文件中的点坐标
    FILE *fp;
    int flge = 0;
    int fpoint,flabel;
    Point point;
    fp = fopen("E:\\points.txt", "r+");
    if (fp == NULL)
    {
        printf("Cannot open the file!\n");
        return -1;
    }
    while (!feof(fp))
    {   
        fscanf(fp, "%d", &fpoint);
        if (feof(fp)) break;
        //依次为横坐标、纵坐标、分类
        if ((
            flge%3==0? point.x = fpoint: 
            flge%3==1? point.y = fpoint:
            flge%3==2? flabel = fpoint : -1)<0) 
        return -1;
        if (flge%3==2)
        {
            trainedPoints.push_back(point);
            trainedPointsMarkers.push_back(flabel);
        }
        flge++;
    }

    vector<Vec3b> colors(2);
    colors[0] = Vec3b(0, 255, 0);
    colors[1] = Vec3b(0, 0, 255);
    Mat src, dst;
    src.create( 480, 640, CV_8UC3 );
    src = Scalar::all(0);
    src.copyTo(dst);
    // 绘制点
    for( size_t i = 0; i < trainedPoints.size(); i++ )
    {
        Scalar c = colors[trainedPointsMarkers[i]];
        circle( src, trainedPoints[i], 3, c, -1 );
        circle( dst, trainedPoints[i], 3, c, -1 );
    }
    imshow( "points", src );

    //训练数据
    Mat samples;
    Mat(trainedPoints).reshape(1, (int)trainedPoints.size()).convertTo(samples, CV_32F);
    //建立模型
    Ptr<DTrees> model = DTrees::create();
    //树的最大可能深度
    model->setMaxDepth(8);
    //节点最小样本数量
    model->setMinSampleCount(2);
    //是否建立替代分裂点
    model->setUseSurrogates(false);
    //交叉验证次数
    model->setCVFolds(0); 
    //是否严格修剪
    model->setUse1SERule(false);
    //分支是否完全移除
    model->setTruncatePrunedTree(false);
    //训练
    model->train(TrainData::create(samples, ROW_SAMPLE, Mat(trainedPointsMarkers)));

    //显示结果
    Mat testSample( 1, 2, CV_32FC1 );
    for( int y = 0; y < dst.rows; y += 3 )
    {
        for( int x = 0; x < dst.cols; x += 3 )
        {
            testSample.at<float>(0) = (float)x;
            testSample.at<float>(1) = (float)y;
            int response = (int)model->predict( testSample );
            dst.at<Vec3b>(y, x) = colors[response];
        }
    }
    imshow( "Decision Tree", dst );

    waitKey();
    return 0;
}

这里写图片描述
这里写图片描述


文件points.txt中的内容为:
(依次为横坐标、纵坐标、分类)

269 263 0
242 244 0
221 224 0
210 180 0
227 142 0
257 120 0
280 105 0
338 95  0
423 92  0
384 93  0
458 100 0
497 133 0
514 162 0
546 219 0
568 272 0
582 326 0
593 372 0
605 410 0
613 432 0
612 453 0
298 279 0
334 283 0
375 291 0
357 312 0
313 312 0
266 299 0
218 278 0
201 259 0
193 224 0
186 189 0
186 156 0
199 119 0
227 102 0
261 90  0
303 87  0
348 81  0
328 72  0
377 73  0
411 75  0
452 79  0
490 107 0
525 147 0
549 189 0
572 244 0
597 306 0
615 354 0
624 393 0
630 423 0
336 300 0
257 280 0
224 255 0
239 287 0
204 151 0
220 121 0
294 73  0
355 60  0
391 60  0
446 64  0
496 94  0
528 145 0
550 182 0
532 178 0
564 217 0
589 241 0
602 283 0
603 297 0
571 300 0
584 272 0
609 336 0
597 350 0
332 182 1
340 168 1
380 151 1
359 162 1
366 179 1
357 183 1
397 182 1
409 198 1
421 221 1
429 201 1
443 221 1
452 247 1
473 274 1
482 305 1
485 351 1
480 367 1
465 393 1
415 418 1
352 424 1
294 414 1
231 401 1
174 382 1
135 361 1
120 338 1
99  302 1
84  266 1
71  233 1
63  201 1
43  127 1
27  69  1
15  30  1
15  58  1
9   112 1
39  98  1
38  146 1
28  174 1
52  169 1
48  218 1
45  243 1
17  138 1
22  93  1
27  127 1
42  194 1
69  247 1
72  294 1
98  333 1
132 333 1
142 352 1
156 389 1
182 408 1
219 426 1
252 431 1
329 441 1
384 444 1
308 437 1
329 425 1
429 429 1
391 428 1
446 407 1
463 357 1
465 325 1
453 289 1
450 265 1
419 226 1
393 196 1
354 174 1
309 166 1
286 167 1
274 168 1
329 153 1
337 158 1
359 153 1
382 166 1
420 175 1
439 206 1
464 239 1
480 268 1
497 310 1
505 350 1
496 392 1
482 415 1
447 439 1
384 455 1
334 453 1
292 449 1
265 431 1
243 411 1
194 391 1
17  193 1
41  251 1
67  307 1
80  350 1
99  380 1
160 413 1
202 432 1
249 448 1
299 465 1
330 462 1
364 463 1
395 462 1
412 454 1
285 325 0
330 337 0
353 336 0
364 324 0
388 309 0
393 291 0
358 298 0
327 320 0
203 98  0
248 70  0
300 41  0
284 54  0
371 50  0
344 45  0
411 45  0
457 51  0
507 76  0
554 136 0
580 196 0
609 272 0
626 319 0
529 119 0
295 196 1
311 186 1
323 178 1
290 179 1
391 158 1
453 187 1
467 228 1
497 262 1
507 306 1
469 204 1
492 256 1
482 236 1
481 333 1
491 284 1
469 420 1
452 382 1
427 396 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv3/C++ 机器学习-决策树/DTrees 的相关文章

  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 曲线/路径骨架二值图像处理

    我正在尝试开发一个可以处理图像骨架的路径 曲线的代码 我想要一个来自两点之间骨架的点向量 该代码在添加一些点后结束 我没有找到解决方案 include opencv2 highgui highgui hpp include opencv2
  • opencv形态扩张滤波器作为最大滤波器

    就像中值滤波器的定义一样 我可以将 最大滤波器 定义为局部窗口 例如dst x y max 3x3 局部窗口像素 但我在opencv中找不到这样的过滤器 最接近的是 dilate 函数 然后我使用 dilate 函数的默认配置 但结果不正确
  • 指纹奇异点检测

    我正在尝试确定指纹的核心点和增量点 我正在使用庞加莱指数方法 但我无法成功检测到这一点 而且我不明白为什么 First I divide the image in 15x15 blocks then I calculate the x an
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • 检查图像中是否有太薄的区域

    我正在尝试验证雕刻机的黑白图像 更多的是剪贴画图像 不是照片 我需要考虑的主要事情之一是区域的大小 或线条的宽度 因为机器无法处理太细的线条 所以我需要找到比给定阈值更细的区域 以此图为例 竖琴的琴弦可能太细而无法雕刻 我正在阅读有关 Ma
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP
  • OpenCV 错误:connectedComponents_sub1 中断言失败 (L.channels() == 1 && I.channels() == 1) [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在 OpenCV python 中遇到以下错误 并用 google 搜索了很多 但无法解决 如果有人能为我提供一些线索
  • 2d 图像点和 3d 网格之间的交点

    Given 网格 源相机 我有内在和外在参数 图像坐标 2d Output 3D 点 是从相机中心发出的光线穿过图像平面上的 2d 点与网格的交点 我试图找到网格上的 3d 点 This is the process From Multip
  • 在 Python 中将 OpenCV 帧流式传输为 HTML

    我正在尝试从 opencv Pyt hon 中的 URL 读取视频 然后逐帧处理它 然后将其发送到 HTML 页面 But I am only getting the first frame after that the program g
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • OpenCV Mat 和 Leptonica Pix 之间的转换

    我需要在 C 中在 OpenCV Mat 图像和 Leptonica Pix 图像格式之间进行转换 这用于 8 位灰度图像的二值化 我发现发现了 ikaliga的回答 https stackoverflow com a 25929320 2
  • 将 4 通道图像转换为 3 通道图像

    我正在使用 OpenCV 2 4 6 我正在尝试将 4 通道 RGB IplImage 转换为 4 通道 HSV 图像 下面是我的代码 给出错误 OpenCV 错误 未知函数断言失败 我认为 cvCvtColor 支持 3 通道图像 有没有
  • YOLOv8获取预测边界框

    我想将 OpenCV 与 YOLOv8 集成ultralytics 所以我想从模型预测中获取边界框坐标 我该怎么做呢 from ultralytics import YOLO import cv2 model YOLO yolov8n pt
  • Python:Urllib2 和 OpenCV

    我有一个程序 可以将图像保存在本地目录中 然后从该目录中读取图像 但我不想保存图像 我想直接从url读取它 这是我的代码 import cv2 cv as cv import urllib2 url http cache2 allposte
  • 如何加速 svm.predict?

    我正在编写一个滑动窗口来提取特征并将其输入到 CvSVM 的预测函数中 然而 我偶然发现 svm predict 函数相对较慢 基本上 窗口以固定的步幅长度在图像比例上滑动穿过图像 遍历图像加上提取每个图像特征的速度 窗口大约需要 1000
  • 找到 4 个特定的角像素并将它们与扭曲透视一起使用

    我正在使用 OpenCV 我想知道如何构建一个简单版本的透视变换程序 我有一张平行四边形的图像 它的每个角都由具有特定颜色的像素组成 该像素在图像中没有其他位置 我想遍历所有像素并找到这 4 个像素 然后我想将它们用作新图像中的角点 以扭曲
  • 如何检测图像是否像素化

    之前有人在 SO 上提出过这样的问题 在Python中检测像素化图像 https stackoverflow com questions 12942365 detecting a pixelated image in python还有关于q
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o

随机推荐

  • 服务计算——web 技术 - 处理 Request 与 Response

    基于Negroni框架的cloudgo应用 本次实验是基于Negroni框架的应用 我设计了一个简单的四则运算应用 这个应用设计主要分为两部分 中间件设计 以及 main函数的设计 接下来就分别对这两个部分进行介绍 中间件设计 printF
  • VS2017配置Qt开发环境

    VS2017配置Qt开发环境 安装Qt5 12 11 安装Qt插件 在VS2017中进行设置 参考教程 安装Qt5 12 11 安装Qt插件 在VS2017中进行设置 参考教程 Qt下载地址 https download qt io Qt安
  • 前端拖拽自动生成代码_我的前端布局自动化——开始,布局自动生成(一)

    在web前端工作的这些年 历经多次技术变革 不过依然只是一个追随大牛们的小白 此时此刻 尤其加班时 最想做的就是干掉自己职业的东西 做一个可代替前端工作的工具 由此开始了前端自动化探索 这篇文章就是自己的旗子吧 先举起一面变革之旗 不论自己
  • 关于Number.toFixed()的总结

    关于Number toFixed 函数的总结 前言 今天工作中遇到了一个需求 需要将类似于 1 99999 这样的数字格式化为 2 00 这样的两位小数 本来打算自己实现一个类似的功能函数 但是没想到看起来容易 实际实现起来却还是有点复杂的
  • Windows server 2016 云主机创建虚拟机

    Windows server 2016 云主机创建虚拟机 Hyper V 安装失败 处理器没有所需要的虚拟化功能 vmvare workstation play 17 安装 vmvare ok https customerconnect v
  • 【毕设教程】深度学习经典网络 CNN模型:ResNet

    文章目录 0 简介 1 ResNet 介绍 2 深度网络的退化问题 3 残差学习 4 ResNet的网络结构 5 ResNet的TensorFlow实现 6 最后 0 简介 Hi 大家好 这里是丹成学长的毕设系列文章 对毕设有任何疑问都可以
  • HTML-CSS笔记_0424

    HTML CSS 学习笔记源码 链接 https pan baidu com s 1PRorRSlAW0PSHM4grOoapg 提取码 fnr2 HTML 一 网页的基本结构和基础 1 html基础
  • qt 实现UDP通信简单案例

    实现效果 实现功能 创建两个界面 可以通过udp进行通信 并显示通信内容 界面部分由代码实现 并使用qss简单美化 udp通信由创建套接字 绑定端口号 发送和接收数据函数完成 代码实现 创建第一个通信对象 ud1 h ifndef UDPU
  • 【CV学习笔记】onnx篇之DETR

    1 摘要 本次学习内容主要学习了DETR的网络结构 损失函数等知识 明白了DETR是如何做到了端到端的检测 确实是一个十分优雅的框架 同时将DETR利用onnxtime进行推理 对于transformer的理解进一步加深了 DETR学习链接
  • Vue中关于组件的封装复用

    我们在写前端代码时常常会有一些控件或者HMTL代码片段在许多页面都需要 并且内容几乎一样 只是数据的不同而已 此时 我们就可以把这些代码封装成组件 以供我们重复使用 组件化 是一种思想 解决对复杂问题简单化的思想 将我们的程序开发成一个个独
  • 【持续更新】近期C++开发Modbus通讯接口小结

    项目需求 对PLC上存储的数据进行读取 并转存到数据库 语言 C DDL 所需知识点 Socket通信 Modbus帧结构 C 中数据库的操作 多线程 Linux 项目进度拆解记录 不会做就是困难 管它简不简单 1 Socket通信 由于之
  • mysql 配置文件-----【MySQL][5.1][.ini][5] MySQL my-innodb-heavy-4G.ini

    开始配置信息 描述 4GB 内存 只有 InnoDB ACID 几个连接数 繁重的查询 类型 系统 结束配置信息 这是一个针对 4G 内存系统 主要运行只有 InnoDB 表的 MySQL 并使用几个连接数执行复杂的查询 的 MySQL 配
  • 大数据小细节、小经验

    1 把操作hive的sql写在sh脚本里 用 bin hive f 执行脚本 不用登陆hive命令行界面 这样可以脚本自动化执行某些任务 2 expect脚本 先安装expect插件 yum y install expect bin exp
  • python练习——实现质数检测,编写isprime()函数,参数为整数,并且需要有异常处理功能。

    编写isprime 函数 参数为整数 并且需要有异常处理功能 此函数的功能是检测接收的整数是否为质数 如果整数是质数 则返回True 否则返回False 编写isprime 函数 参数为整数 并且需要有异常处理功能 此函数的功能是检测接收的
  • C++入门练习题[1]:KiKi定义电子日历类

    最近在看C 入门的书籍 但是光看是不够的 需要一些练习将知识运用起来 牛客网上面有在线编程的题目 我选择了一些入门的题目作为练习 1 题目 这道题的题目如下 2 解题 题目是非常简单的 但是因为只是看过了一遍知识点 没有动手实践 所以看起来
  • [Python系列-7]:Python之人工智能 - 基本工具 -1- Time库

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119253059 目录 1 什
  • 瑞吉外卖【后台管理系统篇】

    瑞吉外卖 一 软件开发整体介绍 1 软件开发流程 2 角色分工 3 软件环境 二 瑞吉外卖项目介绍 1 项目介绍 2 技术选型 3 功能架构 三 开发环境搭建 1 数据库环境搭建 2 maven项目搭建 四 后台功能开发 1 员工管理 1
  • Matlab中条件语句-if, elseif, else使用

    目录 语法 说明 示例 使用 if elseif 和 else 指定条件 比较数组 测试数组的相等性 比较字符向量 测试值的不相等性 评估表达式中的多个条件 if elseif else是条件为 true 时执行语句 语法 if expre
  • java数组为什么可以迭代吗_另一个“只能迭代数组或java.lang.Iterable实例”的问题...

    我有这段代码返回java lang iterable错误 我知道我在哪里出错 但是我不知道该如何解决 这是代码 public class ManagementServiceHandler implements ManagementServi
  • opencv3/C++ 机器学习-决策树/DTrees

    决策树 Decision Tree 决策树 Decision Tree是一棵二叉树 每棵非叶子节点有两个子节点的树 可用于分类或回归问题 对于分类问题 形成分类树 每个叶节点都标有一个类标签 多个叶节点可能具有相同的标签 对于回归问题 形成