最小化n维点集的欧几里得距离

时间:2018-09-02 06:37:42

标签: python geometry projection algebra

让我们看一下n维空间中的m个点-(这里对3维空间中4个点的解决方案是:minimize distance from sets of points

a= (x1, y1, z1, ..)

b= (x2, y2 ,z2, ..)

c= (x3, y3, z3, ..)
.
.

p= (x , y , z, ..)

Find point q = c1* a + c2* b + c3* c + ..

where c1 + c2 + c3 + .. = 1
and  c1, c2, c3, .. >= 0
s.t.
euclidean distance pq is minimized.

可以使用哪些算法?想法或伪代码就足够了。 (在这里,优化性能是一个大问题。具有所有顶点和变化系数的蒙特卡洛方法也将提供解决方案。)

2 个答案:

答案 0 :(得分:1)

我们可以通过从所有其他点减去p来假设p = 0。然后的问题之一就是最小化一组有限点(即多面体)的凸包上的范数。

关于此问题有几篇论文。 Sekitani Kazuyuki Sekitani和Yamamoto Yoshitsugu Yamamoto提出的“一种递归算法用于找到一个多面体中的最小范数点和一对最接近点对中的递归算法”看起来是一个很好的方法,并且对该问题的现有解决方案进行了简短的调查。它位于付费专区后面,但是如果您可以访问大学图书馆,则可以下载副本。

一旦您超过了表示法,他们给出的算法就非常简单。 P是点的有限集。 C(P)是其凸包。 Nr(C(P))是最小范数的唯一点,这就是您想要找到的。

第0步:从有限点P的凸包C(P)中选择一个点x_0。他们建议选择x_0作为P中具有最小范数的点。令k = 1。

现在循环:

步骤1:设a_k =最小值{x ^ t_ {k-1} p | p在P}中。这里x ^ t_ {k-1}是x_ {k-1}的转置(因此最小化的函数只是点积,因为p超出了有限集P)。如果| x_ {k-1} | ^ 2 <= a_k,则答案为x_ {k-1},请停止。

步骤2:P_k = {p |在P中的p和x ^ t_ {k-1} = a_k}。 P_k是在步骤1中使表达式最小化的P的子集。对该集合P_k递归调用算法,并将结果设为y_k = Nr(C(P_k))。

步骤3:b_k =分钟{y ^ t_k p | p在P \ P_k}中,是y_k与补集P \ P_k中的点的乘积的最小值。如果| y_k | ^ 2 <= b_k,则y_k是答案,请停止。

步骤4:s_k = max {s | [(1-s)x_ {k-1} + sy_k] ^ t y_k <= [(1-s)x_ {k-1} + sy_k] ^ t p对于P \ P_k}中的每个p。令x_k =(1-s_k)x_ {k-1} + s_k y_k,令k = k + 1,然后返回步骤1。

第4步中有一个s_k的明确公式:

s_k =分钟{[x ^ t_ {k-1}(p-y_k)] / [(y_k-x_ {k-1})^ t(y_k-p)] | p \ P_k中的p和(y_k-x_ {k-1})^ t(y_k-p)> 0}

有论文证明s_k具有必要的属性,该算法在有限次操作后终止,并且结果确实是最优的。

请注意,您应该在比较中增加一些公差,否则舍入错误可能会导致算法失败。关于数值稳定性的讨论很多,有关详细信息,请参见本文。

他们没有对算法的计算复杂性进行完整的分析,但确实证明了在二维情况下(m是P中的点数)它最多为O(m ^ 2),并且他们进行了数值实验,给人的印象是时间在时间​​上是线性的,是m的函数,并且尺寸固定。我对此说法表示怀疑。在没有详细分析的情况下,建议您尝试使用典型数据进行一些实验,以了解该算法对您的效果如何。

答案 1 :(得分:0)

以一种更简单的方式陈述,您拥有一组 {a} i 点,并且您正在考虑所有点,这些点都是其加权平均值。这组点正是这些点的convex hull;这是一个刚好是凸的多面体(多边形,多面体等),其中的角是 {a} i 点的子集。

您只是在问多面体(〜hedron)上的哪个点最接近点。(您的查询点 p

最近的点必须在多面体的外部。一种算法是蛮力搜索所有N-1维表面。以通常的方式执行此操作,您将在直线或曲面或N维曲面上找到最接近查询点的点。

(如果这些点不是全部都是线性独立的,您将有多种方式(多个权重向量)可以为您提供相同的加权平均点 q 。您可能会担心重建答案<在几何上找到基矢量后,从基矢量中选择strong> q 。)