最小二乘法(英文: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}
\]