我正在尝试使用欧几里德距离,基于它们与样本数据集的相似性,实现一种在测试数据集中聚类点的方法.测试数据集有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之间的欧几里德距离.
谢谢