1. 程式人生 > 其它 >knn分類器中在求歐式距離時從三重迴圈到無迴圈的演算法進階

knn分類器中在求歐式距離時從三重迴圈到無迴圈的演算法進階

技術標籤:筆記python演算法機器學習深度學習人工智慧

在我們瞭解了knn演算法原理之後,我們來到了演算法實現階段。現在我們有5000張訓練集照片(self.X_train,self.X_train.shape(num_train=5000,D),D為維度=3072)和500張測試集照片(X),他們都是由32*32個畫素點以及3通道色彩構成的彩色圖片,我們按照自己的理解完成演算法.
三迴圈演算法:
首先兩個迴圈很好理解
for i in range(num_test):
for j in range(num_train):
這兩個迴圈會幫助我們遍歷所有測試集和訓練集的對映組合,當在某個特定迴圈下時,我們需要完成的任務就是計算i0和j0的歐式距離。

圖為歐式距離公式。
在這裡插入圖片描述
那麼我們需要用訓練集元素特徵-測試集元素特徵再平方,將這3072個平方值再相加並開方之後我們就得到了所有組合的對應距離。
我們的想法貌似沒有問題,那麼執行我們的演算法,我們發現過了很長時間結果都沒有出來。現在我們考慮迴圈次數是50005003072,並且我們的計算機在進行浮點運算時本來就沒那麼迅速,因此三迴圈演算法基本可以拋棄。
二迴圈演算法:
受到最近找到的一篇無迴圈演算法的啟發,我寫了一下二迴圈演算法,也能在較短時間內執行出結果。
首先我們要了解完全平方式。
在這裡插入圖片描述
我們假設我們要求的兩組歐氏距離向量分別為N[n1,n2…nD],和M[m1,m2…mD],我們用NN.T(N的轉置)即可得到x^2 M

M.T即可得到y方,N*M.T即可得到xy,很容易就可以得出下列演算法

        for i in range(num_test):
            for j in range(num_train):
                x=X[i].reshape(1,-1)#這裡一定要注意一維陣列和只有一行的二維陣列的區別
                y=self.X_train[j].reshape(1,-1)
                a=np.dot(x,x.T)+np.dot(y,y.T)-2*np.dot(x,y.T)
                dists[
i][j]=a**0.5 pass

無迴圈演算法:
因為這個博主寫的已經相當詳細,所以我不再贅述,下面是連結。
https://blog.csdn.net/qq_27261889/article/details/84891734
當然我們也可以通過np.linalg.norm()這個函式來完成。