为了展示多元线性回归的迭代过程,我们可以使用梯度下降算法手动实现多元线性回归。梯度下降是一种迭代优化算法,用于最小化损失函数。
我们将以下步骤进行手动实现:
- 初始化回归系数。
- 计算预测值和损失函数。
- 计算梯度。
- 更新回归系数。
- 重复步骤2-4,直到损失函数收敛或达到最大迭代次数。
以下是用Python代码实现梯度下降算法进行多元线性回归的过程:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt# 生成样本数据
np.random.seed(0)
X1 = np.random.rand(100) * 10
X2 = np.random.rand(100) * 10
y = 5 + 2 * X1 - 1 * X2 + np.random.randn(100) * 2# 创建DataFrame
data = pd.DataFrame({'X1': X1, 'X2': X2, 'y': y})# 特征矩阵和目标变量
X = data[['X1', 'X2']]
X = np.c_[np.ones(X.shape[0]), X] # 添加一列1表示截距项
y = data['y'].values# 初始化回归系数
theta = np.random.randn(3)# 超参数
learning_rate = 0.01
max_iter = 1000
tolerance = 1e-6# 梯度下降
for i in range(max_iter):# 计算预测值y_pred = X.dot(theta)# 计算损失函数(均方误差)loss = np.mean((y_pred - y) ** 2)# 计算梯度gradient = 2 * X.T.dot(y_pred - y) / y.size# 更新回归系数new_theta = theta - learning_rate * gradient# 判断是否收敛if np.max(np.abs(new_theta - theta)) < tolerance:print(f"在第{i+1}次迭代后收敛")breaktheta = new_theta# 输出结果
print(f"回归系数: {theta}")
print(f"损失函数: {loss}")# 评价模型
y_pred = X.dot(theta)
mse = np.mean((y_pred - y) ** 2)
r2 = 1 - (np.sum((y - y_pred) ** 2) / np.sum((y - np.mean(y)) ** 2))print(f"均方误差: {mse}")
print(f"R^2 值: {r2}")# 绘制真实值与预测值的比较
plt.scatter(y, y_pred)
plt.xlabel('真实值')
plt.ylabel('预测值')
plt.title('真实值 vs 预测值')
plt.plot([y.min(), y.max()], [y.min(), y.max()], color='red') # 画一条对角线
plt.show()
在这个代码中,我们手动实现了多元线性回归的梯度下降过程:
- 初始化回归系数
theta
。 - 计算预测值
y_pred
。 - 计算损失函数(均方误差)。
- 计算梯度。
- 根据梯度更新回归系数
theta
。 - 检查收敛条件,达到收敛条件或最大迭代次数时停止迭代。
通过这种方法,我们能够清楚地看到迭代的过程以及每次迭代中回归系数的更新。
让我们详细解释一下梯度的计算公式。
在多元线性回归中,我们的目标是最小化损失函数,通常是均方误差(Mean Squared Error, MSE),它定义为:
为了最小化这个损失函数,我们使用梯度下降法。梯度下降法的核心是计算损失函数关于回归系数的梯度,然后沿着梯度的负方向更新回归系数。
梯度计算
这里乘以2是因为我们在计算均方误差时没有将常数1/2包含在内,所以在梯度计算中需要额外乘以2。