VS2017+OpenCV4.5.5 K近邻算法-评价纸巾的好坏

K近邻算法

K近邻算法(K-Nearest Neighbors,KNN)既可以处理分类问题,也可以处理回归问题。
KNN算法原理:
在训练样本集中,每个样本都是一个具有 n n n个特征属性的向量,即 x = ( x 1 , x 2 , . . . , x n ) x= (x_1, x_2, ..., x_n) x=(x1,x2,...,xn), 因此可认为每个样本在 n n n特征空间或度量空间分布;同时,每个样本还有一个唯一属于他的标签 y y y,机器学习的目的就要是找到一个函数满足 y = f ( x ) y=f(x) y=f(x),这样,当有一个新样本 u u u时,将其特征属性代入该目标函数即可确定他的标签。
KNN的任务就是,在训练样本集中,依据距离测度找到与测试样本最相似的那K个训练样本。
对于“分类”问题,我们多采用“多数表决”的方式来确定新样本 u u u的最终分类,即这K个训练样本中,哪个分类的样本数最多, u u u就属于哪个分类。
对于“回归”问题, u u u的预测值 v v v为:
v = ∑ i = 1 K y i / K v = {\sum_{i=1}^{K}y_i}/K v=i=1Kyi/K

测试用例-评价纸巾好坏

#include<iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/imgproc/imgproc.hpp>
#include<opencv2/ml/ml.hpp>
using namespace std;
using namespace cv;
using namespace cv::ml;
int main(int argc, char *argv[])
{
    
    
	//训练样本:耐酸性、强度、分类(好:1,差:-1)
	float trainData[24][2] = {
    
     {
    
    4,3}, {
    
    1,3},{
    
    3,3},{
    
    3,7},{
    
    3,4},{
    
    4,1},{
    
    1,4},{
    
    3,6},{
    
    3,7},{
    
    6,2},
		{
    
    4,6}, {
    
    4,4},{
    
    5,8},{
    
    7,8},{
    
    7,7},{
    
    10,5},{
    
    7,6},{
    
    4,10},{
    
    9,7},{
    
    5,4},{
    
    8,5},{
    
    6,6},{
    
    7,4}, {
    
    8,8}
	};
	Mat trainDataMat(24, 2, CV_32FC1, trainData);
	//cout << trainDataMat << endl;
	//训练样本的响应值,1代表G  -1代表B    
	int labels[24] = {
    
     1, 1, 1, 1, 1, 1, 1, 1, 1, 1,-1, -1, -1, -1, -1, -1, -1, -1,-1, -1, -1, -1, -1, -1};
	Mat labelsMat(24, 1, CV_32SC1, labels);
	//cout << labelsMat << endl;

	//创建KNN分类器
	Ptr<KNearest> knn_model = KNearest::create();;

	//创建TrainData并进行训练
	Ptr<TrainData> tData = TrainData::create(trainDataMat, ROW_SAMPLE, labelsMat);
	knn_model->train(tData);

	float myData[2] = {
    
    10,8};//测试样本
	Mat myDataMat(1, 2, CV_32FC1, myData);

	//利用训练好的分类器进行测试样本预测
	//int res = knn_model->predict(myDataMat);

	int K = 7;
	vector<float> predictions;
	;
	int res = knn_model->findNearest(myDataMat, K, predictions);
	for (size_t i = 0; i < K; i++)
	{
    
    
		cout << " " << predictions[i];
	}

	cout << endl << "The result is :  " << res << endl;
	knn_model.release();
	return 0;
}

预测结果为-1.

猜你喜欢

转载自blog.csdn.net/zfjBIT/article/details/128069025