CS231n-assignment1筆記

knn


缺點

  • 分類器必須記住所有訓練數據並將其存儲起來,以便於未來測試數據用於比較。這在存儲空間上是低效的,數據集的大小很容易就以GB計。
  • 對一個測試圖像進行分類需要和所有訓練圖像作比較,算法計算資源耗費高。

Q:KNN與NN
A

  • KNN找出距離最近的k個樣本,然後根據投票數最多的得到標籤

  • 更高的k值可以讓分類的效果更平滑,使得分類器對於異常值更有抵抗力。
    在這裏插入圖片描述


一層循環求L2距離

dists[i, :]=np.sqrt(np.sum(np.square(X[i,:] - self.X_train),axis=1))   
#將每一行的求和結果賦值給dists[i,j]

直接求L2距離

dists += np.sum(self.X_train ** 2, axis=1)
dists += np.sum(X**2,axis=1).reshape(num_test,1)
dists -= 2 * X.dot(self.X_train.T)
dists = np.sqrt(dists)

np.bincount()
在這裏插入圖片描述

plt.scatter([k] * len(accuracies), accuracies) 
 #[k]* len(accuracies)同一個k有len(accuracies)個散點
plt.errorbar(k_choices, accuracies_mean, yerr=accuracies_std)   #誤差曲線

在這裏插入圖片描述


ValueError: object too deep for desired array

在這裏插入圖片描述
查了下應該就是np.bincount()參數要求1維的,然後改爲以下解決:

y_pred[i] = np.argmax(np.bincount(closest_y.reshape(len(closest_y))))

But

交叉驗證用指定k值運算正確率分開運行都可以運行,但在先交叉驗證找出最佳k之後再用最佳k進行預測計算就會報錯,具體原因還沒有想清楚