KNN近鄰分類法(k-Nearest Neighbor)是一個理論上比較成熟的方法,也是最簡單的機器學習算法之一。
這個算法首先貯藏所有的訓練樣本,然后通過分析(包括選舉,計算加權和等方式)一個新樣本周圍K個最近鄰以給出該樣本的相應值。這種方法有時候被稱作“基於樣本的學習”,即為了預測,我們對於給定的輸入搜索最近的已知其相應的特征向量。
簡單說來就是從訓練樣本中找出K個與其最相近的樣本,然后看這K個樣本中哪個類別的樣本多,則待判定的值(或說抽樣)就屬於這個類別。
有兩類不同的樣本數據,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的數據則是待分類的數據。也就是說,現在,我們不知道中間那個綠色的數據是從屬於哪一類(藍色小正方形or紅色小三角形),下面,我們就要解決這個問題:給這個綠色的圓分類。
判別上圖中那個綠色的圓是屬於哪一類數據就從它的鄰居下手。但一次性看多少個鄰居呢?從上圖中,你還能看到:
- 如果K=3,綠色圓點的最近的3個鄰居是2個紅色小三角形和1個藍色小正方形,少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於紅色的三角形一類。
- 如果K=5,綠色圓點的最近的5個鄰居是2個紅色三角形和3個藍色的正方形,還是少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於藍色的正方形一類。
於此我們看到,當無法判定當前待分類點是從屬於已知分類中的哪一類時,我們可以依據統計學的理論看它所處的位置特征,衡量它周圍鄰居的權重,而把它歸為(或分配)到權重更大的那一類。這就是K近鄰算法的核心思想。
KNN算法的步驟
- 計算已知類別數據集中每個點與當前點的距離;
- 選取與當前點距離最小的K個點;
- 統計前K個點中每個類別的樣本出現的頻率;
- 返回前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;
參數說明:
- samples為樣本數*特征數的浮點矩陣;
- K為尋找最近點的個數;results與預測結果;
- neibhbors為k*樣本數的指針數組(輸入為const,實在不知為何如此設計);
- neighborResponse為樣本數*k的每個樣本K個近鄰的輸出值;
- 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個訓練實例點的類來預測輸入實例點的類別。
- 基於實例的方法:推遲建模,當給定訓練元組時,簡單地存儲訓練數據(或稍加處理),一直等到給定一個測試元組。