导航

最小二乘直线拟合

Posted on 2022-04-14 14:23  蝈蝈俊  阅读(5696)  评论(0编辑  收藏  举报

最小二乘法(英文:least square method)是一种常用的数学优化方法,所谓二乘就是平方的意思。这平方一词指的是在拟合一个函数的时候,通过最小化误差的平方来确定最佳的匹配函数,所以最小二乘、最小平方指的就是拟合的误差平方达到最小。

推导过程

问题

以直线拟合为例,已知有一组平面上的点集:\((x_1,y_1), (x_2,y_2), ... (x_n,y_n)\)
基于这些点拟合一条直线,设直线方程为: \(y=ax+b\)
那么算法的输入就是这些点集,需要求取的为直线方程的参数\(a,b\)

这些点距离直线的平方偏差之和为

\[S_\epsilon^2=\sum_{i=1}^{n}(y_i-y)^2 = \sum_{i=1}^{n}(y_i - (ax_i+b))^2 \]

以上公式已知的是\(x_i,y_i\), 未知且要求取的是\(a、b\)

不同的\(a、b\)会得到不同的\(S_\epsilon^2\),求取的是在\(S_\epsilon^2\)最小的时候求取\(a、b\)

多元函数的极值与最值问题

这是一个二元\(a,b\)函数,此问题实际上就是多元函数的极值与最值问题,要求解函数极值时二元变量数值,这里要用到二元函数取极值的必要条件,即下面这个定理。

那么对 \(S_\epsilon^2\) 求偏导且使得偏导为0,此时 \(S_\epsilon^2\) 取得极值点最小值:

下面公式已知的是\(x_i,y_i\), 未知且要求取的是\(a、b\)

\[ \begin{aligned} \frac{\partial }{\partial a} S_\epsilon^2 = \frac{\partial }{\partial a} \sum_{i=1}^{n}(y_i - (ax_i+b))^2 = 0 \newline \frac{\partial }{\partial b} S_\epsilon^2 = \frac{\partial }{\partial b} \sum_{i=1}^{n}(y_i - (ax_i+b))^2 = 0 \end{aligned} \]

求偏导过程

这里主要用到下面几个求导规则

加减规则

函数 \(f(x) \pm g(x)\) 的导数 \(f'(x) \pm g'(x)\) 所以 \(\sum\) 可以直接拆解。

\[\frac{\partial }{\partial b} \sum_{i=1}^{n}(y_i - (ax_i+b))^2 = \frac{\partial }{\partial b}[(y_0 - (ax_0+b))^2 ] + \frac{\partial }{\partial b}[(y_1 - (ax_1+b))^2 ] + ... + \frac{\partial }{\partial b} [(y_n - (ax_n+b))^2] \]

后面我们只需要看相加的每一项

乘法规则

函数 \(f(x)*g(x)\) 的导数等于 \(f'(x)*g(x)+f(x)*g'(x)\)

所以

\[\frac{\partial }{\partial b} [(y_i - (ax_i+b))^2] = \frac{\partial [y_i - (ax_i+b)]}{\partial b} *(y_i - (ax_i+b)) + (y_i - (ax_i+b)) * \frac{\partial (y_i - (ax_i+b))}{\partial b} = 2 (y_i - (ax_i+b)) * \frac{\partial {(y_i - (ax_i+b))}}{\partial b} \]

常量导数是0,一元函数导数是斜率

下面公式 \(x_i,y_i\) 是常数;
由于是求\(b\)的偏导数,\(a\)也认为是常数;

\[\frac{\partial {(y_i - (ax_i+b))}}{\partial b} = \frac{\partial y_i}{\partial b} - \frac{\partial ax_i}{\partial b} - \frac{\partial b}{\partial b} = 0 - 0 - 1 = -1 \]

如果是求 \(a\)的偏导数,\(b\)认为是常数;

\[\frac{\partial {(y_i - (ax_i+b))}}{\partial a} = \frac{\partial y_i}{\partial a} - \frac{\partial ax_i}{\partial a} - \frac{\partial b}{\partial a} = 0 - x_i - 0 = -x_i \]

基于上面的推理,我们可以得出

\[\begin{aligned} \frac{\partial }{\partial a} S_\epsilon^2 = \sum_{i=1}^{n}(y_i - (ax_i+b))*(-x_i) = 0 \newline \frac{\partial }{\partial b} S_\epsilon^2 = \sum_{i=1}^{n}(y_i - (ax_i+b))*(-1) = 0 \end{aligned} \]

\(a,b\) 的值

继续往下推,我们可以得到

\[\begin{aligned} (\sum_{i=1}^{n}x_i^2)* a + (\sum_{i=1}^{n}x_i)*b = \sum_{i=1}^{n}x_i*y_i \newline (\sum_{i=1}^{n}x_i)* a + n*b = \sum_{i=1}^{n}y_i \end{aligned} \]

参考: 最小二乘直线拟合

从上面,我们可以推理出 \(a,b\)的值

\[\begin{aligned} a = \frac {n*(\sum x_iy_i) - (\sum x_i)*(\sum y_i) } {n * (\sum x_i^2) - (\sum x_i)^2} \newline b = \frac {(\sum x_i^2)*(\sum y_i) - (\sum x_i)*(\sum x_i y_i) } {n * (\sum x_i^2) - (\sum x_i)^2} \end{aligned} \]

参考:最小二乘法拟合直线

这样实际计算时,我们只需要计算出

\[\begin{aligned} t1 = \sum x_i \newline t2 = \sum y_i \newline t3 = \sum x_iy_i \newline t4 = \sum x_i^2 \newline a = \frac { n*t3 - t1*t2} {n*t4 - t1^2} \newline b = \frac { t4*t2 - t1* t3 } {n*t4 - t1^2} \end{aligned} \]