以KNN为例的numpy广播机制

cs231n作业一中使用了了三种方法实现KNN算法:
1.最为基础的双循环
2.利用numpy的broadca机制实现单循环
3.利用broadcast和矩阵的数学性质实现无循环

首先,图片被拉伸为一维数组,即
X_train: (train_num, 一维数组)
X: (test_num, 一维数组)

实现详情:

以KNN为例的numpy广播机制_第1张图片
图片.png

双循环:

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)
以KNN为例的numpy广播机制_第2张图片
图片.png

单循环:

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)

以KNN为例的numpy广播机制_第3张图片
图片.png

没有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
图片.png

无循环:

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
以KNN为例的numpy广播机制_第4张图片
图片.png

其中需对a2进行转置,将之变为列向量,即相当于:
XXXX X
-2 XXXX + X + XXXX
XXXX X
-2×ab+a2+b2

你可能感兴趣的:(以KNN为例的numpy广播机制)