机器学习基础(六):从0理解线性回归——从公式到代码实现
一、今日目标
- 理解线性回归的本质
- 掌握损失函数与优化过程
- 手写一个完整的训练流程
- 通过实验观察模型如何收敛
二、什么是线性回归?
线性回归(Linear Regression)是最基础的监督学习模型之一,其目标是:
用一个线性函数去拟合输入与输出之间的关系
最简单的一维形式:
\[y = wx + b
\]
其中:
- (w):权重(斜率)
- (b):偏置(截距)
三、问题的本质:我们在求什么?
给定一组数据:
x = [1, 2, 3]
y = [2, 4, 6]
我们要找到一条直线,使其尽可能贴近这些点。
换句话说:
找到最优的 (w, b),让预测值和真实值的误差最小
四、损失函数(Loss Function)
我们使用最常见的均方误差(MSE):
L = \frac{1}{n} \sum_{i=1}^{n} (y_i - (wx_i + b))^2
含义:
- 衡量预测值与真实值之间的差距
- 差距越小,模型越好
五、如何优化?(核心)
目标:
\[\min_{w,b} L
\]
我们通过梯度下降(Gradient Descent)来优化参数。
求导
对参数求偏导:
\[\frac{\partial L}{\partial w} = -\frac{2}{n} \sum x_i (y_i - (wx_i + b))
\]
\[\frac{\partial L}{\partial b} = -\frac{2}{n} \sum (y_i - (wx_i + b))
\]
参数更新
\[w := w - \eta \cdot \frac{\partial L}{\partial w}
\]
\[b := b - \eta \cdot \frac{\partial L}{\partial b}
\]
其中:
- (\(\eta\)):学习率(learning rate)
六、手写线性回归(核心代码)
import numpy as np
def regression_train(x, y, lr, epochs):
w = 0
b = 0
n = len(x)
for epoch in range(epochs):
y_pred = w * x + b
loss = ((y - y_pred) ** 2).mean()
dw = (-2 * (x * (y - y_pred))).mean()
db = (-2 * (y - y_pred)).mean()
w -= lr * dw
b -= lr * db
if epoch % 100 == 0:
print(f"Epoch {epoch}, Loss: {loss:.4f}, w: {w:.4f}, b: {b:.4f}")
return w, b
if __name__ == "__main__":
x = np.array([1, 2, 3])
y_true = np.array([2, 4, 6])
lr = 0.01
epochs = 100000
w, b = regression_train(x, y_true, lr, epochs)
print(f"w: {w}, b: {b}")
七、训练结果分析
训练结果如下:
最终输出:
w ≈ 1.9996
b ≈ 0.0008
结果解读
理论最优解:
\[w = 2,\quad b = 0
\]
实际结果:
- w → 2(非常接近)
- b → 0(误差极小)
- loss → 0
为什么不是“完全等于”?
原因:
- 使用的是数值优化(梯度下降),不是解析解
- 学习率有限,不会一步到位
- 存在浮点数精度误差
本质上:已经收敛到最优解附近
八、关键经验总结
1. 初始化不敏感
w = 0
b = 0
对线性回归完全可行
2. 学习率决定收敛速度
- 太小 → 收敛慢
- 太大 → 发散
- 合适 → 快速稳定收敛
3. 损失函数是“碗状”的
线性回归的损失函数是凸函数:
- 一定存在唯一最优解
- 梯度下降一定能找到
九、从本质理解线性回归
你可以这样理解:
- 数据点:现实世界
- 模型:我们对世界的假设
- 损失函数:衡量假设好坏
- 梯度下降:不断修正认知
结语
线性回归看似简单,但它包含了机器学习最核心的思想:
模型 + 损失函数 + 优化方法
后续所有复杂模型,本质上都是在这个框架上的扩展。

浙公网安备 33010602011771号