最小化距离:距离公式

时间:2009-12-07 12:06:09

标签: algorithm math geometry

我正在用C编写程序。我想通过最小化表达式来找到解决方案

D1+D2+......+Dn

其中Di是通过2点之间的距离公式计算的距离。上面的表达式是x& y变量

现在我将区分这个表达式并找到解决方案。我怀疑是:

因为在上面的表达中,所有Di都将作为平方根出现,这将很难解决。所以我们可以解决这个问题:

D1^2 + D2^2 + ......+ Dn^2

上述表达式产生的答案是否与解决原始表达式所产生的答案相同?

我检查了简单的测试用例,例如n = 2。它产生了正确的答案。一般来说这是真的吗?

如果没有,这个问题怎么解决?

5 个答案:

答案 0 :(得分:7)

即使是2d距离,a^2 + b^2的最小值与a + b的最小值位于同一位置通常也不正确。当然,对于一些非常具体的有限的问题可能是正确的。如果您正在尝试找到一个反例,请注意这些正方形会使长距离过度;如果你构造一个最小包含至少一个长距离的例子,你很可能会得到一个不同的最小值。

您要解决的问题是什么?当然,对你的问题而言,区别无关紧要;或者,平方和的最小值是一个更便宜的问题,并且更容易第一次逼近最终解决方案。

这可能是显而易见的,但如果各种距离无关,那么对于每个单独的距离,当距离为时,正方形是最小的,因此无关距离的总和是最小的,其中总和是广场是。

修改帖子更新:您正试图找到一个质心,其中包含它位于特定行上的限制。总的来说,大概是:你只有一个自由度,你可以做出明显的区分。但是,结果将在分母中包含一系列分数和sqrt;在一般情况下解决代数是不可能的(AFAIK)。我不是100%肯定,但我认为你很幸运,你的距离总和没有局部最小值,除了全球最小值;在这种情况下,牛顿的方法将可靠而快速地收敛。

因此,如果您可以验证只有一个本地最小值的假设,那么您就可以免费使用,即使可以,也可以相当可靠地获得相当不错的结果并在时检测简单地通过比较你的牛顿法计算的最小值和一些现实检查点(比如每个点在线上的正交投影)就会出错。

答案 1 :(得分:2)

你还没有足够的测试。最小化D1 + D2与一般情况下最小化D1^2 + D2^2不同,尽管可能针对某些特定D1D2

编辑后,你提醒我你只对飞机上的距离感兴趣:

如果D1D2是几何平面中的距离,则平面中最小化D1^2 + D2^2的点也会最小化D1 + D2,但 它打破了三点。

尝试使用三个点(0,0),(1,0)和(10,0): 最小化|x|+|x-1|+|x-10|与最小化x^2+(x-1)^2+(x-10)^2

不同

答案 2 :(得分:2)

你对D1,D2,......的起源有点不清楚但是我假设你在xy平面上有一组点P1,P2,...,Pn,你想要找到这个点p0 =(x0,y0)最小化每个点P1 ... Pn和p0之间的距离之和。

所以你的D1 .. Dn实际上是:

D1 = sqrt((x0-x1)^2 + (y0-y1)^2)
D2 = sqrt((x0-x2)^2 + (y0-y2)^2)
..
Dn = sqrt((x0-xn)^2 + (y0-yn)^2)

其中x1 .. xny1 ... yn已知且x0, y0未知。并且您希望最小化D0

D0 = D1+D2+......+Dn

如果这是正确的,那么你想找到Geometric median。维基百科文章应该可以帮助您制定解决方案。

<强>更新 您在评论中指出点P0应该位于给定的行上(请将其添加到您原来的问题陈述中)。这意味着您可以将y0重写为x0

的函数
y0 = a*x0 + b

给出a和b。 这降低了距离函数的复杂性,并使得推导成为一种可能性。

D1 = sqrt((x0-x1)^2 + (ax0+b-y1)^2)
D2 = sqrt((x0-x2)^2 + (ax0+b-y2)^2)
..
Dn = sqrt((x0-xn)^2 + (ax0+b-yn)^2)

但是如果点n的数量不是太大,我只会在x线接近x1 .. xn的平均线的区域进行强力搜索*来找到点x-,y0使D0最小化。

答案 3 :(得分:0)

反例:

d1 = 1&amp; d2 = 10(sum = 11&amp; sumOfSquares = 101)

d1 = 6&amp; d2 = 6(总和= 12&amp; sumOfSquares = 72)

总和增加但平方和减少。

答案 4 :(得分:0)

你的问题是你的距离的一些规范给出的目标函数的最小化。距离是欧几里德,因此代表两个向量之间的欧几里德范数。为了理解最小化和(ai)与总和(ai ^ 2)之间的区别,我建议你阅读Wikipedia entry on Norms;底线,请注意以下几点:

||x||2       <= ||x||1 <= sqrt(n)||x||2
||x||_\infty <= ||x||2 <= sqrt(n)||x||_\infty
||x||_\infty <= ||x||1 <=       n||x||_\infty

||x||2是欧几里德范数,||x||1sum(abs(x1)+abs(x2)+...+abs(xn))||x||_\inftymax(abs(x1),abs(x2),...,abs(xn))。在你的情况下,所有数字都是正数(你已经有欧几里德范数,所以你可以看到差异。

阅读Golub和Van Loan的精彩书籍 Matrix Computations 也可能会有所帮助(虽然要难以完全掌握)。