欢迎光临
我们一直在努力

第一阶段-第9天-NumPy多变量回归

今日目标

  • 理解多变量回归与单变量的区别
  • 用NumPy实现多变量线性回归
  • 理解矩阵形式的梯度下降
  • 学习内容

    1. 多变量 vs 单变量

    单变量:一个输入 → 一个输出

    y = w * x + b

    多变量:多个输入 → 一个输出

    y = w1*x1 + w2*x2 + … + wn*xn + b

    2. 多变量房价预测

    假设房价由三个因素决定:

    • 面积(平方米)
    • 楼层
    • 房龄(年)

    import numpy as np

    # 训练数据:[面积, 楼层, 房龄] → 房价(万元)
    X = np.array([
    [100, 5, 10], # 100平米, 5楼, 10年房龄
    [120, 8, 5], # 120平米, 8楼, 5年房龄
    [80, 3, 15], # 80平米, 3楼, 15年房龄
    [150, 10, 2], # 150平米, 10楼, 2年房龄
    [90, 6, 8], # 90平米, 6楼, 8年房龄
    ])

    y = np.array([200, 280, 150, 350, 180])

    print("输入矩阵形状:", X.shape) # (5, 3) — 5个样本, 3个特征
    print("输出向量:", y)

    3. 矩阵形式

    y = X @ w + b

    其中:

    • X:输入矩阵 (n_samples, n_features)
    • w:权重向量 (n_features,)
    • b:偏置标量
    • @:矩阵乘法

    4. 用NumPy实现多变量梯度下降

    import numpy as np

    # 数据
    X = np.array([
    [100, 5, 10],
    [120, 8, 5],
    [80, 3, 15],
    [150, 10, 2],
    [90, 6, 8],
    ])
    y = np.array([200, 280, 150, 350, 180])

    n_samples, n_features = X.shape
    print(f"样本数: {n_samples}, 特征数: {n_features}")

    # 初始化
    w = np.zeros(n_features)
    b = 0.0
    learning_rate = 0.00001 # 多变量时需要更小的学习率
    epochs = 1000

    print("\\n开始训练…")
    for epoch in range(epochs):
    # 前向计算
    predictions = X @ w + b

    # 计算损失
    loss = np.mean((predictions y) ** 2)

    # 计算梯度
    error = predictions y
    gradient_w = (2 / n_samples) * (X.T @ error)
    gradient_b = (2 / n_samples) * np.sum(error)

    # 更新参数
    w = w learning_rate * gradient_w
    b = b learning_rate * gradient_b

    if epoch % 200 == 0:
    print(f" 轮次{epoch:4d}: 损失={loss:.2f}")

    print(f"\\n训练完成!")
    print(f"权重: {w}")
    print(f"偏置: {b:.2f}")

    # 预测
    test = np.array([[110, 7, 6]]) # 新房子
    predicted = test @ w + b
    print(f"\\n预测: 110平米/7楼/6年房龄 → 房价{predicted[0]:.1f}万元")

    5. 数据标准化

    多变量时,不同特征的尺度差异很大(面积100 vs 楼层5),需要标准化:

    # 计算均值和标准差
    X_mean = np.mean(X, axis=0)
    X_std = np.std(X, axis=0)

    print("均值:", X_mean)
    print("标准差:", X_std)

    # 标准化
    X_normalized = (X X_mean) / X_std

    print("\\n标准化后的数据:")
    print(X_normalized)
    # 现在所有特征的均值接近0,标准差接近1

    今日练习

    练习1:实现标准化并重新训练

    import numpy as np

    X = np.array([
    [100, 5, 10],
    [120, 8, 5],
    [80, 3, 15],
    [150, 10, 2],
    [90, 6, 8],
    ])
    y = np.array([200, 280, 150, 350, 180])

    # 标准化
    mean = np.mean(X, axis=0)
    std = np.std(X, axis=0)
    X_norm = (X mean) / std

    # 训练
    w = np.zeros(X.shape[1])
    b = 0.0
    lr = 0.01

    for epoch in range(500):
    pred = X_norm @ w + b
    loss = np.mean((pred y) ** 2)
    error = pred y
    grad_w = (2 / len(y)) * (X_norm.T @ error)
    grad_b = (2 / len(y)) * np.sum(error)
    w -= lr * grad_w
    b -= lr * grad_b

    print(f"w = {w}")
    print(f"b = {b:.2f}")
    print(f"最终损失 = {loss:.2f}")

    练习2:理解矩阵乘法

    import numpy as np

    # X是(3, 2),w是(2,),结果是(3,)
    X = np.array([[1, 2], [3, 4], [5, 6]])
    w = np.array([10, 20])

    result = X @ w
    print("X @ w =", result)
    # 相当于:
    # [1*10 + 2*20, 3*10 + 4*20, 5*10 + 6*20]
    # = [50, 110, 170]

    验收标准

    • 能解释多变量回归与单变量的区别
    • 能实现标准化的代码
    • 能运行多变量梯度下降
    • 能理解矩阵乘法的意义
    赞(0)
    未经允许不得转载:171主机测评 » 第一阶段-第9天-NumPy多变量回归
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址