最小二乘法


簡介

個人博客: https://xiaoxiablogs.top
最小二乘法就是用過最小化誤差的平方和尋找數據的最佳函數匹配。利用最小二乘法可以簡便的求得未知的數據。

一元線性回歸下的最小二乘法

下面來講解一下最小二乘法(以二維數據為例)
首先,我們得到一組數據(\(x_1,y_1\)), (\(x_2,y_2\))...(\(x_n,y_n\)),我們的預測函數 \(f(x_i)=\omega x_i+b\),也就是預測值\(\hat y_i\), 那么我們的誤差的平方和為:

\[\sum_{i=1}^n(y_i-\hat y_i)^2=\sum_{i=1}^n(y_i-\omega x_i-b)^2 \]

而我們需要使得上面的式子為最小值,從而求得我們需要的\(\omega和b\), 我們將其記作\((\omega^*, b^*)\),即

\[(\omega^*,b^*)=\arg\min_{(\omega, b)}\sum^n_{i=1}(y_i-\hat y_i)^2=\arg\min_{(\omega,b)}(y_i-\omega x_i-b)^2 \]

求解\(\omega\)\(b\)的使得\(E_{(\omega, b)}=\sum^n_{i=1}(y_i-\hat y_i)^2\)的過程,稱為線性回歸模型的最小二乘"參數估計"
我們要求得\(E_{(\omega, b)}\)的最小值,只需要求得其極值即可。
我們可將\(E_{(\omega, b)}\)分別對\(\omega\)\(b\)求偏導:

\[\frac{\partial E{(\omega, b)}}{\partial\omega}=2\left(\omega\sum^n_{i=1}x_i^2-\sum^n_{i=1}(y_i-b)x_i\right)=0 \]

\[\frac{\partial E{(\omega, b)}}{\partial b}=2\left(nb-\sum^n_{i=1}(y_i-\omega x_i)\right)=0 \]

對上面的方程求解可以得到

\[\omega=\frac{\sum^n_{i=1}y_i(x_i-\overline x)}{\sum^n_{i=1}x^2_i-\frac1m\left(\sum^m_{i=1}x_i\right)^2} \]

\[b = \frac1m\sum^n_{i=1}(y_i-\omega x_i) \]

其中\(\overline x=\frac1n\sum^n_{i=1}x_i\)\(\overline x\)\(x\)的均值

通過上面的步驟我們就可以得到最小二乘法的\(\omega和b\)了。
從而我們就可以得到關系式\(f(x_i)=\omega x_i+b\)

多元線性回歸下的最小二乘法

同樣的,如果將最小二乘法應用到\(n\)維數據中
我們的數據\(x\)如下:

\[x=\left( \begin{matrix} x_{11}&x_{12}&\dots&x_{1n}\\ x_{21}&x_{22}&\dots&x_2n\\ \vdots&\vdots&\ddots&\vdots\\ x_{m1}&x_{m2}&\dots&x_{mn} \end{matrix} \right) \]

對應的\(\omega\)\(\left(\begin{matrix}\omega_1&\omega_2&\dots&\omega_n\end{matrix}\right)\),所對應的方程為
\(\omega_1 x_1+\omega_2 x_2+\dots+\omega_n x_n+b\)
為了方便計算,我們可以將\(b\)放在\(x\)\(\omega\)中,即將\(b\)作為一維,其為固定值1,參數為\(\omega_b\)

\[x=\left( \begin{matrix} x_{11}&x_{12}&\dots&x_{1n}&1\\ x_{21}&x_{22}&\dots&x_2n&1\\ \vdots&\vdots&\ddots&\vdots&\vdots\\ x_{m1}&x_{m2}&\dots&x_{mn}&1 \end{matrix} \right)= \left( \begin{matrix} x_1^T&1\\ x_2^T&1\\ \vdots&\vdots\\ x_m^T&1 \end{matrix} \right)\\ \omega=\left(\begin{matrix}\omega_1&\omega_2&\dots&\omega_n&\omega_b\end{matrix}\right) \]

因此,我們的方程就變為了\(f(x_i) = \omega^Tx\)
與上方一元線性回歸下的誤差類似地

\[\omega^*=\arg\min_{\omega}(y-X\omega)^T(y-X\omega) \]

\(E_\omega=(y-X\omega)^T(y-X\omega)\),對\(\omega\)求導可得:

\[\frac{\partial E_\omega}{\partial\omega}=2X^T(X\omega-y) \]

令上式等於零可得\(\omega\)的最優解:

\[\omega^*=(X^TX)^{-1}X^Ty \]

從而可以得到我們需要的函數\(f(x_i)=\omega'^Tx'=\omega^Tx+\omega_b=\omega^Tx+b\)也就是\(f(x_i)=x_i^T(X^TX)^{-1}X^Ty\)

多元最小二乘法也是用與一元線性回歸

最小二乘法的代碼實現

def LeastSquareMethod(X, Y):
	"""
		最小二乘法
	:param X: 未進行擴展的X矩陣
	:param Y: X矩陣相對應的結果集矩陣
	:return X_b: 進行擴展處理后的X矩陣
	:return omega: 使用最小二乘法求得的w
	"""
	# 對X矩陣進行擴展
	X_b = np.c_[np.ones((len(X), 1)), X]
	'''
	np.linalg.inv用來求矩陣的逆矩陣
	dot表示矩陣祥恆
	T表示矩陣的轉置
	'''
	omega = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y)
	return X_b, omega

實例

import numpy as np
import matplotlib.pyplot as plt


def LeastSquareMethod(X, Y):
	"""
		最小二乘法
	:param X: 未進行擴展的X矩陣
	:param Y: X矩陣相對應的結果集矩陣
	:return X_b: 進行擴展處理后的X矩陣
	:return omega: 使用最小二乘法求得的w
	"""
	# 對X矩陣進行擴展
	X_b = np.c_[np.ones((len(X), 1)), X]
	'''
	np.linalg.inv用來求矩陣的逆矩陣
	dot表示矩陣祥恆
	T表示矩陣的轉置
	'''
	omega = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y)
	return X_b, omega


if __name__ == '__main__':
	X = np.random.rand(100, 1)
	Y = 4 + 3 * X + np.random.rand(100, 1)
	X_b, omega = LeastSquareMethod(X, Y)
	Y2 = X_b.dot(omega)
	plt.plot(X, Y, 'o')
	plt.plot(X, Y2, 'r')
	plt.show()

得到的圖像為
最小二乘法數據擬合


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM