这个问题让我困扰了好几天。
我有一组由某些数据形成的线,这些线产生以下形式的3D线:
P = a + d t
其中a是位置矢量,d是单位方向矢量。
所以基本上,我想使用最小二乘拟合来找到所有这些线的最近点。 我一直无法在线找到算法或如何在Java中实现它。我正在使用使用Vector3D或RealVectors的apache commons数学库来计算线方程。因此,对于解决此问题的算法或示例代码的任何帮助都将有所帮助。
答案 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/