cs231n作业一中使用了了三种方法实现KNN算法:
1.最为基础的双循环
2.利用numpy的broadca机制实现单循环
3.利用broadcast和矩阵的数学性质实现无循环
首先,图片被拉伸为一维数组,即
X_train: (train_num, 一维数组)
X: (test_num, 一维数组)
实现详情:
双循环:
dists = np.zeros((3,4))
for i in range(3):
for j in range(4):
dists[i][j] = np.sqrt(np.sum(np.square(a[i] - b[j])))
print(dists)
单循环:
dists1 = np.zeros((3, 4))
for i in range(3):
dists1[i] = np.sqrt(np.sum(np.square(a[i] - b), axis=1))
print(dists1)
没有axis参数表示全部相加,axis=0表示按列相加,axis=1表示按照行的方向相加
a2 = np.sum(np.square(a))
print a2
a2 = np.sum(np.square(a), axis=1)
print a2
print a2.shape
无循环:
a2 = np.transpose([np.sum(np.square(a), axis=1)])
print a2
print a2.shape
b2 = np.sum(np.square(b), axis=1)
print b2
print b2.shape
ab = np.dot(a, b.T)
dists2 = np.sqrt(a2 + b2 - 2 * ab)
print dists2
其中需对a2进行转置,将之变为列向量,即相当于:
XXXX X
-2 XXXX + X + XXXX
XXXX X
-2×ab+a2+b2