您的位置:首页 > 编程语言

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

2012-07-25 16:34 423 查看
一个很简单的实验,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 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: