opencv的K近邻算法
K Nearest Neighbors
計算待測數據與樣本庫中每個樣本的距離,得到距離最小的前K個,進行投票表決,前K個中某一類的樣本數最多,則判斷待測數據為此類。
一、opencv 中主要的函數有:
(1)CvKNearest::train???? 訓練KNN模型
bool CvKNearest::train( const CvMat* _train_data, const CvMat* _responses, const CvMat* _sample_idx=0, bool is_regression=false, int _max_k=32, bool _update_base=false );這個類的方法訓練K近鄰模型。它遵循一個一般訓練方法約定的限制:只支持CV_ROW_SAMPLE數據格式,輸入向量必須都是有序的,而輸出可以是 無序的(當is_regression=false),可以是有序的(is_regression=true)。并且變量子集和省略度量是不被支持的。
參數_max_k 指定了最大鄰居的個數,它將被傳給方法find_nearest。參數 _update_base 指定模型是由原來的數據訓練(_update_base=false),還是被新訓練數據更新后再訓練(_update_base=true)。在后一種情況下_max_k 不能大于原值, 否則它會被忽略。
(2)CvKNearest::find_nearest? 尋找輸入向量的最近鄰
float CvKNearest::find_nearest( const CvMat* _samples, int k, CvMat* results=0, const float** neighbors=0, CvMat* neighbor_responses=0, CvMat* dist=0 ) const;對每個輸入向量(表示為matrix_sample的每一行),該方法找到k(k≤get_max_k() )個最近鄰。在回歸中,預測結果將是指定向量的近鄰的響應的均值。在分類中,類別將由投票決定。
對傳統分類和回歸預測來說,該方法可以有選擇的返回近鄰向量本身的指針(neighbors, array of k*_samples->rows pointers),它們相對應的輸出值(neighbor_responses, a vector of k*_samples->rows elements) ,和輸入向量與近鄰之間的距離(dist, also a vector of k*_samples->rows elements)。
對每個輸入向量來說,近鄰將按照它們到該向量的距離排序。
對單個輸入向量,所有的輸出矩陣是可選的,而且預測值將由該方法返回。
?
二、CvMat用法
CvMat* trainData;//存儲樣本數據
CvMat* trainClasses;//存儲類的標號
int totalTrainNum;//總訓練樣本數
int featureNum;//訓練樣本維數
trainData = cvCreateMat( totalTrainNum, featureNum, CV_32FC1 );
?trainClasses = cvCreateMat( totalTrainNum, 1, CV_32FC1 );
cvmSet(trainClasses,i,0,1); //設置cvMat第幾行第幾列的某個數為
得到判斷結果和準確度計算如下:
//其中test為待測數據的特征向量
CvMat* nearest=cvCreateMat(1,K,CV_32FC1);float result=knn->find_nearest(test,K,0,0,nearest,0); //所得結果int accuracy=0;//前K個樣本中屬于此類的樣本數for(int i=0;i<K;i++){if( nearest->data.fl[i] == result)accuracy++;}float pre=100*((float)accuracy/(float)K); //準確度printf("|\t%.0f\t| \t%.2f%% \t| \t%d of %d \t| \n",result,pre,accuracy,K);?
總結
以上是生活随笔為你收集整理的opencv的K近邻算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv 正脸和侧脸检测
- 下一篇: Opencv Kmeans聚类算法