线性回归最小二乘法、线性回归梯度下降法、线性回归调sklearn库三种实现方式进行代码实践,针对每一行代码语法元素进行分析。
时间: 2025-01-22 20:16:22 浏览: 38
好的,我将为您介绍线性回归的三种实现方式,并对代码进行详细分析。
1. 最小二乘法实现线性回归:
```python
import numpy as np
# 生成示例数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([1.2, 1.9, 3.2, 4.1, 5.1])
# 添加截距项
X_b = np.c_[np.ones((len(X), 1)), X]
# 计算参数
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
print("参数:", theta_best)
```
代码分析:
- `import numpy as np`: 导入NumPy库,用于数值计算。
- `X = np.array([[1], [2], [3], [4], [5]])`: 创建输入特征矩阵X。
- `y = np.array([1.2, 1.9, 3.2, 4.1, 5.1])`: 创建目标变量y。
- `X_b = np.c_[np.ones((len(X), 1)), X]`: 为X添加一列全1,用于计算截距项。
- `theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)`: 计算参数θ,其中np.linalg.inv()用于计算矩阵的逆。
- `print("参数:", theta_best)`: 打印参数结果。
2. 梯度下降法实现线性回归:
```python
import numpy as np
# 生成示例数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([1.2, 1.9, 3.2, 4.1, 5.1])
# 添加截距项
X_b = np.c_[np.ones((len(X), 1)), X]
# 初始化参数
theta = np.random.randn(2, 1)
# 梯度下降
learning_rate = 0.1
n_iterations = 1000
for iteration in range(n_iterations):
gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)
theta = theta - learning_rate * gradients
print("参数:", theta)
```
代码分析:
- 与最小二乘法类似,导入库和准备数据。
- `theta = np.random.randn(2, 1)`: 初始化参数,随机生成2x1的数组。
- `learning_rate = 0.1`: 设置学习率。
- `n_iterations = 1000`: 设置迭代次数。
- `for iteration in range(n_iterations)`: 开始梯度下降迭代。
- `gradients = 2/m * X_b.T.dot(X_b.dot(theta) - y)`: 计算梯度,其中m是样本数量。
- `theta = theta - learning_rate * gradients`: 更新参数。
- `print("参数:", theta)`: 打印最终参数。
3. 使用scikit-learn库实现线性回归:
```python
from sklearn.linear_model import LinearRegression
import numpy as np
# 生成示例数据
X = np.array([[1], [2], [3], [4], [5]])
y = np.array([1.2, 1.9, 3.2, 4.1, 5.1])
# 创建模型
model = LinearRegression()
# 训练模型
model.fit(X, y)
# 打印参数
print("截距:", model.intercept_)
print("系数:", model.coef_)
```
代码分析:
- `from sklearn.linear_model import LinearRegression`: 从scikit-learn库导入线性回归模型。
- `model = LinearRegression()`: 创建线性回归模型实例。
- `model.fit(X, y)`: 用数据训练模型。
- `print("截距:", model.intercept_)`: 打印截距项。
- `print("系数:", model.coef_)`: 打印系数。
这三种方法各有优缺点。最小二乘法直接求解,结果精确,但计算量大;梯度下降法适用于大规模数据,但需要调参;使用库函数简单高效,但缺乏对底层实现的理解。
阅读全文
相关推荐
















