最小二乘法直线拟合:y= kx+b 及其缺点分析

二维直线常用斜截式方程 y=kx+b表达。
已知离散点  \{(x_1,y_1),(x_2,y_2),…,(x_n,y_n)\} 

 欲求一条直线y=kx+b,使得 {f=\sum_{i=1}^n (kx_i+b-y_i)^2}
取得最小值。
k, b为未知数 ,根据最小二乘解法,令 f k, b 偏导数分别为0,求解出来的 k,b即所求直线参数 \frac {\partial f}{\partial k} = \sum_{i=1}^n 2x_i(kx_i+b-y_i)=0 

\frac {\partial f}{\partial b} = \sum_{i=1}^n 2(kx_i+b-y_i)=0

化简后得到

\sum x^2k + \sum xb=\sum xy 


\sum xk + nb = \sum y

或者写成矩阵形式更好
{\left[\begin{array}{cc} \sum x^2 & \sum x\\ \sum x &n \end{array} \right ]}{\left[\begin{array}{cc}k\\b\end{array}\right ]} = {\left[\begin{array}{cc} \sum xy\\ \sum y\end{array}\right ]}


此时可用采用克拉默法则求解。
  k=\frac {n\sum xy – \sum x\sum y}{n\sum x^2 – (\sum x)^2}

  b=\frac {n\sum x^2 \sum y – \sum x\sum xy}{n\sum x^2 – (\sum x)^2}

我推荐参考Eigen 对线性方程的求解。
在实践中,有同学采用上述思路完成了编码,测试时却发现“某些”情况下,算法似乎取的结果存在问题。问题存在与那一块呢?
其实就在与 y=kx+b方程式上。如果待求的直线为一条垂直与x轴的直线, y=kx+b是无法表示的,因而在数值上存在问题,表现就是k的值求不准。结合上面的求解方程,就是等号左边的2\times2 矩阵奇异或者接近奇异。
很显然,在特定的应用场景下,比如几何算法中,斜截式方程存在缺陷,不能表达所有情况。有没有更好的解决方案?
那就是  Ax+By+C=0
涵盖了所有情况。具体解法我会在下一篇博文给出。敬请关注。

 

One thought on “最小二乘法直线拟合:y= kx+b 及其缺点分析

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注