1. 程式人生 > >神經網路學習引入-鄰近演算法Nearest Neighbor Classifier

神經網路學習引入-鄰近演算法Nearest Neighbor Classifier

鄰近演算法

這個分類演算法與卷積神經網路無關,並且在實際應用中的使用也並不是特別廣泛,但是通過對這個演算法的學習,我們能夠對圖片分類問題有一個大致的解決思路。

L1距離與L2距離

給定的兩個圖片,將它們表現成兩個向量I1、I2,一個最容易理解、最容易被接受的對比它們的方法是L1距離
d 1 ( I

1 , I 2 ) = p
I 1 p I 2 p
d_{1}(I_{1},I_{2})=\sum_{p}|I_{1}^{p}-I_{2}^{p}|

  • 計算距離的另一方法
    有許多方法都可以用於計算兩個向量的距離,另一個常用的方法是L2距離
    d 2 ( I 1 , I 2 ) = p ( I 1 p I 2 p ) 2 d_{2}(I_{1},I_{2})=\sqrt{\sum_{p}(I_{1}^{p}-I_{2}^{p})^{2}}

  • L1距離和L2距離的對比
    在實際使用中,當計算兩個向量的區別的時候,L2距離比L1距離更能體現二者的區別。(In particular, the L2 distance is much more unforgiving than the L1 distance when it comes to differences between two vectors.)也就是說,L2距離傾向於將二者的差異放大。
    L1距離和L2距離(或者說兩個圖片的L1或L2距離)是最常用的評價兩張圖片差異的方法。

K鄰近演算法 K-Nearest neighbor Classifier

除了找到訓練集中距離最近的一張圖片之外,我們還希望可以通過尋找最近的k張圖片來用於對待分類圖片進行分類。

  • 如何選取一個合適的k?
    使用驗證集(validation sets)來調整超引數。也就是說,所有的樣本集會被分為三個部分:訓練集,驗證集,測試集。訓練集用於訓練模型,驗證集用於調整超引數以尋找到一個最合適的超引數(傳說中的煉丹),測試集用於評價整個模型的效率(準確率召回率這些東西的計算)。
    我們不能用測試集來調整超引數,這樣的話我們的模型的結果僅僅只對該訓練集有意義,失去了普遍性。也就是說測試集僅僅只在整個流程的最後使用且僅僅使用一次

交叉驗證 Cross-validation

當我們手上的樣本集數量非常小的時候,使用一個更為精巧的方法來進行超引數的調整——交叉驗證方法。
在不同的驗證集之間進行迭代並在最後將它們的得分取一個平均值作為最終得分
下面以5折交叉驗證作為例子:先將訓練集分為五等份A、B、C、D、E,然後選取其中的四份A、B、C、D用於訓練,剩下的一份E作為驗證集用於超引數的調整,得到一個評分 R 1 R_{1}
同樣的,A、B、C、E作為訓練集,D作為驗證集,得到結果 R 2 R_{2} ;
A、B、D、E作為訓練集,C作為驗證集,得到結果 R 3 R_{3} ;
A、C、D、E作為訓練集,B作為驗證集,得到結果 R 4 R_{4} ;
B、C、D、E作為訓練集,A作為驗證集,得到結果 R 5 R_{5} ;
最終模型得分為 ( R 1 + R 2 + R 3 + R 4 + R 5 ) / 5 (R_{1}+R_{2}+R_{3}+R_{4}+R_{5})/5

在實際使用中,反而不是特別喜愛使用交叉驗證,因為交叉驗證需要消耗大量的計算資源。只有在樣本集不充足,驗證集能夠獲取的樣本非常小的時候才使用交叉驗證。

鄰近演算法的優缺點

  • 優點:實現簡單,易於理解,訓練時間短。
    因為鄰近演算法的訓練過程只需要儲存訓練資料並建立索引

  • 缺點:測試時間長,佔用過多的儲存空間。
    給一個測試資料進行預測需要對比訓練集中的每一個樣本資料,倒置需要消耗很長的時間。
    在實際應用中,我們往往更關心一個模型的測試效率而不是很關心模型訓練會佔用的時間。
    鄰近演算法必須儲存所有的訓練資料,佔用過多的儲存空間。