【问题标题】:Finding the coordinates of points from distance matrix从距离矩阵中找到点的坐标
【发布时间】:2012-06-13 08:26:23
【问题描述】:

我有一组点(坐标未知)和距离矩阵。我需要找到这些点的坐标以便绘制它们并显示我的算法的解决方案。

我可以在坐标 (0,0) 中设置其中一个点来简化,并找到其他点。谁能告诉我是否可以找到其他点的坐标,如果可以,如何?

提前致谢!

编辑 忘了说我只需要x-y上的坐标

【问题讨论】:

  • 那……需要大量的暴力破解……
  • 考虑三个点(一个三角形)。有两个方向和无限次的旋转会给出相同的距离矩阵。
  • 更进一步,我们说的是一维空间,还是二维空间,还是三维空间,还是四维空间……答案会因情况而异。通过 (0,0),我们应该接受它的二维吗?
  • 一旦你确定了一个方向和角度,第三个之后的所有点不都是明确的吗? (在 2D 空间中,因为 OP 给出了 2D 零。)
  • @KevinReid 一般来说,是的。但是,如果前三个点位于一条直线上,则您有两个选择(通过在线反射相互获得),直到您选择了不在该直线上的第一个点。

标签: math geometry triangulation


【解决方案1】:

这是一道数学题。导出坐标矩阵 X 仅由其距离矩阵给出。

但是,有一个有效的解决方案——多维缩放,它可以做一些线性代数。简单地说,它需要一个成对的欧几里得距离矩阵 D,输出是估计的坐标 Y(可能是旋转的),它是 X 的近似值。出于编程原因,在 Python 中使用 SciKit.manifold.MDS 即可。

【讨论】:

    【解决方案2】:

    基于角度的答案实施起来很麻烦,并且不容易推广到更高维度的数据。更好的方法是我和 WimC 的答案 here 中提到的:给定距离矩阵 D(i, j),定义

    M(i, j) = 0.5*(D(1, j)^2 + D(i, 1)^2 - D(i, j)^2)
    

    它应该是一个正半定矩阵,其秩等于可以嵌入点的最小欧几里得维度k。然后可以从对应于非零特征值q(i)Mk 特征向量v(i) 获得点的坐标:将向量sqrt(q(i))*v(i) 作为列放在n x k 矩阵X 中;那么X 的每一行都是一个点。换句话说,sqrt(q(i))*v(i) 给出了所有点的ith 分量。

    矩阵的特征值和特征向量可以在大多数编程语言中轻松获得(例如,在C/C++中使用GSL,在Matlab中使用内置函数eig,在Python中使用Numpy等)

    请注意,此特定方法始终将第一个点放在原点,但点的任何旋转、反射或平移也将满足原始距离矩阵。

    【讨论】:

    • 这应该是答案。无需自己编写代码,多维缩放函数可以在 Python 或 R 中找到。
    • 我最近也遇到了同样的问题,能否请您帮我看看我的推导过程是否正确?链接:math.stackexchange.com/questions/3663043/…
    【解决方案3】:

    如果对于点 p、q 和 r,您的矩阵中有 pq、qr 和 rp,则您有一个三角形。

    无论您的矩阵中有一个三角形,您都可以计算该三角形的两个解之一(独立于平面上三角形的欧几里德变换)。也就是说,对于您计算的每个三角形,它的镜像也是一个满足对 p、q 和 r 的距离约束的三角形。即使对于三角形也有两种解决方案,这导致了手性问题:您必须选择每个三角形的手性(方向),并且并非所有选择都可能导致问题的可行解决方案。

    不过,我有一些建议。如果条目数很少,请考虑使用simulated annealing。您可以将手性纳入退火步骤。这对于大型系统来说会很慢,并且可能不会收敛到完美的解决方案,但对于某些问题,这是最好的选择。

    第二个建议不会给你一个完美的解决方案,但它会分发错误:method of least squares。在您的情况下,目标函数将是矩阵中的距离与点之间的实际距离之间的误差。

    【讨论】:

    • 感谢您的回答。我不知道这是否是最好的方法,因为在某些情况下我有很多 o 点,并且元启发式并不总是返回最佳解决方案,或者在这种情况下,是一个可行的解决方案。所以我可能会花很多时间在它上面,但仍然没有得到可行的答案。
    • @DeepYellow:我喜欢你的回答,部分原因是它可能有助于回答另一个用户昨天发布的另一个更难的问题。我试图回答另一个问题,但失败了。如果您对挑战感兴趣,这里是 URL:stackoverflow.com/questions/10957359/…
    • @thb:感谢您指出这个问题。我发布了我认为正确的解决方案,请告诉我您的想法。
    【解决方案4】:

    第一步,任意指定一个点P1为(0,0)。

    步骤2,沿x轴正方向任意指定一个点P2。 (0, Dp1p2)

    第3步,找到一个点P3使得

    Dp1p2 ~= Dp1p3+Dp2p3
    Dp1p3 ~= Dp1p2+Dp2p3
    Dp2p3 ~= Dp1p3+Dp1p2
    

    并将该点设置在“正”y 域中(如果满足任何这些条件,则该点应放置在 P1P2 轴上)。
    使用余弦定律确定距离:

    cos (A) = (Dp1p2^2 + Dp1p3^2 - Dp2p3^2)/(2*Dp1p2* Dp1p3)
    P3 = (Dp1p3 * cos (A), Dp1p3 * sin(A))
    

    您现在已经成功构建了一个正交空间并在该空间中放置了三个点。

    第 4 步:要确定所有其他点,请重复第 3 步,为您提供一个暂定的 y 坐标。 (Xn, Yn)。
    比较矩阵中的距离 {(Xn, Yn), (X3, Y3)} 到 Dp3pn。如果相同,则您已成功识别点 n 的坐标。否则,点 n 在 (Xn, -Yn) 处。

    请注意,第 4 步还有一个替代方法,但对于周六下午来说,数学题太多了

    【讨论】:

    • @BrunoBruck 余弦定律给出了 P1P2 和 P1P3 之间的角度(第一个方程)。下一部分是将 P3 投影到 P1P2 轴上。知道距离 P1P3 并将其设置为三角形的斜边,X 和 Y 值分别是斜边的余弦和正弦乘以。
    • 你对 P2 所做的没问题,但在 P3 的情况下,我无法选择我的集合中的一个点,它不在 P1 和 P2 的同一行,并肯定地说它在 y 轴上。
    • 好的,我想我明白了。首先我们假设 P3 在 y 轴上得到一个直角三角形,在这种情况下我们可以创建坐标方程。但是我们知道 P3 和 P2 之间的真实距离,所以我们能够得到 P1P2 和 P1P3 之间的真实角度,并在坐标方程中使用它,我们可以得到 Xp3 和 Yp3 的真实值。我没听错吗?
    • @BrunoBruck 很抱歉造成混淆,P3 不应该在 y 轴上,而是在 y 为正的半平面上。换句话说,构建第二个维度,使第三个点具有正 y 值。我修改了文本以达到这种效果。
    • 哦,现在说得通了,解决了我的问题。谢谢你的回答!
    猜你喜欢
    • 2017-02-20
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多