找到最接近一组3D线的点

时间:2019-03-10 00:40:22

标签: java algorithm computational-geometry least-squares

这个问题让我困扰了好几天。

我有一组由某些数据形成的线,这些线产生以下形式的3D线:

P = a + d t

其中a是位置矢量,d是单位方向矢量。

所以基本上,我想使用最小二乘拟合来找到所有这些线的最近点。 我一直无法在线找到算法或如何在Java中实现它。我正在使用使用Vector3D或RealVectors的apache commons数学库来计算线方程。因此,对于解决此问题的算法或示例代码的任何帮助都将有所帮助。

3 个答案:

答案 0 :(得分:1)

假设您要最小化到线的平方距离之和,并假设WLOG矢量 d 为单位,则总平方距离为

Σ(( ap )²-( ap d )²)

总和接管所有( a d )行。

此表达式的梯度为

Σ(2 ap -2( ap d d

并通过取消它在 p 中获得线性系统。

答案 1 :(得分:1)

@YvesDaoust答案的扩展版本:

给出参数线:

L(t) = A + t D

其中D是单位矢量,即D•D = 1

点P与线L的距离为:

t = D • (P - A)

在最小二乘意义上,最接近点P的线是使误差总和E最小:

E = (P - L(t))^2

E = (P - (A + tD))^2

E = (P - A - tD)^2

E = (P - A - (D • (P - A))D)^2

E = (P - A - (D•P - D•A)D)^2

E = (P - A - (D•P)D + (D•A)D)^2

E = (P - (D•P)D - A + (D•A)D)^2

E = (P - (D D^T)P - A + (D•A)D)^2

E = ((I - (D D^T)) P - A + (D•A)D)^2

E = (C x - b)^2

哪里

C = I - (D D^T)
x = P
b = A - (D•A)D

其中“ I”是3x3单位矩阵。最小二乘解是:

C^T C x = C^T b

导出同一系统的另一种方法是采用方程的导数:

E = (P - A - tD)^2

E = P•P - 2 P•A - 2t P•D + A•A + 2t A•D + t^2

采用关于P的导数并简化我们得到的(记住,取“ t”的导数时要应用链式规则,因为它是P的函数):

dE/dP = 2(P - A  - ((P - A) • D) D)

将此等于0:

dE/dP = 0

2(P - A  - ((P - A)•D) D) = 0

P - ((P - A)•D) D = A

P - (P•D) D + (A•D) D = A

P - (P•D) D = A - (A•D) D

P - (D D^T) P = A - (A•D) D

(I - D D^T) P = A - (A•D) D

其中“ I”是3x3单位矩阵。也就是形式为C x = b的线性系统。

请记住,您仍然需要将求和应用于等式的两边,所以实际上是:

Sum(C^T C) x = Sum(C^T b)

所以最后:

x = Sum(C^T C)^-1 Sum(C^T b)

答案 2 :(得分:0)

我最终使用主成分分析为我的场景找到了一个解决此问题的好方法,并撰写了有关它们的文章,因此我想在此处添加链接以说明如何做到这一点:

http://jamesdpeters.com/principal-component-analysis-fitting-a-straight-line-in-3d/