现在的位置: 首页 > 综合 > 正文

使用KNN算法的分类实验源代码

2014年01月08日 ⁄ 综合 ⁄ 共 1325字 ⁄ 字号 评论关闭

一个很简单的实验,2分类,训练集为20张图片,测试集合为500张图片。

折腾了很久才弄好了调用结果,但是结果不是太好,不如SVM。

double classifyByKNN( const cv::Mat& trainData, const cv::Mat& trainResponse, const cv::Mat& testData, const cv::Mat& testResponse )
{
const int C = 10001;
const int K = 15; // 参数K的取值
int i, j, k;
float response;
double accuracy = 0;
float _sample[C];
CvMat sample = cvMat( 1, C, CV_32FC1, _sample );
//CvMat* traincm = cvCreateMat(trainData.rows, trainData.cols, CV_32FC1);
//CvMat* testcm = cvCreateMat(testData.rows, testData.cols, CV_32FC1);
CvMat* traincm = &trainData.operator CvMat();
CvMat* testcm = &testData.operator CvMat();
CvMat* trainre = &trainResponse.operator CvMat();
CvMat* nearests = &testResponse.operator CvMat();

//CvKNearest( const CvMat* _train_data, const CvMat* _responses, const CvMat* _sample_idx=0, bool _is_regression=false, int max_k=32 );//有参构造函数
//train( const CvMat* _train_data, const CvMat* _responses,const CvMat* _sample_idx=0, bool is_regression=false,int _max_k=32, bool __base=false );

CvKNearest knn( traincm, trainre, 0, false, K );
//CvKNearest knn(trainData, trainResponse, 0, false, K);
knn.train(traincm, trainre, 0, false, K, false);
//knn.train(trainData, trainResponse, trainData,false, K, false); 
cout << "Training Over" << endl << "Testing..." << endl ;

for ( int row = 0; row < testData.rows; row++ )
{
response = knn.find_nearest(testcm, K, nearests, 0, 0);
if ( testResponse.at<float>( row, 0 ) == response)
{
accuracy++;
}
}
cout << "Testing Over" << endl ;
return accuracy / testData.rows ;
}

 

【上篇】
【下篇】

抱歉!评论已关闭.