美文网首页
以KNN为例的numpy广播机制

以KNN为例的numpy广播机制

作者: sony93 | 来源:发表于2017-09-27 10:03 被阅读0次

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

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

    实现详情:

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

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

    相关文章

      网友评论

          本文标题:以KNN为例的numpy广播机制

          本文链接:https://www.haomeiwen.com/subject/fsceextx.html