当前位置: 首页 > news >正文

opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树

cv::ml::DTrees类表示单个决策树或决策树集合,它是RTrees和
Boost的基类。

CART是二叉树,可用于分类或回归。对于分类,每个叶子节点都
标有类标签,多个叶子节点可能具有相同的标签。对于回归,每个叶
子节点都被分配了常数,因此近似函数是分段常数。

  1. 创建空决策树
    cv::ml::DTrees::create函数可使用指定的参数创建空决策树,
    之后使用cv::ml::StatModel::train函数训练该决策树模型;或者使用Algorithm::load (filename)从文件中加载决策树模型。

  2. 模型的基本设置
    以下是构建决策树模型的必要参数,绝大部分参数有默认值

  • MaxDepth:树的最大可能深度

根节点的深度为零,训练算法在深度小于MaxDepth时尝试切分节
点。如果满足其他终止标准,或者树被修剪,则实际深度可以更小。默认值为INT_MAX。

设置或获取参数MaxDepth的方法如下:

在这里插入图片描述

  • MinSampleCount:节点中的最小样本数

如果节点中的样本数小于MinSampleCount,则不会切分该节点。
默认值为10。

设置或获取参数MinSampleCount的方法如下:

在这里插入图片描述

  • RegressionAccuracy:回归树的终止标准

如果节点中的估计值与该节点中的样本值之间的所有绝对差值小
于该参数,则该节点不会被进一步切分。默认值为0.01f。

设置或获取参数RegressionAccuracy的方法如下:

在这里插入图片描述

  • MaxCategories:表示特征属性为类形式时最大类的数量

算法会将分类变量的可能值聚类到K≤MaxCategories群集中,以
便找到次优切分。如果训练过程尝试进行切分的离散变量需要超过
MaxCategories值,则寻找精确的最佳子集可能需要很长时间。许多决策树引擎(包括OpenCV的实现)在这种情况下将尝试通过把所有样本聚类到MaxCategories集群中来寻找次优切分,其中,某些类别会被合并在一起。

对于具有N>MaxCategories可能值的分类变量,聚类仅应用于n>2类的分类问题。在回归和只有2类分类的情况下,不采用聚类也可以有效地找到最优切分,因此在n≤2时不使用该参数。默认值为10。

设置或获取参数MaxCategories的方法如下:

在这里插入图片描述

  • CVFolds:使用k折叠交叉验证剪枝时的交叉验证折数

如果CVFolds>1,则算法使用k折叠交叉验证程序修剪构建的决策
树,其中,k=CVFolds,默认值为10。

设置或获取参数CVFolds的方法如下:

在这里插入图片描述

  • Use1SERule:应用1SE规则剪枝标志位

如果标志位为true,剪枝将应用1SE规则,这将使树更紧凑,更能
抵抗训练数据噪声,但准确度稍差。默认值为true。

设置或获取参数Use1SERule的方法如下:

在这里插入图片描述

  • TruncatePrunedTree:截断剪枝树标志位,默认值为true

如果标志位为true,则从树中物理移除已修剪的分枝,否则它们
会被保留,并且可以从原始未修剪(或修剪得不那么大)的树中获得结果。

设置或获取参数truncatePrunedTree的方法如下:

在这里插入图片描述

  • priors:先验类概率Mat数组,默认值为空矩阵Priors=Mat()。

该参数可用于将决策树偏好调整到某个类。例如,想要检测一些
罕见的异常,即在训练集中正常比异常多很多,此时只需将每个案例都视为正常,即可实现非常好的分类性能。为了避免这种情况,可以指定先验,人为地增加异常概率(高达0.5,甚至更高),因此错误分类的异常权重变得更大,这样决策树就能做出适当地调整,以更好地检测异常样本。

还可以将此参数视为预测类别的权重,以确定为错误分类提供的
相对权重。也就是说,如果第一类别的权重是1,第二类别的权重是10,则预测第二类别的每个错误等同于在预测第一类别时犯10个错误。

设置或获取参数Priors的方法如下:

在这里插入图片描述

  • UseSurrogates:是否构建代理切分标志位

如果为true,那么将建立代理切分。代理切分指的是,如果当前
样本缺少某些特征的值,那么该样本就无法继续沿着树向下切分,也就无法到达叶子节点,即没有预测输出。在这种情况下,可以利用当前节点下面的所有子节点中的叶子节点来预测输出的平均值,作为这个样本的预测输出,故称之为代理切分。当代理切分标志位为true时,允许使用缺少的数据。此外,如果需要计算特征(属性)的重要性,则需要将代理切分标志位设置为true

设置或获取参数UseSurrogates的方法如下:

在这里插入图片描述

训练决策树

与KNN一样,决策树也是使用cv::ml::StatModel::train函数(简
称train函数)来训练模型的。

train函数:

在这里插入图片描述
函数参数:

  • samples:训练集。
  • layout:指定训练集的样本排列方式。具体如下:
    • ROW_SAMPLE:每个训练样本占一行的训练集。
    • COL_SAMPLE:每个训练样本占一列的训练集。
  • responses与训练集样本排列顺序对应的标签向量。

树从根节点开始递归构建,所有训练数据(特征向量和响应)用
于切分根节点。在每个节点中,基于某些标准找到最佳决策规则(最佳“主要”切分)。

如前文所述,在训练中基尼系数表示的“不纯度”用于分类,均方误差之和用于回归。如有必要,找到代理切分。

它们类似于训练数据的主要切分结果。使用左子节点和右子节点之间的主要和替代切分(就像在预测过程中完成的那样)来划分所有数据。该过程以递归方式切分左右节点。当出现以下任意一种情况时,每个节点的递归过程都可能会停止。

  • 构造的树分支的深度已达到指定的最大值。
  • 当统计上没有进一步切分节点时,节点中的训练样本数小于指
    定的阈值。
  • 节点中的所有样本属于同一类,或者在回归的情况下,变化太
    小。
  • 与随机选择相比,最佳找到的切分没有任何明显的改善。
    在构建决策树时,如有必要,可以使用交叉验证程序对其进行修剪。通常,此过程仅适用于独立决策树。如果构建的树过小,则应使用自己的方案防止过拟合。

使用决策树预测

训练好的决策树模型不仅可以根据输入样本特征向量获得响应,
还可以利用决策树计算变量的重要性。

  1. 预测过程
    了解OpenCV中决策树模型的预测过程,有助于我们理解决策树的
    原理并更好地应用它。决策树的预测过程从根节点开始,从每个非叶
    子节点开始,过程向左(选择左子节点作为下一个观察节点)或向右
    移动,基于某个变量的值,该变量的索引存储在被观察节点中。连续
    变量与分类变量的预测过程如下。

连续变量。将变量值与存储在节点中的阈值进行比较。如果该值
小于阈值,则过程向左移动,否则向右移动。例如,如果重量小于1千克,则程序向左移动,否则向右移动。

分类变量。测试离散变量值,从变量可以采用的有限值集合中查
看它是否属于某个值的子集(也存储在节点中)。如果是,则向左移动,否则向右移动。例如,如果颜色为绿色或红色,请转到左侧,否则转到右侧。

在 每 个 节 点 中 , 都 使 用 了 ( variable_index ( 阈 值 ) ,
decision_rule(子集))这样一对实体。这样一对实体被称为一个切分(在variable_index上的切分)。一旦到达叶子节点,分配给该节点的值将用作预测输出。

有时,输入向量的某些特征缺失会导致预测过程卡在某个节点
中。为了避免这种情况,决策树使用代理切分。也就是说,除最佳的“主要”切分外,每个树节点也可以被分成具有几乎相同结果的一个或多个其他变量。

决策树模型与其他机器学习模型一样,测试可以分为一次测试一
个(多个)样本或者一次性测试整个数据集上的误差。

1)一次测试一个或多个样本

使用标准的cv::ml::StatModel::predict函数(简称predict函
数)预测所提供样本的响应。

predict函数:

在这里插入图片描述

函数参数:

  • samples:输入样本,浮点型矩阵。
  • results:可选的输出结果矩阵。
  • flags : 可 选 标 志 , 取 决 于 模 型 。 参 阅
    cv::ml::StatModel::Flags函数。

2)一次性测试整个数据集上的误差

使用标准的cv::ml::StatModel::calcError函数(简称calcError
函数)可以测试整个数据集上的误差。该函数使用predict函数来计算错误。对于回归模型,误差计算使用均方误差MSE;对于分类模型,计算错误分类样本的百分比(0%~100%)。

calcError函数:

在这里插入图片描述

函数参数:

  • data:可以是TrainData类型的训练数据或者测试数据。
  • test:如果为true,则在数据的测试子集上计算误差,否则在
    数据的训练子集上计算误差。注意,如果加载了一个完全不同的数据集 来 评 估 已 经 训 练 过 的 模 型 , 则 不 需 要 使 用
    TrainData::setTrainTestSplitRatio方法设置切分测试子集,此时无论test=true还是test=false,都将计算整个新数据集的误差。
  • resp:可选的输出响应。
  1. 计算变量的重要性
    决策树不仅可用于预测,还可用于各种数据分析。前文曾介绍
    过,选择最佳切分属性是决策树的关键。因此决策树具有计算每个样本属性(特征)的重要性的能力,在OpenCV中称之为计算变量重要性。例如,当使用邮件信息中出现的一组单词作为特征向量的垃圾邮件过滤器时,变量重要性评级可用于确定最“垃圾邮件指示”单词,从而有助于保持字典大小合理。

应用示例

import cv2
import numpy as np# 创建一个决策树分类器
decision_tree = cv2.ml.DTrees_create()# 创建一些训练数据
train_data = np.array([[1.0, 2.0], [2.0, 3.0], [3.0, 4.0], [10.0, 12.0], [11.0, 13.0]], dtype=np.float32)
responses = np.array([0, 0, 0, 1, 1], dtype=np.int32)# 进行PCA降维
num_components = 1
pca = cv2.PCACompute(train_data, mean=None, maxComponents=num_components)# 使用PCA进行降维
train_data_reduced = cv2.PCAProject(train_data, pca[0])# 创建一个决策树分类器
decision_tree = cv2.ml.DTrees_create()# 设置决策树参数
params = dict(maxDepth=2)
decision_tree.setCVFolds(1)  # 设置交叉验证折数# 将降维后的训练数据与类别标签整合为训练集
train_data_with_labels = cv2.ml.TrainData_create(samples=train_data_reduced,layout=cv2.ml.ROW_SAMPLE,responses=responses)# 训练决策树分类器
decision_tree.train(train_data_with_labels)# 创建一个测试样本并进行降维
test_sample = np.array([[2.5, 3.5]], dtype=np.float32)
test_sample_reduced = cv2.PCAProject(test_sample, pca[0])# 使用决策树进行预测
result = decision_tree.predict(test_sample_reduced)
print("Predicted class:", result[1][0][0])

相关文章:

opencv进阶19-基于opencv 决策树cv::ml::DTrees 实现demo示例

opencv 中创建决策树 cv::ml::DTrees类表示单个决策树或决策树集合,它是RTrees和 Boost的基类。 CART是二叉树,可用于分类或回归。对于分类,每个叶子节点都 标有类标签,多个叶子节点可能具有相同的标签。对于回归,每…...

Unity通过TCP/IP协议进行通信

uinty项目中需要与C编写的硬件进行通信,因此采用TCP/IP协议进行通信,主要实现了与服务器的连接、通信内容的发送以及断开连接等功能。 根据确定好的协议格式,编写需要发送的内容,将其转为字节流(byte[])通过…...

基于VuePress搭建知识库

我这边需要搭建一个运维知识库,将项目的方方面面记录下来,方便新手接手运维。 准备环境 Nginx 1.19.0VuePress 1.xMinio RELEASE.2022-02-16T00-35-27Zvuepress-theme-vdoing主题 安装VuePress 根据官网步骤即可 # 创建目录 mkdir vuepress-starter…...

odoo安装启动遇到的问题

问题:在第一次加载odoo配置文件的时候,启动失败 方法: 1、先检查odoo.conf的内容,尤其是路径 [options] ; This is the password that allows database operations: ; admin_passwd admin db_host 127.0.0.1 db_port 5432 d…...

【Flink】Flink提交流程

我们通常在学习的时候需要掌握大数据组件的原理以便更好的掌握这个大数据组件,Flink实际生产开发过程中最常见的就是提交到yarn上进行调度,模式使用的Per-Job模式,下面我们就给大家讲下Flink提交Per-Job任务到yarn上的流程,流程图…...

哪种英特尔实感设备适合您?

原文链接 https://www.intelrealsense.com/which-device-is-right-for-you/ 无论您是深度和跟踪硬件的新手,还是经验丰富的专业人士,确定我们提供的众多英特尔实感产品中哪些产品适合您的项目仍然是一项挑战。在这篇文章中,我们将讨论英特尔…...

C++11的四种强制类型转换

目录 语法格式 static_cast(静态转换) dynamic_cast(动态转换) const_cast&#xff08;常量转换&#xff09; reinterpret_cast(重解释) 语法格式 cast-name <typename> (expression) 其中cast-name为static_cast、dynamic_cast、const_cast 和 reinterpret_cast之一…...

分布式事务(4):两阶段提交协议与三阶段提交区别

1 两阶段提交协议 两阶段提交方案应用非常广泛&#xff0c;几乎所有商业OLTP数据库都支持XA协议。但是两阶段提交方案锁定资源时间长&#xff0c;对性能影响很大&#xff0c;基本不适合解决微服务事务问题。 缺点&#xff1a; 如果协调者宕机&#xff0c;参与者没有协调者指…...

React源码解析18(9)------ 实现多节点渲染【修改beginWork和completeWork】

摘要 目前&#xff0c;我们已经实现了单节点的&#xff0c;beginWork&#xff0c;completeWork&#xff0c;diff流程。但是对于多节点的情况&#xff0c;比如: <div><span></span><span></span> </div>这种情况&#xff0c;我们还没有处…...

【GUI】基于开关李雅普诺夫函数的非线性系统稳定(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Redis 缓存满了怎么办?

引言 Redis 缓存使用内存来保存数据&#xff0c;随着需要缓存的数据量越来越大&#xff0c;有限的缓存空间不可避免地会被写满。此时&#xff0c;应该怎么办&#xff1f;本篇文章接下来就来聊聊缓存满了之后的数据淘汰机制。 值得注意的是&#xff0c;在 Redis 中 过期策略 和…...

Grafana 安装配置教程

Grafana 安装配置教程 一、介绍二、Grafana 安装及配置2.1 下载2.2 安装2.2.1 windows安装 - 图形界面2.2.2 linux安装 - 安装脚本 三、Grafana的基本配置3.1 登录3.2 Grafana设置中文 四、grafana基本使用 一、介绍 Grafana是一个通用的可视化工具。对于Grafana而言&#xff0…...

【Linux】临界资源和临界区

目录 一、临界资源 二、如何实现对临界资源的互斥访问 1、互斥量 2、信号量 3、临界区 三、临界区 四、进程进入临界区的调度原则 一、临界资源 概念&#xff1a;临界资源是一次仅允许一个进程使用的共享资源&#xff0c;如全局变量等。 二、如何实现对临界资源的互斥访问 …...

拓扑排序Topological sorting/DFS C++应用例题P1113 杂务

拓扑排序 拓扑排序可以对DFS的基础上做变更从而达到想要的排序效果。因此&#xff0c;我们需要xy准备&#xff0c;vis数组记录访问状态&#xff0c;每一个任务都可以在dfs的过程中完成。 在使用拓扑排序方法时一些规定&#xff1a; 通常使用一个零时栈不会直接输出排序的节点…...

基于jenkins构建生成CICD环境

目录 一、安装配置jenkins 1、环境配置 2、软件要求 3、jdk安装&#xff08;我是最小化安装&#xff0c;UI自带java要先删除rm -rf /usr/local/java 4、安装jenkins-2.419-1.1 二、Jenkins配置 1、修改jenkins初始密码 2、安装 Jenkins 必要插件 3、安装 Publish Over SS…...

在线图片怎么转换成PDF?在线图片转换成PDF步骤介绍

文件格式要转化不知道怎么办?想要网上下载文件格式转换软件&#xff0c;但是却不知道下载哪个好?今天小编小编就给大家分享一下靠谱的小圆象PDF转换器工具&#xff0c;想知道这款软件好不好用?在线图片怎么转换成PDF?那就进来看看吧。 在线图片怎么转换成PDF 小圆象PDF转换…...

Linux共享库基础及实例

共享库是将库函数打包成一个可执行文件&#xff0c;使得其在运行时可以被多个进程共享。 目标库 回顾下构建程序的一种方式&#xff1a; 将每个源文件编译成目标文件&#xff0c;再通过链接器将这些目标文件链接组成一个可执行程序。 gcc -g -c prog.c mod1.c mod2.c gcc -g …...

java八股文面试[java基础]——final 关键字作用

为什么局部内部类和匿名内部类只能访问final变量&#xff1a; 知识来源 【基础】final_哔哩哔哩_bilibili...

Redis 分布式锁存在什么问题 ?如何解决 ?

目录 1. 如何实现分布式锁 2. Redis 分布式锁存在什么问题 2.1 解决死锁问题 2.2 解决锁误删问题 1. 如何实现分布式锁 Redis 天生就可以作为一个分布式系统来使用&#xff0c;所以它实现的锁都是分布式锁。 Redis 可以通过 setnx&#xff08;set if not exists&#xff09…...

n5173b是德科技keysight N5173B信号发生器

产品概述 是德科技/安捷伦N5173B EXG模拟信号发生器 当您需要平衡预算和性能时&#xff0c;是德科技N5173B EXG微波模拟信号发生器是经济高效的选择。它提供解决宽带滤波器、放大器、接收机等参数测试的基本信号。执行基本LO上变频或CW阻塞&#xff0c;低成本覆盖13、20、31.…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

蓝桥杯 2024 15届国赛 A组 儿童节快乐

P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡&#xff0c;轻快的音乐在耳边持续回荡&#xff0c;小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下&#xff0c;六一来了。 今天是六一儿童节&#xff0c;小蓝老师为了让大家在节…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...