【问题标题】:Finite Metric Embeddings: Good Algorithm?有限度量嵌入:好的算法?
【发布时间】:2011-09-28 17:16:22
【问题描述】:

我有一个有限的度量空间,作为(对称)k x k 距离矩阵给出。我想要一种算法来(大约)等距地将其嵌入欧几里得空间 R^(k-1) 中。虽然并不总是可以通过求解距离给出的方程组来精确地做到这一点,但我正在寻找一个嵌入一些(非常小的)可控误差的解决方案。

我目前使用输出维度设置为 (k-1) 的多维缩放 (MDS)。我突然想到,通常 MDS 可能会针对您试图将环境嵌入维度减少到小于 (k-1)(通常为 2 或 3)的情况进行优化,并且可能有更好的算法来解决我的受限问题案例。

问题:使用欧几里得距离在 R^{k-1} 中实现大小为 k 的度量空间有什么好的/快速算法?

一些参数和指针:

(1) 我的 k 相对较小。说 3

(2) 我实际上并不关心是否嵌入 R^{k-1}。如果它简化了事情/使事情变得更快,任何 R^N 也可以,只要它是等距的。如果我增加到 R^k 或 R^(2k+1),如果有更快的算法或错误更少的算法,我会很高兴。

(3) 如果你能指出一个 python 实现,我会更开心。

(4) 任何比 MDS 更好的东西都可以工作。

【问题讨论】:

  • 你的距离真的服从三角不等式吗?
  • 这可能更适合 math.stackexchange.com(对于 mathoverflow 可能不够先进)。
  • 我不确定在这种情况下是否有比 MDS 更快的算法来解决这个问题。你的距离矩阵来自哪里?您最好立即减少生成距离矩阵的数据的维度(当然,只有在可能的情况下)。
  • @j_random_hacker:是的。这是一个度量空间link
  • @LiKao:距离矩阵来自点云集合的持久同源之间的瓶颈距离。

标签: python algorithm graph-algorithm metric


【解决方案1】:

为什么不试试LLE,你也可以在那里找到代码。

【讨论】:

    【解决方案2】:

    好的,这里承诺一个简单的解决方案:

    符号:让d_{i,j}=d_{j,i} 表示点ij 之间的平方 距离。设N 为点数。让p_i 表示点ip_{i,k} 表示该点的k-th 坐标。

    希望我现在能正确推导出算法。之后会有一些解释,以便您检查推导(当出现许多索引时我讨厌它)。

    该算法使用动态规划来得出正确的解决方案

    Initialization:
    p_{i,k} := 0 for all i and k
    
    Calculation:
    for i = 2 to N do
       sum = 0
       for j = 2 to i - 1 do
         accu = d_{i,j} - d_{i,1} - p_{j,j-1}^2
         for k = 1 to j-1 do
           accu = accu + 2 p_{i,k}*p_{j,k} - p_{j,k}^2
         done
         p_{i,j} = accu / ( 2 p_{j,j-1} )
         sum = sum + p_{i,j}^2
       done
       p_{i,i-1} = sqrt( d_{i,0} - sum )
    done
    

    如果我没有犯任何严重的索引错误(我通常会这样做),这应该可以解决问题。

    这背后的想法:

    我们将第一个点任意设置在原点,以使我们的生活更轻松。并不是说对于一个点p_i,当k > i-1 时,我们从不设置坐标k。 IE。对于第二个点我们只设置第一个坐标,对于第三个点我们只设置第一个和第二个坐标等等。

    现在假设我们有所有点 p_{k'} 的坐标,其中 k'<i 并且我们想要计算 p_{i} 的坐标,以便满足所有 d_{i,k'} (我们还不关心任何约束点k>k')。如果我们写下我们有的方程组

    d_{i,j} = \sum_{k=1}^N (p_{i,k} - p_{j,k} )^2

    因为p_{i,k}p_{j,k} 对于k>k' 都等于零,我们可以将其简化为:

    d_{i,j} = \sum_{k=1}^k' (p_{i,k} - p_{j,k} )^2

    还请注意,当k>j-1 时,所有p_{j,k} 的循环不变式都将为零。所以我们拆分这个方程:

    d_{i,j} = \sum_{k=1}^{j-1} (p_{i,k} - p_{j,k} )^2 + \sum_{k=j}^{k'} p_{i,j}^2

    对于我们刚刚得到的第一个方程:

    d_{i,1} = \sum_{k=1}^{j-1} (p_{i,k} - p_{j,k} )^2 + \sum_{k=j}^{k'} p_i{i,1}^2

    这个稍后需要一些特殊处理。

    现在如果我们求解正规方程中的所有二项式,我们得到:

    d_{i,j} = \sum_{k=1}^{j-1} p_{i,k}^2 - 2 p_{i,k} p_{j,k} + p_{j,k}^2 + \sum_{k=j}^{k'} p_{i,j}^2

    从中减去第一个等式,得到:

    d_{i,j} - d_{i,1} = \sum_{k=1}^{j-1} p_{j,k}^2 - 2 p_{i,k} p_{j,k}

    对于所有 j > 1。

    如果你看这个,你会注意到 p_i 的所有坐标方块都消失了,我们需要的唯一方块是已知的。这是一组线性方程,可以使用线性代数的方法轻松求解。实际上这组方程还有一个特别之处:方程已经是三角形的,所以你只需要传播解的最后一步。对于最后一步,我们只剩下一个二次方程,我们可以通过取一个平方根来求解。

    我希望你能按照我的推理。有点晚了,我的脑袋被这些索引弄得有点晕。

    编辑:是的,存在索引错误。固定的。当我有时间测试它时,我会尝试在 python 中实现它。

    【讨论】:

    • 一个附加说明:实际上可能没有必要使用完整的 R^{N-1},例如,如果三个点在一条线上,四个点在一个平面上等。在这种情况下,有在上面的算法中将被零除。这可以通过检测在第一次计算中何时将新计算的坐标设置为零来轻松解决。在这种情况下,您可以跳过这一点进行其余的计算,并减少最终点集的维数。
    • 好吧,我上次的评论错了。正如对原始问题的评论所举例说明的那样,这个问题可能没有解决方案。这意味着算法只有在答案存在的情况下才能找到答案。我将寻找一个证据,证明它在所有此类情况下都能找到答案,但还没有找到答案。
    • 这个算法的复杂度是O(n^4),我怀疑它是否会比MDS更好。
    • @g24l:你是如何达到 O(n^4) 的?内部循环中的代码采用 O(1),因此整个循环将采用 O(j),第二级比采用 O(i^2),最后整个算法采用 O(n^3) 而不是 O(n^ 4)。此外,MDS 每次迭代都需要 O( n^2 ),迭代次数未知,直到收敛(可能是无限时间)。所以除非你能确定 n 次迭代足以收敛,否则这个算法会更好,因为它有保证。
    • 您会得到 n^2 个方程,每一步至少需要 O((n^2)^2) 次运算才能求解。因此,您的复杂度为 O(n^3)+O(Kn^4),其中 K 是收敛的迭代次数。此外,最后的线性系统应该是敏感的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-26
    • 2019-12-12
    相关资源
    最近更新 更多