线性最小二乘法 python
时间: 2024-12-28 11:21:35 浏览: 4
### Python 实现线性最小二乘法
#### 使用 `numpy` 库实现简单线性回归
为了更好地理解如何利用Python实现线性最小二乘法,下面提供了一个具体的例子。此实例采用NumPy库中的函数来计算最佳拟合直线的斜率和截距。
```python
import numpy as np
# 假设有一组实验数据点 (X,Y),其中 X 是自变量而 Y 则代表因变量。
X = np.array([0, 1, 2, 3, 4])
Y = np.array([-1, 0.2, 0.9, 2.1, 6])
# 计算系数 A 和 B 的值,即 y = Ax + B 形式的线性关系。
A, B = np.polyfit(X, Y, deg=1)
print(f'拟合得到的最佳直线方程为: y={A:.2f}x+{B:.2f}')
```
上述代码片段展示了怎样借助于 NumPy 提供的功能快速获得两个未知数——斜率 \(A\) 及常量项 \(B\)[^1]。
#### 手动构建损失函数并求解最优参数向量 \(\beta\)
对于更深入的理解以及掌握背后的原理,则可以手动定义目标函数(也称为代价/损失函数),并通过矩阵运算直接得出权重向量:
\[ J(\beta)=\sum_{i=1}^{n}(y_i-\hat{y}_i)^2=\|y-X\beta\|^2 \]
其中\( n \) 表示样本数量;\( y \in R^n \) 是实际观测的目标响应列向量;\( X \in R^{n\times p}\) 是设计矩阵或者说输入特征空间;最后 \(\beta \in R^p\) 就是要估计出来的模型参数[^3]。
具体操作如下所示:
```python
from numpy.linalg import inv
def least_squares(X, y):
"""Compute the coefficients using normal equation."""
beta_hat = inv(X.T @ X) @ X.T @ y
return beta_hat
# 构造扩展后的特征矩阵 [1,x], 这样可以直接获取到截距b和平移因子a.
ones = np.ones(len(X))
X_extended = np.column_stack((ones,X))
params = least_squares(X_extended, Y)
print('通过正规方程求得:', params)
```
这段程序不仅实现了同样的功能,而且更加贴近理论基础,有助于加深学习者对该算法的认识程度。
阅读全文