今日目标
- 理解多变量回归与单变量的区别
- 用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]
验收标准
- 能解释多变量回归与单变量的区别
- 能实现标准化的代码
- 能运行多变量梯度下降
- 能理解矩阵乘法的意义

3万+

被折叠的 条评论
为什么被折叠?



