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

今日目标

  1. 理解多变量回归与单变量的区别
  2. 用NumPy实现多变量线性回归
  3. 理解矩阵形式的梯度下降

学习内容

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]

验收标准

  • 能解释多变量回归与单变量的区别
  • 能实现标准化的代码
  • 能运行多变量梯度下降
  • 能理解矩阵乘法的意义
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值