在“环绕地图”上的一组点之间的“质心”,可以最大限度地减少到所有点的平均距离

时间:2010-09-14 09:29:31

标签: algorithm language-agnostic math geometry topology

编辑 正如有人指出的那样,我正在寻找的实际上是最大限度地减少所有其他点之间的总测地距离


我的地图在地形上类似于吃豆人和小行星的地图。经过顶部会让你扭曲到底部,经过左边会让你向右弯曲。

假设我在地图上有两个点(质量相同),我想找到它们的质心。我可以使用经典定义,基本上是中点

然而,让我们说这两点是在质量的两端。可以说,还有另一个质心,它是通过“环绕”包裹而形成的。基本上,它是与其他两个点等距的点,但通过“缠绕”边缘来链接。

实施例

b . O . . a . . O .

两点O。他们的“经典”中点/质心是标记为a的点。但是,另一个中点也在bb与两个点等距离,通过环绕)。

在我的情况下,我想选择两点之间平均距离较低的那个。在这种情况下,a具有三个步骤的两个点之间的平均距离。 b的平均距离为两步。所以我会选择b

解决两点情况的一种方法是简单地测试经典中点和最短的环绕中点,并使用平均距离较短的那个。

然而!这不容易推广到3分,4分或5分或 n 分。

我可以用它来找到这个公式或算法吗?

(假设所有点总是等质量。我只使用“质心”,因为它是我所知道的唯一一个松散描述我想要做的事情)

如果我的解释不清楚,我会尝试更好地解释。

4 个答案:

答案 0 :(得分:4)

质心的概念是与仿射空间相关的概念。 n维圆环没有仿射结构。

你想要的是一个最小化(测地线)到所有其他点的距离的点。

我建议如下:让x_1 ... x_n是d维环面上的点集合(或为此目的的任何其他度量空间)。

你的问题:

找到一个点mu,使得sum(dist(mu,x_k)^ 2)最小。

在仿射欧几里德的情况下,你会得到通常的质心概念。

这是一个你能够用共轭梯度算法来解决的问题(例如,可能有更好的选择),在这种情况下表现良好。请注意,你需要适度的n(比如n <10 ^ 3),因为算法需要空间中的n ^ 2和时间n ^ 3。

也许更合适的是Levenberg-Marquardt算法,该算法专为最小化平方和而定制。

请注意,如果你有一个很好的初始猜测(例如,在R ^ d而不是圆环中看到的点的通常质心),该方法会更快收敛。

编辑: 如果(x1 ... xd)和(y1 ... yd)是环面上的点,则距离由下式给出 dist(x,y)^ 2 = alpha1 ^ 2 + ... + alphad ^ 2

其中alphai = min((xi - yi)mod 1,(yi - xi)mod 1)

答案 1 :(得分:3)

我做了一个小程序来检查所涉及函数的优点,发现你应该非常小心最小化过程。

下面你可以看到两组图,显示了点分布,欧几里德案例中最小化的函数,以及与“复曲面公制”相对应的函数。

alt text

正如您所看到的,欧几里德距离表现得非常好,而复曲面呈现出几个局部最小值,难以找到全局最小值。此外,复曲面情况下的全局最小值并不是唯一的。

以防万一,Mathematica中的程序是:

Clear["Global`*"];

(*Define  non wrapping distance for dimension n*)
nwd[p1_, p2_, n_] := (p1[[n]] - p2[[n]])^2;

(*Define wrapping distance for dimension n *)
wd[p1_, p2_, max_,n_] := (max[[n]] - Max[p1[[n]], p2[[n]]] + Min[p1[[n]], p2[[n]]])^2;

(*Define minimal distance*)
dist[p1_, p2_, max_] :=
  Min[nwd[p1, p2, 1], wd[p1, p2, max, 1]] +
  Min[nwd[p1, p2, 2], wd[p1, p2, max, 2]];

(*Define Euclidean distance*)
euclDist[p1_, p2_, max_] := nwd[p1, p2, 1] + nwd[p1, p2, 2];

(*Set torus dimensions *)
MaxX = 20; 
MaxY = 15;

(*Examples of Points sets *)
lCircle = 
  Table[{10 Cos[fi] + 10, 5 Sin[fi] + 10}, {fi, 0, 2 Pi - .0001, Pi/20}];

lRect = Join[
   Table[{3, y}, {y, MaxY - 1}],
   Table[{MaxX - 1, y}, {y, MaxY - 1}],
   Table[{x, MaxY/2}, {x, MaxY - 1}],
   Table[{x, MaxY - 1}, {x, MaxX - 1}],
   Table[{x, 1}, {x, MaxX - 1}]];

(*Find Euclidean Center of mass *)
feucl = FindMinimum[{Total[
    euclDist[#, {a, b}, {MaxX, MaxY}] & /@ lRect], 0 <= a <= MaxX, 
             0 <= b <= MaxY}, {{a, 10}, {b, 10}}]

(*Find Toric Center of mass *)
ftoric = FindMinimum[{Total[dist[#, {a, b}, {MaxX, MaxY}] & /@ lRect],
         0 <= a <= MaxX, 0 <= b <= MaxY}, {{a, 10}, {b, 10}}]

答案 2 :(得分:2)

在一维情况下,您的问题与找到平均角度有关。 角度a和b的平均值可以通过

计算

mean =余数(a +余数(b-a,C)/2.0,C) 其中C是整圆的度量(如果你使用弧度,则为2 * PI)。

如果你有n个角度a [],则可以通过

计算平均值

mean = a [0]; for i = 1..n mean = remainder(mean + remainder(a [i] -mean,C)/(i + 1),C)

所以我估计

meanX = X [0]; meanY = Y [0]

表示i = 1..n

 meanX = remainder( meanX + remainder( X[i]-meanX, W)/(i+1), W)
 meanY = remainder( meanY + remainder( Y[i]-meanY, H)/(i+1), H)

可能会完成这项工作。

但请注意,这将导致-W / 2&lt; = meanX

答案 3 :(得分:0)

IANATopologist,我不知道我在这方面有多清楚,但是对于它的价值,这些是关于此事的一些想法:

使用质量和重力来计算这种事情可能确实很优雅 - ISTR有很多库和有效算法可以找到任意数量质量的重力矢量。

如果您使用的是球形地图,我建议在球体内找到N个质点的实际重心。然后,您从中心向外绘制一条直线,通过这个内部重心,找到球体表面上您的质点希望聚集的点。

然而,环形地图使这很困难。

然后,我的建议是展平并复制你的地图,为你提供一个3 x 3的地图(使用无限的地图会产生更好的结果,但可能会有点过分)。我将坐标(0,0)分配给它们(2,2),其中(1,1)是你的源地图。找到内部地图(1,1)的质点被吸引的点 - 如果它们都朝向地图的中间,那么很好:你找到了你的重心。如果不是,如果靠近边缘的一个点朝向内部地图之外的某个质量累积,例如进入地图(2,1),则在计算重心时丢弃该质点。相反,你使用相反地图的质点(在这种情况下为(0,1)),它想要漫游到你的中间地图。

为这些质点添加加速度矢量可以获得环面上的重心。 完成。