cs231n的第一次作業knn的問題

2021-07-26 22:20:11 字數 3096 閱讀 5324

knn

1.關於兩個樣本間的距離計算(這裡用的是l2距離),原程式提供了三種方法。分別是兩重迴圈,一重迴圈和無迴圈。no_loop的沒有想到,儘管提示裡說了用numpy的broadcast機制,看了其他人寫的**才略微懂了點。

這裡是自己寫的小測試,一重迴圈:

import numpy as np

a = np.array([[1,2,3],[4,5,6]])

b = np.array([[1,2,3],[4,5,6],[7,8,8],[2,3,2]])

####### l2 loop1

nums = a.shape[0]

for i in xrange(nums):

dist2 = np.sum(np.square(a[i]-b[:,:]), axis = 1)

print dist2

輸出

[ 0 27 97 3]

[27 0 22 24]

無迴圈:

import numpy as np

a = np.array([[1,2,3],[4,5,6]])

b = np.array([[1,2,3],[4,5,6],[7,8,8],[2,3,2]])

####### l2 no_loop

test_num = a.shape[0]

train_num = b.shape[0]

dist2 = np.zeros((test_num, train_num))

ab = np.dot(a, b.t)

aa = np.square(a).sum(axis = 1)

bb = np.square(b).sum(axis = 1)

print a.shape

print b.t.shape

print

"aa= ",aa.shape

print

"aa.t = ",np.matrix(aa).t

print

"bb = ", bb.shape

print

"ab = ", ab

dist2 = bb - 2*ab + np.matrix(aa).t

print

"dist2 = ", dist2

輸出

(2, 3)

(3, 4)

aa= (2,)

aa.t = [[14]

[77]]

bb = (4,)

ab = [[ 14 32 47 14]

[ 32 77 116 35]]

dist2 = [[ 0 27 97 3]

[27 0 22 24]]

其中dist2的計算為

dist2[2*4] = bb[1*4] - 2*ab[2*4] + aa[2*1]

在numpy的broadc機制下為

[bb, + 2*ab + [aa, aa, aa, aa]

bb]所以,計算test中樣本與train中樣本間距離可以用如下方法

dists = np.zeros((num_test, num_train)) 

ab = np.dot(x, self.x_train.t)

aa = np.square(x).sum(axis=1)

bb = np.square(self.x_train).sum(axis=1)

dists = -2 * ab + bb + np.matrix(aa).t

當然dists最後可以開平方或者不開平方也可以,畢竟是單調函式。

這裡有乙個問題,就是2loop為什麼比1loop快

two loop version took 23.189455 seconds

one loop version took 30.087738 seconds

no loop version took 0.254417 seconds

2.結果**的時候需要找出前k個最小距離,距離排序可以用numpy的argsort,找出現次數最多的類別可以用python模組collections中的計數器counter。

測試**:

import numpy as np

from collections import counter

closest_y = [3, 2, 1, 3, 3, 3, 4, 1, 1, 1]

hh = counter(closest_y)

print hh

a = hh.most_common(2)[0][0]

b = hh.most_common(2)[1][0]

print a,b

輸出

counter()

1 3knn具體實現**

for i in xrange(num_test):

closest_y =

labels = self.y_train[np.argsort(dists[i, :])].flatten()

# print labels.shape

closest_y = labels[0:k]

c = counter(closest_y)

y_pred[i] = c.most_common(1)[0][0]

3.交叉驗證

先將train樣本k等分,相應的y_labels也對應k等分。每次取乙份為驗證集,其餘作為訓練集。此時可以用numpy的vstack和hstack來合併兩個陣列。

最後將交叉驗證的結果畫成圖表:

可以看出k取8較好

k取8時對測試集的測試準確率為

got 139 / 500 correct => accuracy: 0.278000

參考部落格

CS231n 第一講 課程介紹

為什麼選擇這門課 2017年7月 8月,完成了吳恩達在coursera上的課程 machine learning 共11周的課程,每一課都有課堂練習。week2 week9,共有8次課後程式設計作業。程式設計作業設計的非常友好,我用matlab獨自完成了所有作業。當時 8月24號 以98.4的分數完...

第一次作業

1.用較低的成本,開發出滿足客戶需求的軟體,開發的軟體可靠性高,易於維護和移植 2.分為設計階段,開發階段和測試執行階段 1 設計階段 分析客戶需求,明確要解決哪些問題,實現哪些功能,以及確定基本方法 2 開發階段 a.概要設計 畫出流程圖,進行模組化劃分,建立模組的層次結構以及呼叫關係 b.詳細設...

第一次作業

1.4 非計算機專業 程式和軟體有何不同?答 程式是通過計算機語言寫出來的具有許多演算法的摸板,是實現軟體功能的底層推手 推手的意思可以理解為動力 所以,程式是軟體的內在因子,而軟體是乙個或多個程式通過編譯器編譯出來的成品。1.3 查詢資料,解釋什麼是圖靈測試?答 指測試者與被測試者 乙個人和一台機...