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

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]

相关文章:

  • 蓝桥杯(B组)-每日一题(求最大公约数最小公倍数)
  • MongoDB 7 分片副本集升级方案详解(下)
  • 用Echarts的柱状图实现圆柱体效果
  • linux c 读写锁pthread_rwlock
  • 3D打印技术:如何让古老文物重获新生?
  • MYSQL直接在SQL提取json字符串中的内容-----将13位时间戳转换成标准的日期格式【记录SQL常用函数】
  • 【如何掌握CSP-J 信奥赛中的模拟算法】
  • Python深度学习代做目标检测NLP计算机视觉强化学习
  • 【Linux系统】—— 简易进度条的实现
  • C++中运算符的底层是不是用函数实现的?
  • MATLAB使用技巧之局部放大图的制作(二)
  • 算法服务器跟算力卡有什么区别?
  • Eclipse JSP/Servlet 深入解析
  • 【C语言 】C语言 桌游开发数字竞拍(源码)【独一无二】
  • 微信小程序开发实用技巧篇
  • 支持列表拖拽嵌套,AI流式输出的多模态文档编辑器flowmix/docx: 全面升级
  • SQL Server:查看内存使用情况
  • 信号与系统第二章学习(五)
  • npm安装时无法访问github域名的解决方法
  • 网络安全事件分级
  • 在深化教育科技人才一体发展上打头阵、当尖兵!陈吉宁调研复旦大学
  • 海南省市监局与香港标准及检定中心签署合作协议,加快检验检测国际化
  • “宝马女司机驾车拖行虐猫”引关注,海口警方介入调查
  • 去年六成中小企业营收保持上升或持平,发展环境持续优化
  • 国际博物馆日|在辽宁省博物馆遇见敦煌
  • 俄乌谈判开始