CS231n简介
详见 CS231n课程笔记1:Introduction。
注:斜体字用于注明作者自己的思考,正确性未经过验证,欢迎指教。
作业笔记
KNN部分主要关注与距离矩阵的计算。输入是X_test[test_num,D], X_train[train_num,D],其中D为特征维度,train_num、test_num分别是训练集以及测试集大小。返回dist[test_num,train_num],其中dist[i,j]为X_test[i]与X_train[j]的L2距离。
1. 2-loop算法
for i in range(test_num):
for j in range(train_num):
dist[i,j] = np.sum(np.square(X_test[i]-X_train[j]))
2. 1-loop算法
这里利用Numpy中A[D1,D]-B[D]结果为C[D1,D],其中C[i]=A[i]-B。
numpy中np.sum有axis用于表示求和的维度。
for i in range(test_num):
dist[i] = np.sum(np.square(X_train-X_test[i]),axis=1)
3. no-loop算法
这里利用numpy的broadcasting性质,例如A=[1,2], B=[[3],[4]], A+B=[[3+1,3+2],[4+1,4+2]]。
以及(a-b)^2=a^2+b^2-2ab。
numpy中sum的参数keepdims用于保留原有累加维度。
test_sum = np.sum(np.square(X_test),axis=1,keepdims=True)
train_sum=np.sum(np.square(X_train),axis=1)
test_mul_train=np.matmul(X_test,X_train.T)
dists = test_sum + train_sum - 2*test_mul_train