最小化 n 维点集的欧氏距离
minimize euclidean distance from sets of points in n-dimensions
让我们看看n-d中的m个点space-(3-d中4个点的解决方案space在这里:)
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.
可以使用什么算法?想法或伪代码就足够了。
(优化性能是这里的一个大问题。Monte Carlo所有顶点和变化系数的方法也会给出一个解决方案。)
更简单地说,你有一组点 {a}i,你正在考虑所有点其加权平均值。这组点正好是那些点的convex hull;它是一个恰好是凸面的多面体(多边形、多面体等),其中角是 {a}i 的子集点.
你只是在问多面体(~面体)上的哪个点最接近一个点。(你的查询点p)
最近的点必须在多面体的外部。一种算法是暴力搜索所有 N-1 维表面。以通常的方式执行此操作,您将在线或曲面或 N 维曲面上找到与查询点最近的点。
(如果点不是全部线性独立,你会有多种方式(多个权重向量)可以给你相同的加权平均点q。你可以担心关于在几何上找到它后从基向量重建答案 q。)
我们可以通过从所有其他点中减去 p 来假设 p = 0。那么问题是最小化一组有限点的凸包的范数,即多面体。
关于这个问题有几篇论文。 Kazuyuki Sekitani 和 Yoshitsugu Yamamoto 的 "A recursive algorithm for finding the minimum norm point in a polytope and a pair of closest points in two polytopes" 看起来不错,对问题的先前解决方案进行了简短的调查。它在付费专区后面,但如果您可以访问大学图书馆,您也许可以下载一份副本。
他们给出的算法相当简单,一旦你通过了符号。 P 是有限的点集。 C(P) 是它的凸包。 Nr(C(P))是最小范数的唯一点,就是你要找的。
第 0 步:从有限点集 P 的凸包 C(P) 中选择一个点 x_0。他们建议选择 x_0 作为 P 中具有最小范数的点。令 k=1.
现在循环:
第 1 步:令 a_k = min {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 是 P 的子集,它使第 1 步中的表达式最小化。在这个集合 P_k 上递归调用算法,令结果为 y_k = Nr(C(P_k)).
第 3 步:b_k = min{y^t_k p | p in P\P_k},y_k 与补集 P\P_k 中的点的点积的最小值。如果 |y_k|^2 <= b_k 那么 y_k 就是答案,停止。
第 4 步:s_k = 最大值{s| [(1-s)x_{k-1} + sy_k]^t y_k <= [(1-s)x_{k-1} + sy_k]^ P\P_k} 中每个 p 的 t p。设x_k = (1-s_k) x_{k-1} + s_k y_k, 设k=k+1, 回到步骤1.
在第 4 步中 s_k 有一个明确的公式:
s_k = min{ [x^t_{k-1} (p-y_k)]/[(y_k-x_{k-1})^t (y_k-p)] | p 在 P\P_k 和 (y_k - x_{k-1})^t (y_k-p) > 0 }
论文中有证明 s_k 具有必要的性质,算法在有限次数的操作后终止,并且结果确实是最优的。
请注意,您应该在比较中添加一些公差,否则舍入错误可能会导致算法失败。关于数值稳定性的讨论很多,详见论文
他们没有给出算法计算复杂度的完整分析,但他们确实证明了在二维情况下最多为O(m^2)(m是P中的点数) ,他们做了数值实验,给人的印象是它在时间上是次线性的,作为 m 的函数,维度固定。我对这种说法持怀疑态度。在没有详细分析的情况下,我建议你用典型的数据做一些实验,看看这个算法对你的表现如何。
让我们看看n-d中的m个点space-(3-d中4个点的解决方案space在这里:
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.
可以使用什么算法?想法或伪代码就足够了。 (优化性能是这里的一个大问题。Monte Carlo所有顶点和变化系数的方法也会给出一个解决方案。)
更简单地说,你有一组点 {a}i,你正在考虑所有点其加权平均值。这组点正好是那些点的convex hull;它是一个恰好是凸面的多面体(多边形、多面体等),其中角是 {a}i 的子集点.
你只是在问多面体(~面体)上的哪个点最接近一个点。(你的查询点p)
最近的点必须在多面体的外部。一种算法是暴力搜索所有 N-1 维表面。以通常的方式执行此操作,您将在线或曲面或 N 维曲面上找到与查询点最近的点。
(如果点不是全部线性独立,你会有多种方式(多个权重向量)可以给你相同的加权平均点q。你可以担心关于在几何上找到它后从基向量重建答案 q。)
我们可以通过从所有其他点中减去 p 来假设 p = 0。那么问题是最小化一组有限点的凸包的范数,即多面体。
关于这个问题有几篇论文。 Kazuyuki Sekitani 和 Yoshitsugu Yamamoto 的 "A recursive algorithm for finding the minimum norm point in a polytope and a pair of closest points in two polytopes" 看起来不错,对问题的先前解决方案进行了简短的调查。它在付费专区后面,但如果您可以访问大学图书馆,您也许可以下载一份副本。
他们给出的算法相当简单,一旦你通过了符号。 P 是有限的点集。 C(P) 是它的凸包。 Nr(C(P))是最小范数的唯一点,就是你要找的。
第 0 步:从有限点集 P 的凸包 C(P) 中选择一个点 x_0。他们建议选择 x_0 作为 P 中具有最小范数的点。令 k=1.
现在循环:
第 1 步:令 a_k = min {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 是 P 的子集,它使第 1 步中的表达式最小化。在这个集合 P_k 上递归调用算法,令结果为 y_k = Nr(C(P_k)).
第 3 步:b_k = min{y^t_k p | p in P\P_k},y_k 与补集 P\P_k 中的点的点积的最小值。如果 |y_k|^2 <= b_k 那么 y_k 就是答案,停止。
第 4 步:s_k = 最大值{s| [(1-s)x_{k-1} + sy_k]^t y_k <= [(1-s)x_{k-1} + sy_k]^ P\P_k} 中每个 p 的 t p。设x_k = (1-s_k) x_{k-1} + s_k y_k, 设k=k+1, 回到步骤1.
在第 4 步中 s_k 有一个明确的公式:
s_k = min{ [x^t_{k-1} (p-y_k)]/[(y_k-x_{k-1})^t (y_k-p)] | p 在 P\P_k 和 (y_k - x_{k-1})^t (y_k-p) > 0 }
论文中有证明 s_k 具有必要的性质,算法在有限次数的操作后终止,并且结果确实是最优的。
请注意,您应该在比较中添加一些公差,否则舍入错误可能会导致算法失败。关于数值稳定性的讨论很多,详见论文
他们没有给出算法计算复杂度的完整分析,但他们确实证明了在二维情况下最多为O(m^2)(m是P中的点数) ,他们做了数值实验,给人的印象是它在时间上是次线性的,作为 m 的函数,维度固定。我对这种说法持怀疑态度。在没有详细分析的情况下,我建议你用典型的数据做一些实验,看看这个算法对你的表现如何。