二维直线常用斜截式方程 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
涵盖了所有情况。具体解法我会在下一篇博文给出。敬请关注。
您好,克拉默法则那边,b的求解,您是否分子那边多写了个n?