一个运用SVM进行回归的例子

本文介绍了一个使用OpenCV中的CvSVM类进行正弦曲线拟合的例子。通过创建训练数据和测试数据,利用支持向量机算法进行训练并预测正弦值。文中展示了完整的C++代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include "cv.h"
#include "highgui.h"
#include "ml.h"
#include <cmath>
#include <iostream>
#include <iomanip>
using namespace std;


//以下例子用来拟合正弦曲线

int main(int argc, char **argv)
{
int num_train = 100;
int num_test = 100;
CvMat *train_data = cvCreateMat(num_train, 1, CV_32FC1);
CvMat *train_response = cvCreateMat(num_train, 1, CV_32FC1);
IplImage *dst=cvCreateImage(cvSize(400,320),8,3);
cvZero(dst);
dst->origin=1;

cvLine( dst, cvPoint(1,160), cvPoint(400,160), cvScalar(255,255,255,0), 3, 8, 0 );
cvLine( dst, cvPoint(8,1), cvPoint(8,320), cvScalar(255,255,255,0), 3, 8, 0 );


CvMat *test_data = cvCreateMat(num_test, 1, CV_32FC1);
CvMat *test_response = cvCreateMat(num_train, 1, CV_32FC1);

//initilize the training data and testing data
float *fptr_data = NULL, *fptr_response = NULL;
const float PI = 3.1415926f;
int i;
for(i = 0; i < train_data->rows; i++)
{
fptr_data = (float *)(train_data->data.ptr + i * train_data->step);
*fptr_data = 2*PI/train_data->rows *i;
//cout <<*fptr_data<<" ";
fptr_response = (float *)(train_response->data.ptr + i * train_response->step);
*fptr_response = sin(*fptr_data);
//cout <<*fptr_response<<endl;
}
for(i = 0; i < test_data->rows; i++)
{
fptr_data = (float *)(test_data->data.ptr + i * test_data->step);
*fptr_data = (2*PI/train_data->rows *i+0.5f);
fptr_response = (float *)(test_response->data.ptr + i * test_response->step);
*fptr_response = sin(*fptr_data);
}

CvSVM mysvm;
CvSVMParams param(103, 2, 2, 1, 1, 10, 1, 0.0001, NULL,
cvTermCriteria(CV_TERMCRIT_EPS, 100, 0.0001));
mysvm.train(train_data, train_response, 0, 0, param);
float tmp;
CvMat *sample = cvCreateMat(1,1, CV_32FC1);
cout<<"x\t\t"<<"y\t\t"<<"pre\t\t"<<"err"<<endl;

cvNamedWindow("output",1);

for(i = 0; i < test_data->rows; i++)
{
fptr_data = (float *)(test_data->data.ptr + i * test_data->step);
*((float *)sample->data.ptr) = *fptr_data;
tmp = mysvm.predict(sample);
float tmp2 = mysvm.predict(sample, false);
fptr_response = (float *)(test_response->data.ptr + i * test_response->step);

cout<<setprecision(4)<<*fptr_data<< "\t\t";
cout<<setprecision(4)<<*fptr_response<<"\t\t";
cout<<setprecision(4)<<tmp<<"\t\t";
cout<<setprecision(4)<<tmp - *fptr_response<<endl;

*fptr_data=*fptr_data*180/PI;
*fptr_response=100*(*fptr_response)+160;
tmp=100*tmp+160;

cvCircle( dst , cvPointFrom32f( cvPoint2D32f(*fptr_data,*fptr_response) ) ,
2, cvScalar(255,0,0,0) , -1 , 8 , 0 );
cvCircle( dst , cvPointFrom32f( cvPoint2D32f(*fptr_data,tmp) ) ,
2, cvScalar(0,0,255,0) , -1 , 8 , 0 );

cvShowImage("output",dst);
cvWaitKey(20);
}

cvWaitKey(0);

cvReleaseImage(&dst);
cvReleaseMat(&train_data);
cvReleaseMat(&test_data);
cvReleaseMat(&train_response);
cvReleaseMat(&test_response);
cvReleaseMat(&sample);
return 0;
}


[img]http://dl.iteye.com/upload/attachment/456390/fce6519c-8c8b-3ff5-b25b-9187876d25fb.jpg[/img]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值