Skip to content

线性回归模型与梯度下降法

线性回归模型与枚举法

线性回归模型定义:

  • w:权重
  • b:偏置
mermaid
graph LR
	x[特征 x]
	y[工资 y]
	w[w1, w2, w3, ..., b]
	学历 --> x --> 线性回归模型
	专业 --> x
	... --> x
	y --> 线性回归模型 --> w

损失函数:用于计算输出和真实值之间的误差

loss=(f(x)y)2=(wxy)2\text{loss} = (f(x) - y)^2=(wx-y)^2

线性回归的目标:寻找一组参数w、b,使损失函数最小。(预测结果接近真实数据)

如何求w、b --> 枚举法求解:猜呗!慢慢猜w是多少!😅(不现实)

最小二乘法

loss=(wxy)2\text{loss}=(wx-y)^2

满足二次函数,通过 f(x)=0f'(x)=0 的方式可以求出极值。(多个w可以求偏导数)

😋 不要怕数学。学好数学并不难。

对于向量形式:

image-20240122211235941

利用 导数为零 得到极小值。

矩阵可逆的充要条件之一是其行列式不为0,当矩阵的行列式等于0时,矩阵一定不可逆。

存在问题:由于 (XTX)1(X^TX)^{-1} 不一定存在,所以最小二乘法不一定能获取到最小值。

⭐️ 梯度下降法

带有方向的穷举法

核心:方向、步伐

梯度下降法参数更新的计算公式w=wadJ(w)dww=w-a\frac{dJ(w)}{dw}

  • aa:学习率(步伐)
  • dJ(w)dw-\frac{dJ(w)}{dw}:当前值的导数值,取负数(下降的方向)

小案例:

学习率较为重要,常常为经验值(0.01、0.1...)。

多参数求解:求偏导数

代码实现

深度学习过程:

  1. 定义模型(线性回归、逻辑回归...)
  2. 数据:特征 (x) 与标签 (y)
  3. 损失函数:定义预测值与真实值的差距
  4. 梯度下降法更新参数(权重w和偏置b)
python
# 线性回归模型
def forward(x):
    # y' = wx
    return w * x


# 损失函数 (多个数值求平均损失)
def cost(x, y):
    cost_val = 0
    for xx, yy in zip(x, y):
        # loss = (wx - y)^2
        cost_val += (xx * w - yy) ** 2
    return cost_val / len(x)


# 梯度下降 (多个数值求平均损失)
def gradient(x, y):
    # 梯度值
    grad = 0
    for xx, yy in zip(x, y):
        # w = w - a(dLoss(w) / dw)
        # dLoss(w) / dw = 2x(wx - y)
        grad += 2 * xx * (w * xx - yy)
    return grad / len(x)


if __name__ == '__main__':
    # 数据集:特征
    x_data = [1, 2, 3, 4]
    # 数据集:标签
    y_data = [10, 20, 30, 40]

    # 学习率 (经验值)
    learn_rating = 0.01

    # 初始化参数 w (随机值/经验值)
    w = 1

    # 多次更新w参数
    for epoch in range(100):
        w -= learn_rating * gradient(x_data, y_data)
        cost_num = cost(x_data, y_data)
        if epoch % 10 == 0:
            print(f'Epoch: {epoch}\tw: {w:.8f}\tcost: {cost_num:.8f}\t')

    # 使用更新过的 w 进行预测
    test_data = 5
    print(f'对于5的预测结果是: {forward(5)}')

Released under the MIT License.