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

多元线性回归公式

我们用x1x_1表示温度, x2x_2表示价格,yy表示销量。

w0w_0表示截距,w1w_1表示温度对应的权重,w2w_2表示价格对应的权重。

则预测的销量为:

y^=w0+w1x1+w2x2\hat{y}=w_0+w_1x_1+w_2x_2

损失函数

损失函数我们用MSE,我们有7个数据,所以:

loss=17i=17(y^iyi)2loss = \frac{1}{7}\sum_{i=1}^{7}(\hat{y}^i-y^i)^2

带入线性回归方程有:

loss=17i=17(w0+w1x1i+w2x2iyi)2loss = \frac{1}{7}\sum_{i=1}^{7}(w_0+w_1x_1^i+w_2x_2^i-y^i)^2

5.5.2 用梯度下降算法更新参数

我们用梯度下降算法逐步来更新参数w0,w1,w2w_0,w_1,w_2

梯度计算

利用损失函数对每个参数求偏导:

  • w0w_0的偏导数:
lossw0=27i=17(w0+w1x1i+w2x2iyi)\frac{\partial loss}{\partial w_0} = \frac{2}{7} \sum_{i=1}^{7} (w_0 + w_1 x_1^i + w_2 x_2^i - y^i)
  • w1w_1的偏导数:
lossw1=27i=17(w0+w1x1i+w2x2iyi)x1i\frac{\partial loss}{\partial w_1} = \frac{2}{7} \sum_{i=1}^{7} (w_0 + w_1 x_1^i + w_2 x_2^i - y^i) \cdot x_1^i
  • w2w_2的偏导数:
lossw2=27i=17(w0+w1x1i+w2x2iyi)x2i\frac{\partial loss}{\partial w_2} = \frac{2}{7} \sum_{i=1}^{7} (w_0 + w_1 x_1^i + w_2 x_2^i - y^i) \cdot x_2^i

参数更新

在每次迭代中,参数按照以下规则更新:

w0=w0lrlossw0w_0=w_0-lr\cdot\frac{\partial loss}{\partial w_0}


w1=w1lrlossw1w_1=w_1-lr\cdot\frac{\partial loss}{\partial w_1}


w2=w2lrlossw2w_2=w_2-lr\cdot\frac{\partial loss}{\partial w_2}

其中lrlr为学习率。

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值可能会越来越大,直到程序出错。

恭喜你!你完成了你第一个模型的训练。

results matching ""

    No results matching ""