/*****************************************************************************************************
程序功能:
SVM线性不可分的情况示例程序解读
程序说明:
1)本训练程序中,一共有两类样本,是一个基于SVM的二分类问题;其中每类样本集的数量为100个样本,其
中90个样本是线性可分的,10个是线性不可分的
2)这200个样本的具体数据存储在trainData内;trainData是一个200行2列的矩阵,其中第一列存储的样本是
X值;第二列存储的样本是Y值;每一列的前90个元素是第一类线性可分的部分,后90个元素是第二类
线性可分的部分,中间的20个元素是线性不可分的部分。
开发环境:
VS2012 + OpenGl(GLUT3.7) + OpenCv2.4.9 + Halcon10.0
时间地点:
陕西师范大学----2017.3.2
作 者:
九月
*****************************************************************************************************/
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include <iomanip>
#define NTRAINING_SAMPLES 100 //[1]每个样本集的数量
#define FRAC_LINEAR_SEP 0.9f //[2]其中线性可分的部分
using namespace cv;
using namespace std;
void printfMat(Mat M);
int main()
{
//【1】创建一个可视化的图像
const int WIDTH = 512;
const int HEIGHT = 512;
cv::Mat I = Mat::zeros(HEIGHT, WIDTH, CV_8UC3); //[3]Matlab风格的矩阵的初始化
Mat trainData(2 * NTRAINING_SAMPLES, 2, CV_32FC1); //[4]训练样本数据的存储矩阵
Mat labels(2 * NTRAINING_SAMPLES, 1, CV_32FC1); //[5]训练样本类别的存储矩阵
RNG rng(100); //[6]设定随机数的种子
//[7]设定线性可分部分的训练数据量
int nLinearSamples = (int)(FRAC_LINEAR_SEP * NTRAINING_SAMPLES);
//【2】设定第一类中的数据
Mat trainClass = trainData.rowRange(0, nLinearSamples);//[8]从整个数据取出[0,89]行的数据
Mat c = trainClass.colRange(0, 1); //[9]取出第一列
//[10]随机生成X的值:[0,0.4*WIDTH]
rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(0.4 * WIDTH));
//printfMat(c);
c = trainClass.colRange(1, 2); //[11]取出第二列
rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(HEIGHT)); //[12]随机生成Y的值
//【3】设定第二类中的数据 //[13]从整个数据中取出[110,199]行
trainClass = trainData.rowRange(2 * NTRAINING_SAMPLES - nLinearSamples, 2 * NTRAINING_SAMPLES);
c = trainClass.colRange(0, 1); //[14]取出第一列
//[15]随机生成X的值[0.6*WIDTH,WIDTH]
rng.fill(c, RNG::UNIFORM, Scalar(0.6*WIDTH), Scalar(WIDTH));
//[16]取出第二列
c = trainClass.colRange(1, 2);
rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(HEIGHT)); //[17]随机生成Y的值
//【4】线性不可分的数据
trainClass = trainData.rowRange(nLinearSamples, 2 * NTRAINING_SAMPLES - nLinearSamples);
c = trainClass.colRange(0, 1);
rng.fill(c, RNG::UNIFORM, Scalar(0.4*WIDTH), Scalar(0.6*WIDTH));
c = trainClass.colRange(1, 2);
rng.fill(c, RNG::UNIFORM, Scalar(1), Scalar(HEIGHT));
//【5】为所有数据设置标签:
//1)前100个为第一类数据
//2)后100个为第二类数据
labels.rowRange(0, NTRAINING_SAMPLES).setTo(1); // Class 1
labels.rowRange(NTRAINING_SAMPLES, 2 * NTRAINING_SAMPLES).setTo(2); // Class 2
//【6】设置支持向量机SVM的参数
CvSVMParams params;
params.svm_type = SVM::C_SVC;
params.C = 0.1;
params.kernel_type = SVM::LINEAR;
params.term_crit = TermCriteria(CV_TERMCRIT_ITER, (int)1e7, 1e-6);
//【7】训练SVM
std::cout << "Starting training process" << endl;
CvSVM svm;
svm.train(trainData, labels, Mat(), Mat(), params);
std::cout << "Finished training process" << endl;
//【8】显示判决区域
cv::Vec3b green(0, 100, 0);
cv::Vec3d blue(100, 0, 0);
for (int i = 0; i < I.rows; ++i)
for (int j = 0; j < I.cols; ++j)
{
Mat sampleMat = (Mat_<float>(1, 2) << i, j);
float response = svm.predict(sampleMat); //[1]判决函数
if (response == 1) I.at<Vec3b>(j, i) = green; //[2]第一类
else if (response == 2) I.at<Vec3b>(j, i) = blue; //[3]第二类
}
//【9】显示训练数据
int thick = -1;
int lineType = 8;
float px;
float py;
// Class 1
for (int i = 0; i < NTRAINING_SAMPLES; ++i)
{
px = trainData.at<float>(i, 0);
py = trainData.at<float>(i, 1);
circle(I, Point((int)px, (int)py), 3, Scalar(0, 255, 0), thick, lineType);
}
// Class 2
for (int i = NTRAINING_SAMPLES; i <2 * NTRAINING_SAMPLES; ++i)
{
px = trainData.at<float>(i, 0);
py = trainData.at<float>(i, 1);
circle(I, Point((int)px, (int)py), 3, Scalar(255, 0, 0), thick, lineType);
}
//【10】显示支持向量点
thick = 2;
lineType = 8;
int x = svm.get_support_vector_count();
for (int i = 0; i < x; ++i)
{
const float* v = svm.get_support_vector(i);
circle(I, Point((int)v[0], (int)v[1]), 6, Scalar(128, 128, 128), thick, lineType);
}
imwrite("result.png", I); // save the Image
imshow("SVM for Non-Linear Training Data", I); // show it to the user
waitKey(0);
}
void printfMat(Mat M)
{
for (int i = 0; i < M.rows; i++)
{
for (int j = 0; j < M.cols; j++)
{
printf("%7.2lf,",M.at<float>(i,j));
}
cout << ";" << endl;
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
支持向量机SVM测试程序
共74个文件
tlog:26个
obj:10个
pdb:8个
需积分: 15 11 下载量 166 浏览量
2017-07-31
13:24:13
上传
评论
收藏 16.18MB ZIP 举报
温馨提示
SVM支持向量机VS2015+OpenCV2.4.13测试程序。其中分三个部分1、线性可分下测试程序;2、线性不可分下测试程序;3、多个类别的SVM测试程序。内涵详细注释和源码解析,方便学习
资源推荐
资源详情
资源评论
收起资源包目录
SVM测试程序.zip (74个子文件)
SVM测试程序
SVM测试
Debug
SVM测试.pdb 2.7MB
SVM测试.ilk 1.17MB
SVM测试.exe 134KB
SVM测试.sln 2KB
.vs
SVM测试
v14
.suo 40KB
x64
Debug
SVM测试.pdb 9MB
Release
SVM测试.pdb 836KB
SVM测试.iobj 64KB
SVM测试.ipdb 23KB
SVM测试.exe 14KB
SVM测试.sdf 30MB
Release
SVM测试.pdb 1.8MB
SVM测试.iobj 338KB
SVM测试.ipdb 109KB
SVM测试.exe 21KB
SVM测试
Debug
vc140.pdb 1.81MB
SVM测试.tlog
CL.read.1.tlog 53KB
link.read.1.tlog 6KB
link.write.1.tlog 784B
CL.write.1.tlog 3KB
SVM测试.lastbuildstate 186B
link.command.1.tlog 4KB
CL.command.1.tlog 2KB
SVM_lineraly_inseparable.obj 283KB
vc140.idb 963KB
SVM测试.Build.CppClean.log 1KB
SVM_multiclass.obj 338KB
SVM测试.log 2KB
SVM.obj 303KB
SVM测试.vcxproj 8KB
result.png 8KB
SVM_multiclass.cpp 2KB
x64
Debug
vc140.pdb 2.04MB
SVM测试.tlog
unsuccessfulbuild 0B
CL.read.1.tlog 69KB
link.read.1.tlog 2B
link.write.1.tlog 2B
CL.write.1.tlog 2KB
SVM测试.lastbuildstate 184B
link.52944.write.1.tlog 2B
link.command.1.tlog 2KB
link.52944.read.1.tlog 2B
CL.command.1.tlog 2KB
SVM_lineraly_inseparable.obj 67KB
vc140.idb 1.07MB
SVM_multiclass.obj 446KB
SVM测试.log 3KB
SVM.obj 415KB
Release
vc140.pdb 596KB
SVM测试.tlog
CL.read.1.tlog 13KB
link.read.1.tlog 8KB
link.write.1.tlog 656B
CL.write.1.tlog 392B
SVM测试.lastbuildstate 189B
link.command.1.tlog 2KB
CL.command.1.tlog 694B
SVM测试.log 2KB
SVM.obj 1.23MB
Release
vc140.pdb 1.54MB
SVM测试.tlog
CL.read.1.tlog 52KB
link.read.1.tlog 7KB
link.write.1.tlog 932B
CL.write.1.tlog 2KB
SVM测试.lastbuildstate 188B
link.command.1.tlog 5KB
CL.command.1.tlog 2KB
SVM_lineraly_inseparable.obj 1.25MB
SVM_multiclass.obj 2.16MB
SVM测试.log 499B
SVM.obj 1.49MB
SVM测试.vcxproj.user 165B
SVM.cpp 4KB
SVM测试.vcxproj.filters 1KB
SVM_lineraly_inseparable.cpp 5KB
共 74 条
- 1
资源评论
Eternity丶
- 粉丝: 78
- 资源: 23
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功