现在位置: 首页 > AI 数学基础 > 正文

从零手写一个多元线性回归

综合运用矩阵运算 + 梯度下降 + MSE,完整走一遍「数据 → 模型 → 训练 → 预测」全流程。

学完本案例你将理解:一个能跑通的机器学习模型,本质上就是线性代数 + 微积分 + 优化的组合。


生活引入

估算房价——不止看面积

房价不只取决于面积。还取决于卧室数量、楼层、是否近地铁、房龄……每个因素各有权重。

多元线性回归就是:给每个因素一个权重 w,把所有因素乘以权重加在一起,再加一个基础价格 b。然后用历史成交数据反推出这些权重——这就是训练。


直观理解

完整的机器学习五步循环:

准备数据
X, y
前向预测
X*W+b
计算损失
MSE
算梯度
X.T*error
更新参数
W-=lr*dW

这五个步骤在每次迭代中循环执行,直到损失收敛。PyTorch/TensorFlow 的 fit() 方法内部就是这个循环。


数学定义

\[ \hat{y} = XW + b, \quad L = \frac{1}{n}\sum(\hat{y}_i - y_i)^2 \] \[ \frac{\partial L}{\partial W} = \frac{2}{n} X^T (XW + b - y), \quad \frac{\partial L}{\partial b} = \frac{2}{n} \sum (XW + b - y) \]

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)}")
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 的大小——绝对值大的特征对结果影响更大