计算不同长度的两个向量之间的距离

16

计算两个相同长度向量之间的距离有不同的方法:欧几里得、曼哈顿、汉明 ...

我想知道是否有一种方法可以计算不同长度向量之间的距离。


你的向量包含什么?(位、浮点数等)?你不能用0填充它们,然后应用同长度向量的距离吗? - Scharron
4
你在纯数学上是正确的。但是,从问题的表述方式来看,我认为他谈论的是“计算机科学”中的长度,即向量中元素的数量。否则,他就不会在计算不同长度的向量之间的距离时遇到问题。 - Scharron
正如您所评论的,我指的是具有不同元素数量的向量。 - user1155073
元素将为1/0,表示特定功能的存在。 - user1155073
@user1155073 更新了我的答案以考虑不同的维度。 - ardnew
显示剩余2条评论
4个回答

11
欧几里得距离公式用于计算欧几里得空间中任意两点之间的距离。 在欧几里得空间中,一个点也被称为欧几里得向量。您可以使用欧几里得距离公式来计算两个不同长度的向量之间的距离。对于不同维度的向量,同样的原理适用。假设较低维度的向量在更高维度的空间中也存在,则可以将较低维度向量中所有缺失的分量设置为0,以便两个向量具有相同的维度。然后,使用任何一种提到的距离公式来计算距离。例如,考虑在R²中具有分量(a1,a2)的二维向量A和在R³中具有分量(b1,b2,b3)的三维向量B。要将A表示为R³中的向量,您会将其分量设置为(a1,a2,0)。然后,可以使用以下公式找到A和B之间的欧几里得距离d:
d² = (b1 - a1)² + (b2 - a2)² + (b3 - 0d = sqrt((b1 - a1)² + (b2 - a2)² + b3²)

对于您的特殊情况,组件将是01,因此所有差异将为-101。然后,平方差仅为01

如果您使用整数或单个位表示组件,则可以使用简单的位运算而不是某些算术运算(^表示XOR异或):

d = sqrt(b1 ^ a1 + b2 ^ a2 + ... + b(n-1) ^ a(n-1) + b(n) ^ a(n))

我们假设 A 的末尾组成部分为 0,因此最终公式将为:

d = sqrt(b1 ^ a1 + b2 ^ a2 + ... + b(n-1) + b(n))

从一开始看起来是有道理的。但是现在经过一段时间的思考后,如果你在使用欧几里得距离计算指纹匹配定位时,将缺失维度的缺失值设为零可能会引发问题。以你的示例为例...想象一下,向量A包含(0,0),向量B包含(0,0,0),还有一个向量C包含(0,0,0),那么欧几里得距离计算结果会对两个距离都得出零的结果。但是A离B的距离要比C离B的距离远得多。 - JacksOnF1re
@JacksOnF1re,我不确定我理解了你的意思。在你的例子中,为什么从A到B的距离应该与从B到C的距离不同呢? - ardnew
我的解释可能有点差。我的意思是,如果你用欧几里得距离计算距离,A和B之间的距离与B和C之间的距离相同。但这就是问题所在!由于缺少维度,A到B应该返回更高的距离。这可能会导致定位计算方面的问题(我猜),虽然在数学上是正确的,但对编程问题的实用性有限。抱歉我的英语表达不好。 - JacksOnF1re
@JacksOnF1re 这完全取决于你如何解释三维空间中的 A =(0,0)。它可以是(0,0,0),那么三个值都相等。或者它可以是一个在三维空间中旋转和移动的二维平面,那么距离可以是任意值。实际上不存在二维向量和三维向量之间的距离这种概念。 - toolforger

4

您无法直接计算不同长度的向量之间的距离。

下面提供的所有建议都始于将较短的向量映射到更长的向量的函数,然后像通常一样进行计算。

实际上可以使用许多、许多函数(无限多个):

  • 用零填充。这是最容易做的事情。比如,如果你有一辆汽车需要计算它与飞机的距离,那么这就将汽车放置在海平面上。
  • 查找缺失值。对于汽车与飞机的示例,您可以启动地理数据库,并通过经纬度查找高度。
  • 使用某些数学函数。

由于距离计算的结果强烈依赖于将较短向量转换为较长向量的函数,因此每个人都需要清楚使用的功能。这要么是因为领域中的每个人都认为只有一个函数有意义,要么是因为转换中使用的函数已经被记录下来。


很好的比喻,非常有道理。规范化函数(应用于_两个_向量)绝对支撑了您计算距离的含义。 - ardnew

0
您可以尝试计算维度为n和m(n ~= m)的两个向量p和q之间的平均最小距离:
d = 1/n * sum_i=1:n ( min_j=1:m (p(i) - q(j))) + 1/m * sum_j=1:m (min_i=1:n (p(i) - q(j)))

0

将短数组用零填充,以使其长度与长数组相同的想法似乎不是一个“普遍”正确的想法。

例如,如果我们有两组(数组、向量等)在不同时间瞬间对同一参数(例如温度、速度或二进制参数,如开关的状态)进行的测量。假设第一组A1由在一组瞬间T1进行的N次测量组成,而第二组A2由在一组瞬间T2进行的M次测量(M~=N)组成。

请注意,T2的分布与T1的分布任意不同。因此,在这里用零进行填充是没有意义的。

在这种情况下,我建议使用插值方法,方法是使用公共时间瞬间集T,如下所示:

A1_new = interpolate(T1, A1, T);

A2_new = interpolate(T2, A2, T);

其中,interpolate(x,y,xq)接受变量x、函数y(x)和查询点xq作为输入。'interpolate'函数返回插值输出y(xq)。

现在,我们可以通过任何适当的度量方法(例如欧几里得距离)比较相同大小的集合A1_new和A2_new。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接