最小二乘法及其代码实现

简介

最小二乘法就是用过最小化误差的平方和寻找数据的最佳函数匹配。利用最小二乘法可以简便的求得未知的数据。

一元线性回归下的最小二乘法

下面来讲解一下最小二乘法(以二维数据为例)
首先,我们得到一组数据( x 1 , y 1 x_1,y_1 x1,y1), ( x 2 , y 2 x_2,y_2 x2,y2)…( x n , y n x_n,y_n xn,yn),我们的预测函数 f ( x i ) = ω x i + b f(x_i)=\omega x_i+b f(xi)=ωxi+b,也就是预测值 y ^ i \hat y_i y^i, 那么我们的误差的平方和为:
∑ i = 1 n ( y i − y ^ i ) 2 = ∑ i = 1 n ( y i − ω x i − b ) 2 \sum_{i=1}^n(y_i-\hat y_i)^2=\sum_{i=1}^n(y_i-\omega x_i-b)^2 i=1n(yiy^i)2=i=1n(yiωxib)2
而我们需要使得上面的式子为最小值,从而求得我们需要的 ω 和 b \omega和b ωb, 我们将其记作 ( ω ∗ , b ∗ ) (\omega^*, b^*) (ω,b),即
( ω ∗ , b ∗ ) = arg ⁡ min ⁡ ( ω , b ) ∑ i = 1 n ( y i − y ^ i ) 2 = arg ⁡ min ⁡ ( ω , b ) ( y i − ω x i − b ) 2 (\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 (ω,b)=arg(ω,b)mini=1n(yiy^i)2=arg(ω,b)min(yiωxib)2
求解 ω \omega ω b b b的使得 E ( ω , b ) = ∑ i = 1 n ( y i − y ^ i ) 2 E_{(\omega, b)}=\sum^n_{i=1}(y_i-\hat y_i)^2 E(ω,b)=i=1n(yiy^i)2的过程,称为线性回归模型的最小二乘"参数估计"
我们要求得 E ( ω , b ) E_{(\omega, b)} E(ω,b)的最小值,只需要求得其极值即可。
我们可将 E ( ω , b ) E_{(\omega, b)} E(ω,b)分别对 ω \omega ω b b b求偏导:
∂ E ( ω , b ) ∂ ω = 2 ( ω ∑ i = 1 n x i 2 − ∑ i = 1 n ( y i − b ) x i ) = 0 \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 ωE(ω,b)=2(ωi=1nxi2i=1n(yib)xi)=0
∂ E ( ω , b ) ∂ b = 2 ( n b − ∑ i = 1 n ( y i − ω x i ) ) = 0 \frac{\partial E{(\omega, b)}}{\partial b}=2\left(nb-\sum^n_{i=1}(y_i-\omega x_i)\right)=0 bE(ω,b)=2(nbi=1n(yiωxi))=0
对上面的方程求解可以得到
ω = ∑ i = 1 n y i ( x i − x ‾ ) ∑ i = 1 n x i 2 − 1 m ( ∑ i = 1 m x i ) 2 \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} ω=i=1nxi2m1(i=1mxi)2i=1nyi(xix)
b = 1 m ∑ i = 1 n ( y i − ω x i ) b = \frac1m\sum^n_{i=1}(y_i-\omega x_i) b=m1i=1n(yiωxi)
其中 x ‾ = 1 n ∑ i = 1 n x i \overline x=\frac1n\sum^n_{i=1}x_i x=n1i=1nxi x ‾ \overline x x x x x的均值

通过上面的步骤我们就可以得到最小二乘法的 ω 和 b \omega和b ωb了。
从而我们就可以得到关系式 f ( x i ) = ω x i + b f(x_i)=\omega x_i+b f(xi)=ωxi+b

多元线性回归下的最小二乘法

同样的,如果将最小二乘法应用到 n n n维数据中
我们的数据 x x x如下:
x = ( x 11 x 12 … x 1 n x 21 x 22 … x 2 n ⋮ ⋮ ⋱ ⋮ x m 1 x m 2 … x m n ) 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) x= x11x21xm1x12x22xm2x1nx2nxmn
对应的 ω \omega ω ( ω 1 ω 2 … ω n ) \left(\begin{matrix}\omega_1&\omega_2&\dots&\omega_n\end{matrix}\right) (ω1ω2ωn),所对应的方程为
ω 1 x 1 + ω 2 x 2 + ⋯ + ω n x n + b \omega_1 x_1+\omega_2 x_2+\dots+\omega_n x_n+b ω1x1+ω2x2++ωnxn+b
为了方便计算,我们可以将 b b b放在 x x x ω \omega ω中,即将 b b b作为一维,其为固定值1,参数为 ω b \omega_b ωb
x = ( x 11 x 12 … x 1 n 1 x 21 x 22 … x 2 n 1 ⋮ ⋮ ⋱ ⋮ ⋮ x m 1 x m 2 … x m n 1 ) = ( x 1 T 1 x 2 T 1 ⋮ ⋮ x m T 1 ) ω = ( ω 1 ω 2 … ω n ω 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) x= x11x21xm1x12x22xm2x1nx2nxmn111 = x1Tx2TxmT111 ω=(ω1ω2ωnωb)
因此,我们的方程就变为了 f ( x i ) = ω T x f(x_i) = \omega^Tx f(xi)=ωTx
与上方一元线性回归下的误差类似地
ω ∗ = arg ⁡ min ⁡ ω ( y − X ω ) T ( y − X ω ) \omega^*=\arg\min_{\omega}(y-X\omega)^T(y-X\omega) ω=argωmin(yXω)T(yXω)
E ω = ( y − X ω ) T ( y − X ω ) E_\omega=(y-X\omega)^T(y-X\omega) Eω=(yXω)T(yXω),对 ω \omega ω求导可得:
∂ E ω ∂ ω = 2 X T ( X ω − y ) \frac{\partial E_\omega}{\partial\omega}=2X^T(X\omega-y) ωEω=2XT(Xωy)
令上式等于零可得 ω \omega ω的最优解:
ω ∗ = ( X T X ) − 1 X T y \omega^*=(X^TX)^{-1}X^Ty ω=(XTX)1XTy
从而可以得到我们需要的函数 f ( x i ) = ω ′ T x ′ = ω T x + ω b = ω T x + b f(x_i)=\omega'^Tx'=\omega^Tx+\omega_b=\omega^Tx+b f(xi)=ωTx=ωTx+ωb=ωTx+b也就是 f ( x i ) = x i T ( X T X ) − 1 X T y f(x_i)=x_i^T(X^TX)^{-1}X^Ty f(xi)=xiT(XTX)1XTy

多元最小二乘法也是用与一元线性回归

最小二乘法的代码实现

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()

得到的图像为
最小二乘法数据拟合

  • 8
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
最小二乘法是一种常用的回归分析方法,用于拟合数据并找到最佳的线性函数匹配。通过最小化误差的平方和来确定函数的参数。根据引用\[1\]中的代码实现,可以使用以下函数来实现最小二乘法算法: ```python 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\] omega = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(Y) return X_b, omega ``` 这个函数接受未进行扩展的X矩阵和相应的结果集Y矩阵作为输入,并返回进行扩展处理后的X矩阵和使用最小二乘法求得的参数ω。可以使用该函数来拟合数据并得到最佳的线性函数匹配。引用\[2\]中的代码示例展示了如何使用最小二乘法来拟合数据并绘制结果图。 另外,引用\[3\]提到了偏最小二乘法,它是一种新型的多元统计数据分析方法,用于回归建模、数据结构简化和相关性分析。但是在这个问题中,我们只关注最小二乘法算法代码实现。 #### 引用[.reference_title] - *1* *2* [最小二乘法及其代码实现](https://blog.csdn.net/c2861024198/article/details/105886631)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [【预测模型】基于最小二乘法算法实现股票预测matlab代码](https://blog.csdn.net/qq_59747472/article/details/121047760)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小夏refresh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值