assignment1
學習記錄(做的過程中寫個提綱诉植,做完了再完善一下說不定是要理解深刻一點迂卢,總之寫下來沒壞處恢着,就當紀念啦(?>?<?))
環(huán)境Ubuntu
數據集cifar10
先完成knn代碼部分
第一部分
兩層循環(huán)求L2距離 compute_distances_two_loops
要求
#Compute the l2 distance between the ith test point and the jth? ? #
# training point, and store the result in dists[i, j]. You should? #
# not use a loop over dimension.
dists[i,j]=np.sqrt(np.sum((self.X_train[j,:]-X[i,:])**2))
一層循環(huán)求L2距離compute_distances_one_loops
# TODO:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
# Compute the l2 distance between the ith test point and all training #
# points, and store the result in dists[i, :].? ? ? ? ? ? ? ? ? ? ? ? #
dists[i,:]=np.sqrt(np.sum(self.X_train-X[i,:],axis=1))
無循環(huán) no_loop
# TODO:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
# Compute the l2 distance between all test points and all training? ? ? #
# points without using any explicit loops, and store the result in? ? ? #
# dists.? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
# You should implement this function using only basic array operations; #
# in particular you should not use functions from scipy.? ? ? ? ? ? ? ? #
# HINT: Try to formulate the l2 distance using matrix multiplication? ? #
#? ? ? and two broadcast sums.? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
用基本數組操作、廣播機制
平方差展開
(dists=sqrt(X_train^2+X^2-2*X_train*X))
第二部分
predict_labels
# TODO:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
# Use the distance matrix to find the k nearest neighbors of the ith? ? #
# testing point, and use self.y_train to find the labels of these? ? ? #
# neighbors. Store these labels in closest_y.? ? ? ? ? ? ? ? ? ? ? ? ? #
# Hint: Look up the function numpy.argsort.? ? ? ? ? ? ? ? ? ? ? ? ? ? #
# TODO:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
# Now that you have found the labels of the k nearest neighbors, you? ? #
# need to find the most common label in the list closest_y of labels.? #
# Store this label in y_pred[i]. Break ties by choosing the smaller? ? #
# label.? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #
使用 numpy.argsort
將dists進行排序存入數組
再挑出最合適的label
使用np.bincount和np.argmax
argmax:返回沿軸axis最大值的索引 bincount:統(tǒng)計次數,計算數據集的標簽列(y_train)的分布
closest_y=self.y_train[np.argsort(dists[i,:])[0:k]]
y_pred[i]=np.argmax(np.bincount(closest_y))
完成后
用jupyter notebook打開knn.ipynb危纫,運行
這種作業(yè)做起來好棒白诨印(注釋說的清楚明白嘿嘿)。
發(fā)現(xiàn)很多感覺懂的真正寫下來很難种蝶,有種文字障礙的感覺契耿。
numpy API一點都不熟 ,想著整理又覺得每次搜一下用法也可以螃征,哎可能這就是懶吧搪桂。
就是個記錄并非教程所以詳細過程也沒說啦。