C++_2018-10-14_机器学习——SVM训练示例:分类

目录

简述

原理

代码 

结果

训练和预测子函数封装(Opencv3)

训练  

预测 

Opencv3 多分类

/*#include <opencv2\ml\ml.hpp>
using namespace cv;
*/
//训练需要用到的数据	
float data[4][4] = {		
	{ 0.814973, 15.1147, 0.431797, 0.933121 }, 
	{ 0.95266, 3.70758, 0.139839, 0.983595 }, 
	{ 0.973312, 1.95185, 0.0861551, 0.991363 }, 
	{ 0.922384, 6.42396, 0.211111, 0.971575 } 
};
int label[4] = { 1, 2, 3, 4 };

//转为Mat以调用
Mat dataMat(4, 4, CV_32FC1, data);
Mat labelMat(4, 1, CV_32SC1, label);
//训练的初始化
Ptr<SVM> svm = SVM::create();
svm->setType(SVM::C_SVC);
svm->setKernel(SVM::LINEAR);
svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
//开始训练
svm->train(dataMat, ROW_SAMPLE, labelMat);

// save_model
svm->save("svm.xml");

/*
load_model
CvSVM svm;
*/
/*Ptr<SVM> svmtest = Algorithm::load<SVM>("svm.xml"); // SVM::load()是一个静态函数,不能单独用*/
svm->load("svm.xml");


Mat result;
float teatData[4] = { 0.814973, 15.1147, 0.431797, 0.933121 };
	
Mat query(1, 4, CV_32FC1, teatData);

svm->predict(query, result);
std::cout << "分类结果为:" << endl;
std::cout << result << endl;
int a = result.at<Point2f>(0, 0).x;
std::cout << a << endl;

训练和预测子函数封装(Opencv3)

#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\ml\ml.hpp>
#include <iostream>

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

训练  

// 训练与保存
/*
Mat train_mat = Mat::zeros(样本数, 特征向量长度, CV_32FC1);
Mat label_mat = Mat::zeros(样本数, 1, CV_32SC1);

//示例:
//训练需要用到的数据
float train_data[4][4] = {	{ 0.814973, 15.1147, 0.431797, 0.933121 },	{ 0.95266, 3.70758, 0.139839, 0.983595 },	{ 0.973312, 1.95185, 0.0861551, 0.991363 },	{ 0.922384, 6.42396, 0.211111, 0.971575 }	};
int labels[4] = {	1,	2,	3,	4	};
//转为Mat以调用
Mat train_Mat(4, 4, CV_32FC1, train_data);
Mat label_Mat(4, 1, CV_32SC1, labels);
train(train_Mat, label_Mat);
*/
void train(Mat train_mat, Mat label_mat)
{
	//	Mat train_mat = Mat::zeros(样本数, 特征向量长度, CV_32FC1);
	//	Mat label_mat = Mat::zeros(样本数, 1, CV_32SC1);
	Ptr<SVM> svm = SVM::create();
	svm->setType(SVM::C_SVC);
	svm->setKernel(SVM::LINEAR);
	svm->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER, 100, 1e-6));
	svm->train(train_mat, ROW_SAMPLE, label_mat);
	svm->save("svm.xml");
	cout << "训练结束" << endl;
}

预测 

// 预测
/*
float teatData[2][4] = { { 0.814973, 15.1147, 0.431797, 0.933121 },	{ 0.95266, 3.70758, 0.139839, 0.983595 } };
Mat query(2, 4, CV_32FC1, teatData);	
Mat 结果 = class_fier.predict(query);
cout << 结果;
结果.at<Point2f>(0, 0).x;//第一个预测值
*/
Mat predict(Mat query)
{
	// Mat query(样本数, 特征向量长度, CV_32FC1, teatData);
	Ptr<SVM> svm = Algorithm::load<SVM>("svm.xml");
	if (!svm.empty())
	{
		Mat result;
		svm->predict(query, result);
		// 多个样本的预测
		for (size_t i = 0; i < result.rows; i++)
		{
			int a = result.at<Point2f>(i, 0).x;
			std::cout << a << endl;
		}
		return result;
	}		
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智能之心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值