1. 程式人生 > 其它 >最小二乘直線擬合

最小二乘直線擬合

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