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

OpenCV机器学习(4)k-近邻算法(k-Nearest Neighbors, KNN)cv::ml::KNearest类

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

cv::ml::KNearest 是 OpenCV 机器学习模块中的一部分,它提供了实现 k-近邻算法(k-Nearest Neighbors, KNN)的方法。KNN 是一种简单但功能强大的分类和回归算法,基于实例的学习方法,即根据最近邻的类别来预测新样本的类别。

主要特点

  • 分类与回归:既可以用于分类任务也可以用于回归任务。
  • 参数设置:可以指定邻居的数量(k)、是否使用投票机制(对于分类)或平均值(对于回归)等。
  • 距离度量:支持不同的距离度量方式,默认为欧几里得距离。

常用成员函数

以下是一些常用的 cv::ml::KNearest 类成员函数:

  • 创建模型实例:
    create():创建一个新的 KNearest 模型实例。
  • 训练模型:
    • train(const Ptr& trainData, int flags=0):使用提供的训练数据进行训练。
    • train(const Mat& samples, int layout, const Mat& responses):另一种形式的训练函数,直接接受样本和响应矩阵作为输入。
  • 预测:
  • findNearest(InputArray samples, int k, OutputArray results, OutputArray neighborResponses=noArray(), OutputArray dist=noArray()) -
    -const:找到最近的 k 个邻居,并返回结果、邻居的响应及距离(可选)。
  • 保存与加载模型:
    • save(const String& filename):将模型保存到文件。
    • load(const String& filename):从文件加载模型。

使用步骤

  • 准备数据:准备好你的训练数据集,包括特征向量及其对应的标签(对于分类任务)或目标值(对于回归任务)。
  • 初始化 KNearest 模型:使用 cv::ml::KNearest::create() 创建一个新的 KNearest 模型实例,并根据需要设置参数。
  • 训练模型:调用 train() 方法,传入你的训练数据来进行模型训练。
  • 评估模型:可以通过交叉验证或者在独立的测试集上评估模型性能。
  • 预测新数据:使用训练好的模型对新的未见过的数据进行预测,并获取其所属类别的概率分布或回归值。

代码示例

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

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

int main()
{
    // 准备训练数据
    Mat samples = ( Mat_< float >( 4, 2 ) << 0.5, 1.0, 1.0, 1.5, 2.0, 0.5, 1.5, 0.0 );

    Mat responses = ( Mat_< int >( 4, 1 ) << 0, 0, 1, 1 );

    // 创建并配置 KNearest 模型
    Ptr< KNearest > knn_model = KNearest::create();
    knn_model->setDefaultK( 3 );         // 设置默认的邻居数量为3
    knn_model->setIsClassifier( true );  // 设置为分类模式

    // 训练模型
    bool ok = knn_model->train( samples, ROW_SAMPLE, responses );
    if ( ok )
    {
        // 保存模型
        knn_model->save( "knn_model.yml" );

        // 对新样本进行预测
        Mat sample = ( Mat_< float >( 1, 2 ) << 1.6, 0.7 );
        Mat result, neighborResponses, dist;
        float response = knn_model->findNearest( sample, 3, result, neighborResponses, dist );

        cout << "The predicted response for the sample is: " << response << endl;
        cout << "Neighbor responses: " << neighborResponses << endl;
        cout << "Distances: " << dist << endl;
    }
    else
    {
        cerr << "Training failed!" << endl;
    }

    return 0;
}

运行结果

The predicted response for the sample is: 1
Neighbor responses: [1, 1, 0]
Distances: [0.19999997, 0.49999997, 1]

http://www.kler.cn/a/545882.html

相关文章:

  • vue-plugin-hiprint (vue2
  • substring、substr、split用法区别
  • Hadoop 简介及其hdfs常用命令
  • Pycharm中通过Anaconda虚拟环境创建项目
  • CRMEB PHP多门店版v3.1.1源码全开源+PC端+Uniapp前端+搭建教程
  • latex二重闭合积分显示
  • A4988一款带转换器和过流保护的 DMOS 微步驱动器的使用方式
  • python中的深度学习框架TensorFlow 和 PyTorch 有什么区别?
  • C#+redis实现消息队列的发布订阅功能
  • 二十八、vue项目预览pdf文档示例
  • 深度学习机器学习:常用激活函数(activation function)详解
  • Nginx--日志(介绍、配置、日志轮转)
  • 2.SpringSecurity在mvc项目中的使用
  • 变频器MODBUS RTU通信
  • vue开发06:前端通过webpack配置代理处理跨域问题
  • FreeRTOS低功耗总结
  • Azure从0到1
  • 蓝桥与力扣刷题(108 将有序数组转换成二叉搜索树)
  • TCP文件传输
  • 人工智能任务21-飞蛾火焰优化算法(MFO)在深度学习中的应用