OpenCV——KNN分類算法 <摘>


KNN近鄰分類法(k-Nearest Neighbor)是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。

這個算法首先貯藏所有的訓練樣本,然后通過分析(包括選舉,計算加權和等方式)一個新樣本周圍K個最近鄰以給出該樣本的相應值。這種方法有時候被稱作“基於樣本的學習”,即為了預測,我們對於給定的輸入搜索最近的已知其相應的特征向量。

簡單說來就是從訓練樣本中找出K個與其最相近的樣本,然后看這K個樣本中哪個類別的樣本多,則待判定的值(或說抽樣)就屬於這個類別。

                                                            

有兩類不同的樣本數據,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的數據則是待分類的數據。也就是說,現在,我們不知道中間那個綠色的數據是從屬於哪一類(藍色小正方形or紅色小三角形),下面,我們就要解決這個問題:給這個綠色的圓分類。

判別上圖中那個綠色的圓是屬於哪一類數據就從它的鄰居下手。但一次性看多少個鄰居呢?從上圖中,你還能看到:

  • 如果K=3,綠色圓點的最近的3個鄰居是2個紅色小三角形和1個藍色小正方形,少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於紅色的三角形一類。
  • 如果K=5,綠色圓點的最近的5個鄰居是2個紅色三角形和3個藍色的正方形,還是少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於藍色的正方形一類。

     於此我們看到,當無法判定當前待分類點是從屬於已知分類中的哪一類時,我們可以依據統計學的理論看它所處的位置特征,衡量它周圍鄰居的權重,而把它歸為(或分配)到權重更大的那一類。這就是K近鄰算法的核心思想。

KNN算法的步驟

  1. 計算已知類別數據集中每個點與當前點的距離;
  2. 選取與當前點距離最小的K個點;
  3. 統計前K個點中每個類別的樣本出現的頻率;
  4. 返回前K個點出現頻率最高的類別作為當前點的預測分類。

 

  • 訓練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 不能大於原值, 否則它會被忽略。

  • 尋找輸入向量的最近鄰
float CvKNearest::find_nearest( const CvMat* _samples, int k, CvMat* results=0, const float** neighbors=0, 
                                CvMat* neighbor_responses=0, CvMat* dist=0 ) const;

參數說明:

  1. samples為樣本數*特征數的浮點矩陣;
  2. K為尋找最近點的個數;results與預測結果;
  3. neibhbors為k*樣本數的指針數組(輸入為const,實在不知為何如此設計);
  4. neighborResponse為樣本數*k的每個樣本K個近鄰的輸出值;
  5. dist為樣本數*k的每個樣本K個近鄰的距離。

對每個輸入向量(表示為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)。

對每個輸入向量來說,近鄰將按照它們到該向量的距離排序。

對單個輸入向量,所有的輸出矩陣是可選的,而且預測值將由該方法返回。

 

 

 

一般的分類模型建立的步驟,分類一般分為兩種:

  • 決策樹歸納(消極學習法):先根據訓練集構造出分類模型,根據分類模型對測試集分類。

     消極學習法在提供訓練元組時只做少量工作,而在分類或預測時做更多的工作。KNN就是一種簡單的消極學習分類方法,它開始並不建立模型,而只是對於給定的訓練實例點和輸入實例點,基於給定的鄰居度量方式以及結合經驗選取合適的k值,計算並且查找出給定輸入實例點的k個最近鄰訓練實例點,然后基於某種給定的策略,利用這k個訓練實例點的類來預測輸入實例點的類別。

  •  基於實例的方法:推遲建模,當給定訓練元組時,簡單地存儲訓練數據(或稍加處理),一直等到給定一個測試元組。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM