我正在尝试使用欧几里得距离实现一种方法,根据它们与样本数据集的相似性对测试数据集中的点进行聚类。测试数据集有 500 个点,每个点是一个 N 维向量(N=1024)。训练数据集大约有 10000 个点,每个点也是一个 1024 维向量。目标是找到每个测试点和所有样本点之间的 L2 距离,以找到最接近的样本(不使用任何 python 距离函数)。由于测试数组和训练数组的大小不同,我尝试使用广播:
import numpy as np
dist = np.sqrt(np.sum( (test[:,np.newaxis] - train)**2, axis=2))
其中 test 是一个形状数组 (500,1024),而 train 是一个形状数组 (10000,1024)。我收到了 MemoryError。但是,相同的代码适用于较小的数组。例如:
test= np.array([[1,2],[3,4]])
train=np.array([[1,0],[0,1],[1,1]])
有没有更高效的内存方法来进行上述计算而无需循环?根据网上的帖子,我们可以使用矩阵乘法 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)
由于矩阵具有不同的形状,当我尝试广播时,存在维度不匹配,我不确定什么是正确的广播方式(对 Python 广播没有太多经验)。我想知道在 Python 中将 L2 距离计算实现为矩阵乘法的正确方法是什么,其中矩阵具有不同的形状。结果距离矩阵应具有 dist[i,j] = 测试点 i 和样本点 j 之间的欧几里得距离。
谢谢