小编use*_*351的帖子

使用Python广播的内存高效L2规范

我正在尝试使用欧几里德距离,基于它们与样本数据集的相似性,实现一种在测试数据集中聚类点的方法.测试数据集有500个点,每个点是N维向量(N = 1024).训练数据集大约有10000个点,每个点也是1024维度的向量.目标是找到每个测试点和所有采样点之间的L2距离,以找到最接近的样本(不使用任何python距离函数).由于测试阵列和训练阵列有不同的大小,我尝试使用广播:

    import numpy as np
    dist = np.sqrt(np.sum( (test[:,np.newaxis] - train)**2, axis=2))
Run Code Online (Sandbox Code Playgroud)

其中test是一个形状数组(500,1024),train是一个形状数组(10000,1024).我得到一个MemoryError.但是,相同的代码适用于较小的数组.例如:

     test= np.array([[1,2],[3,4]])
     train=np.array([[1,0],[0,1],[1,1]])
Run Code Online (Sandbox Code Playgroud)

是否有一种更有效的内存方式来进行上述计算而没有循环?基于在线帖子,我们可以使用矩阵乘法sqrt(X*X-2*X*Y + Y*Y)来实现L2范数.所以我尝试了以下方法:

    x2 = np.dot(test, test.T)
    y2 = np.dot(train,train.T)
    xy = 2* np.dot(test,train.T)

    dist = np.sqrt(x2 - xy + y2)
Run Code Online (Sandbox Code Playgroud)

由于矩阵具有不同的形状,当我尝试广播时,存在尺寸不匹配,我不确定什么是正确的广播方式(没有太多的Python广播经验).我想知道在Python中实现L2距离计算作为矩阵乘法的正确方法是什么,其中矩阵具有不同的形状.合成距离矩阵应该具有dist [i,j] =测试点i和样本点j之间的欧几里德距离.

谢谢

python numpy euclidean-distance numpy-broadcasting

7
推荐指数
2
解决办法
9445
查看次数