日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv的K近邻算法

發布時間:2025/3/21 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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近邻算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。