最小二乘直線擬合
最小二乘法(英文: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\)會得到不同的\(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\)也認為是常數;
如果是求 \(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} \]