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]