上篇文章已经实现了二维直线Ax+By+C=0的拟合算法。如果要拟合三维直线怎么办?首先,方程Ax+By+Cz+D=0是不可以的,因为他是三维空间中的一个平面。如果要表达一条直线,需要两个三维平面的联立,似乎也不是个好办法。这里我们可以采用直线的“点+向量”方程l = A + dD的方式。其中A为直线上一点,D为直线方向向量。在计算几何中,这是一种常用的表达方式。
已知,采样点\{(x_1,y_1),(x_2,y_2),…,(x_n,y_n)\}
采样点X_i(x_i,y_i)到直线l的距离可以用X_i到A的向量 Y_i = X_i -A 与Y_i在直线上的投影(Y_i^TD)D做差求得。因此可以列目标方程为
f = \sum (Yi^2 – (D\cdot Y_i)^2)
解题的技巧在与对上式的重组。先求 A。 \frac {\partial f}{\partial A} = \frac {\partial f}{\partial Y} \cdot \frac {\partial Y}{\partial A} = – \frac {\partial f}{\partial Y} =0
f = \sum (Y_i^2 – (D^TY_i)^2)
\frac {\partial f}{\partial Y} = \sum(2Y_i – 2DD^TY_i ) =2 (I-DD^T) \sum Y_i =0
可以得出 \sum Y_i =\sum (X_i-A)=0,解出 A = \frac {\sum X_i }{n} = \bar X。即直线经过所有点的中心点。
将f改写为f = \sum (Y_i^2 – (Y_i^TD)^2) =\sum (D^TY_i^TY_iD – D^TY_iY_i^TD ) = D^T \sum ((Y_i^TY_i)I – Y_iY_i^T)D
这里要解释一下 因为约束了 D^TD=1,所以Y_i^2 = D^TY_i^TY_iD^T。
令 S =\sum ((Y_i^TY_i)I – Y_iY_i^T) , 简化成
f = D^T SD; ||D||=1
这个函数的形式与前一篇文章一样,f的最小值为S对应最小特征值时的特征向量。这里不再重复说明。
总结一下,本文提出的直线方程具有一般性,不仅适用于二维、三维空间直线,更能适用于k-D直线。因此,可以应用与其他业务领域,如统计、机器学习算法等等。
请问一下,如果是和Y轴平行的线,例如1,1,1和2,1,2,这个拟合出来的结果有点不对啊
你好,你说的是否是y=kx+b作为直线方程的情况?
是的,这种情况就降维了,可以直接作为二维处理,打扰您了
请问这个在excel里面能实现吗?
点到直线的距离的平方=向量Yi的模的平方-Yi在直线上的投影(YTiD)D的模的平方。这个没错,但是,向量Yi的模的平方=向量Yi的平方?
向量的点乘可以用平方表示吗?然后再按幂函数求导?
Pingback: 最小二乘法拟合三维直线 | 算法网
Pingback: 最小二乘法拟合三维直线 - 算法网