5.5动手实现多元线性回归
本节我们将用python代码,利用梯度下降算法,实现一个多元线性回归。也是时候写一些代码了。
5.5.1已知条件
数据
温度 | 价格(元) | 销量(个) |
---|---|---|
10 | 3 | 60 |
20 | 3 | 85 |
25 | 3 | 100 |
28 | 2.5 | 120 |
30 | 2 | 140 |
35 | 2.5 | 145 |
40 | 2.5 | 163 |
多元线性回归公式
我们用表示温度, 表示价格,表示销量。
表示截距,表示温度对应的权重,表示价格对应的权重。
则预测的销量为:
损失函数
损失函数我们用MSE,我们有7个数据,所以:
带入线性回归方程有:
5.5.2 用梯度下降算法更新参数
我们用梯度下降算法逐步来更新参数。
梯度计算
利用损失函数对每个参数求偏导:
- 的偏导数:
- 的偏导数:
- 的偏导数:
参数更新
在每次迭代中,参数按照以下规则更新:
其中为学习率。
5.5.3 Python实现
# Feature 数据
X = [
[10, 3],
[20, 3],
[25, 3],
[28, 2.5],
[30, 2],
[35, 2.5],
[40, 2.5]
]
y = [60, 85, 100, 120, 140, 145, 163] # Label 数据
# 初始化参数
w = [0.0, 0.0, 0.0] # w0, w1, w2
lr= 0.001 # 学习率
num_iterations = 10000 # 迭代次数
# 添加截距对应项 x0 = 1
X = [[1] + row for row in X]
# 梯度下降
for i in range(num_iterations):
# 预测值
y_pred = [w[0] + w[1] * row[1] + w[2] * row[2] for row in X]
# 计算损失
loss = sum((y_pred[j] - y[j]) ** 2 for j in range(len(y))) / len(y)
# 计算梯度
grad_w0 = 2 * sum(y_pred[j] - y[j] for j in range(len(y))) / len(y)
grad_w1 = 2 * sum((y_pred[j] - y[j]) * X[j][1] for j in range(len(y))) / len(y)
grad_w2 = 2 * sum((y_pred[j] - y[j]) * X[j][2] for j in range(len(y))) / len(y)
# 更新参数
w[0] -= lr* grad_w0
w[1] -= lr* grad_w1
w[2] -= lr* grad_w2
# 打印损失
if i % 100 == 0:
print(f"Iteration {i}: Loss = {loss}")
# 输出最终参数
print(f"Final parameters: w0 = {w[0]}, w1 = {w[1]}, w2 = {w[2]}")
你可以尝试调整学习率,迭代次数。学习率太大的话,训练过程不会收敛,loss值可能会越来越大,直到程序出错。
恭喜你!你完成了你第一个模型的训练。