从零手写一个多元线性回归
综合运用矩阵运算 + 梯度下降 + MSE,完整走一遍「数据 → 模型 → 训练 → 预测」全流程。
学完本案例你将理解:一个能跑通的机器学习模型,本质上就是线性代数 + 微积分 + 优化的组合。
生活引入
估算房价——不止看面积
房价不只取决于面积。还取决于卧室数量、楼层、是否近地铁、房龄……每个因素各有权重。
多元线性回归就是:给每个因素一个权重 w,把所有因素乘以权重加在一起,再加一个基础价格 b。然后用历史成交数据反推出这些权重——这就是训练。
直观理解
完整的机器学习五步循环:
准备数据
X, y
前向预测
X*W+b
计算损失
MSE
算梯度
X.T*error
更新参数
W-=lr*dW
这五个步骤在每次迭代中循环执行,直到损失收敛。PyTorch/TensorFlow 的 fit() 方法内部就是这个循环。
数学定义
Python 动手实践
实例
python
import numpy as np
np.random.seed(0)
class LinearRegressionFromScratch:
"""完全用 NumPy 矩阵运算 + 梯度下降实现"""
def __init__(self, lr=0.01, epochs=500):
self.lr = lr
self.epochs = epochs
self.W = None
self.b = None
self.loss_history = []
def fit(self, X, y):
n_samples, n_features = X.shape
self.W = np.zeros(n_features)
self.b = 0.0
for epoch in range(self.epochs):
y_pred = X @ self.W + self.b
error = y_pred - y
loss = np.mean(error ** 2)
self.loss_history.append(loss)
dW = (2 / n_samples) * (X.T @ error)
db = (2 / n_samples) * np.sum(error)
self.W -= self.lr * dW
self.b -= self.lr * db
if epoch % 100 == 0:
print(f"RUNOOB epoch {epoch:4d} loss={loss:.4f}")
def predict(self, X):
return X @ self.W + self.b
# 构造数据:y = 3*x1 - 2*x2 + 5 + 噪声
X = np.random.uniform(-5, 5, size=(200, 2))
true_W = np.array([3.0, -2.0])
true_b = 5.0
y = X @ true_W + true_b + np.random.randn(200) * 1.5
model = LinearRegressionFromScratch(lr=0.01, epochs=500)
model.fit(X, y)
print(f"\nRUNOOB 学到的: W={np.round(model.W, 3)}, b={round(model.b, 3)}")
print(f"真实的: W={true_W}, b={true_b}")
print(f"损失: {model.loss_history[0]:.1f} -> {model.loss_history[-1]:.2f}")
# 预测新样本
X_new = np.array([[1.0, 1.0], [-2.0, 3.0]])
print(f"预测: {np.round(model.predict(X_new), 2)}")python
RUNOOB epoch 0 loss=157.0828
RUNOOB epoch 100 loss=2.6062
RUNOOB epoch 200 loss=2.3077
RUNOOB epoch 300 loss=2.2581
RUNOOB epoch 400 loss=2.2475
RUNOOB 学到的: W=[ 3.014 -2.017], b=4.737
真实的: W=[ 3. -2.], b=5.0
损失: 157.1 -> 2.25
预测: [5.73 -4.18]AI 中的应用场景
| 场景 | 与本案的联系 |
|---|---|
| 基准模型 | 任何回归任务的第一版模型都应该是线性回归——简单、可解释 |
| 神经网络最后一层 | 很多网络的输出层就是线性层——本质上就是线性回归 |
| 特征重要性分析 | 训练完看 W 的大小——绝对值大的特征对结果影响更大 |
AI 思考中...