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

Posted

技术标签:

【中文标题】环形环绕地图上一组点之间的“质心”,可最大限度地减少到所有点的平均距离【英文标题】:"Center of Mass" between a set of points on a Toroidally-Wrapped Map that minimizes average distance to all points 【发布时间】:2011-04-12 01:54:15 【问题描述】:

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


我的地图在地形上与《吃豆人》和《小行星》中的地图相似。越过顶部会把你扭曲到底部,越过左边就会把你扭曲到右边。

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

但是,假设这两个点位于质量的两端。可以说,还有另一个质心,是通过“环绕”形成的。基本上,它是与其他两个点等距的点,但通过“环绕”边缘连接。

例子

b . O . . a . . O .

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

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

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

但是!这不容易概括为 3 个点、4 个、5 个或 n 个点。

有什么公式或算法可以用来找到这个吗?

(假设所有点的质量始终相同。我只使用“质心”,因为这是我知道的唯一术语,可以粗略地描述我正在尝试做的事情)

如果我的解释不清楚,我会尽力解释得更好。

【问题讨论】:

预期点数是多少?是 3、4、5 个,还是 20 个或 100 个? @brainjam 我想要一个可以推广到所有点数的解决方案,但是对于我的应用程序来说,点数可以从 1 到 10 左右。上限 150。 积分是否以某种方式组织?例如。你能在视觉上发现重心吗?或者这些点可以随机分布在环面上吗? @brainjam 分布并不是完全随机的。点被随机放置在地图上,一次一个。如果任何“相关”点已经在地图上(关系并不总是相互的),它将尝试放置在地图上已经存在的相关点之间的“质心”。 【参考方案1】:

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

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

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

你的问题:

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

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

这是一个您可以使用 共轭梯度算法 解决的问题(例如,可能有更好的选择),该算法在这种情况下表现良好。请注意,您需要适度的 n(例如 n

也许更适合的是 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)

【讨论】:

@Alexandre 你能写下环面上的测地距离公式吗?我不确定如何选择最小测地线... @belisarius 如果你的圆环只是一个“吃豆人空间”,即一个带有包裹边的矩形,那么两点之间的测地线就是它们之间的最小直线。 如果你的距离是非负的,你真的不需要平方距离,对吧? @flies 您需要一个通用公式才能最小化与测地线中心的距离。此外,作为一个周期性边界问题,你有不止一条直线 @files:所有的平方都有两个目标:当点彼此靠近时产生质心,并使问题在数值上易于处理。最小化 二次 函数是小菜一碟。【参考方案2】:

我做了一个小程序来检查所涉及的功能的好坏,发现你应该非常小心最小化过程。

您可以在下面看到两组显示点分布的图、在欧几里得情况下最小化的函数,以及对应于“复曲面度量”的一组。

如您所见,欧几里得距离表现得非常好,而复曲面则存在几个局部最小值,很难找到全局最小值。此外,复曲面情况下的全局最小值不是唯一的。

以防万一,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]

【讨论】:

伟大的工作。不过,我想看看 OP 的典型案例:如果点的定位很好(在复曲面意义上),那么最小化过程应该没问题。如果不是,问题就很难了,确实…… @Alexandre 想象一个甜甜圈放在桌子上,顶部和底部的点,对齐并间隔 2*PI/n ... 质心在哪里? :D。我认为遵循“复曲面对称”的任何点分布都会有同样的问题 是的,但是允许多个质心的配置集很小(它是封闭的无处稠密集的可数并集,这就是“一般”的含义)。特别是,一旦你扰乱了一个这样的配置,你几乎肯定会有一个独特的质心。另一句话(遵循对称论点):R^2 中直线的质心在哪里? @Alexandre 42? :D。很棒的评论!【参考方案3】:

在一维情况下,您的问题类似于寻找平均角度。 角度 a 和 b 的平均值可以通过计算

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

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

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

我认为

meanX = X[0];平均Y = 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

【讨论】:

啊!手指麻烦。 n 角的情况应该继续 再来一次! for(i=1; i 你应该编辑你的答案,而不是试图通过 cmets 来纠正错误。 所以你是说我应该把它分别应用到我的两个不同的轴上,然后我的答案就是结果? 在对Mean of Angles 进行研究之后,似乎角度的平均值几乎正是我正在寻找的。我会用我使用的算法/公式做一些实验,但这让我有了一个良好的开端。谢谢=)【参考方案4】:

IANATopologist,我不知道我在这方面的表述有多清楚,但就其价值而言,以下是对此事的一些想法:

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

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

但是,环形地图使这变得困难。

那么,我的建议是展平并复制您的地图,从而为您提供 3 x 3 被子的地图(使用无限的地图区域会产生更好的结果,但可能会过大)。我将为它们分配坐标 (0, 0) 到 (2, 2),其中 (1, 1) 是您的源地图。找到你的内部地图 (1, 1) 的质量点被吸引到的点——如果它们都向你的地图中间移动,很好:你找到了你的重心。如果不是,如果靠近边缘的一个点正朝着你的内部地图之外的一些质量积累,比如进入地图 (2, 1),那么在计算你的重心时丢弃这个质量点。相反,您使用对面地图(在本例中为 (0, 1))中想要游荡到中间地图的质点。

为这些质点添加加速度矢量可以为您提供圆环上的重心。 完成。

【讨论】:

以上是关于环形环绕地图上一组点之间的“质心”,可最大限度地减少到所有点的平均距离的主要内容,如果未能解决你的问题,请参考以下文章

计算两个叠加的高斯函数的质心

K-means 聚类:根据聚类中数据点的最大大小确定最佳质心数

最大限度地减少 Salesforce Streaming API 和 Heroku Connect 之间的延迟

确定多个点的质心

Bigquery 分片与 Bigquery 分区

什么是ORM,以及在php上的使用