【问题标题】:how to fast compute distance between high dimension vectors如何快速计算高维向量之间的距离
【发布时间】:2011-02-22 22:15:45
【问题描述】:

假设有三组高维向量:

{a_1, a_2, ..., a_N},

{b_1, b_2, ... , b_N},

{c_1, c_2, ..., c_N}。

我的每个向量都可以表示为:x = a_i + b_j + c_k,其中 1

我的问题是,如果有两个向量:x = (i_1, j_1, k_1), y = (i_2, j_2, k_2),有没有一种方法可以计算这两个向量的欧几里得距离而无需解码 x 和是的。

【问题讨论】:

  • 对您的符号感到困惑。一个向量的格式是什么?
  • “不解码”是什么意思?
  • 向量在 R^M 空间中。需要 M 个浮点数来存储一个向量。如果向量编码为 (i, j, k),则只需要 3 个 int。
  • 解码一个向量就是从3个int值中恢复M个浮点值:(i, j, k) ==> a_i + b_j + c_k。如果我解码向量,那么很容易计算两个向量的距离。
  • 三个组向量 {a_1, a_2, ..., a_N}, {b_1, b_2, ... , b_N}, {c_1, c_2, ..., c_N}。可以视为三个“基本向量”。

标签: algorithm


【解决方案1】:

组件之间差异的平方和的平方根。没有其他办法。

您应该缩放这些值以防止出现上溢/下溢问题。在求平方、求和和取平方根之前,搜索最大差并将所有分量除以它。

【讨论】:

    【解决方案2】:

    假设您只有两个组。您正在尝试计算标量积

    (a_i1 + b_j1, a_i2 + b_j2)
    = (a_i1,a_i2) + (b_j1,b_j2) + (a_i1,b_j2) + (a_i2,b_j1) # <- elementary scalar products
    

    因此,如果您知道向量 a_i、b_j、c_k 的元素之间必要的基本标量积,则无需“解码”x 和 y,可以直接计算标量积。

    请注意,这正是在非正交基础上计算普通欧几里得距离时发生的情况。

    【讨论】:

    • a_i1, a_i2 ... 都是向量。所以我认为你的结果是(i1,j1,k1)和(i2,j2,k2)之间距离的上限
    • 我明白了。我认为您可以编辑您的问题以使其更清楚。
    • 您应该使用一般张量关系来计算非欧几里得坐标系中的距离。
    • 我明白了...谢谢。另一个问题,如果y被编码为(a_i, b_j, c_k),而x没有被编码,那么标量积:(x, a_i + b_j + c_k) = (x, a_i) + (x, b_j) + ( x, c_k)。我说的对吗?
    【解决方案3】:

    如果您对近似结果感到满意,您可以使用 random projection 将高维基向量投影到小维空间中。 Johnson-Lindenstrauss lemma 说你可以将你的维度减少到 O(log N),这样距离很有可能保持大致相同。

    【讨论】:

      猜你喜欢
      • 2022-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 2014-06-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多