☰
线性回归:Web开发者走入AI开发的第一课
2026/9/27 9:52:33 网站建设 项目流程

如果你写过几年 Web 项目,最近开始关注 AI 开发,大概率会有一种共同的感觉:网上关于 AI 的内容,要么一头扎进数学公式,看到矩阵和偏导数就想退出;要么直接教调用大模型 API,几行代码跑通,但关掉编辑器之后,你依然不知道“模型”到底是怎么工作的。

我给你的建议是:别急着啃深度学习,先把线性回归学透。

这个算法简单到可以用 Excel 实现,但它的价值恰恰在于——它是机器学习项目的最小完整闭环。数据准备、模型训练、效果评估、预测推断,所有环节它都有,而且你完全能亲手把每个环节拆开看。这比“一行代码出结果”的黑盒方案,能给你更扎实的 AI 开发基础。

这篇文章会用 Web 开发者熟悉的视角,把线性回归的原理和实现完整讲一遍。读完你能做到三件事:看懂一个机器学习项目的基本流程;用 Python 从零实现线性回归;用 scikit-learn 完成工程化的训练、评估与预测。

1. 为什么线性回归是 Web 开发者进入 AI 开发的第一课

1.1 Web 开发与 AI 开发,差在哪里

做过 Web 开发的人都知道,一个典型后端接口的写法大致是:接收请求参数,查库,套业务规则,返回结果。你写的每一行判断逻辑,都是你大脑里规则的编码。而 AI 开发做的事情换了一个思路:你把一堆“输入 + 正确答案”扔给算法,让它自己找规律,生成一个可以预测的模型。

打个比方。Web 开发像你手写一份菜谱,每个步骤都是人工确定的;机器学习则是你喂给系统大量数据和结果,让它自己总结出“什么因素会导致什么结果”。

所以,从 Web 开发转 AI 开发,第一个要转变的思维方式就是:从“写规则”到“学规律”。

1.2 线性回归是“最小可运行模型”

线性回归的数学模型就是一条直线:y = w0 + w1 * x。w0 是截距,w1 是权重,模型要做的事就是从数据里学出合适的 w0 和 w1。

不要因为公式简单就低估它。它包含机器学习项目的全部核心问题:

  • 数据怎么准备,特征怎么表示;
  • 怎么定义“预测得准”——这需要损失函数;
  • 怎么自动调整参数——这需要优化算法;
  • 怎么知道模型有没有泛化能力——这需要评估方法。

这些问题在神经网络、大模型预训练里同样存在。你把线性回归吃透,后面再学逻辑回归、决策树、神经网络,会发现很多概念都是老朋友。

对 Web 开发者来说,线性回归还有一个额外优势:它的每一步都可以直观可视化。训练过程就是一根直线慢慢靠近数据点的过程,你亲眼看到它,就理解了机器学习。

要补充的是,现在的 AI 应用开发,大量工作是把大模型能力和具体业务场景结合,本质上是在做“业务编排 + 模型调用”。如果你完全不懂底层模型,就不知道模型在什么情况下会失败,出了问题也只能盲目调提示词。线性回归训练出来的这套“定义指标、拆分数据、训练、评估”的方法论,在调用大模型时同样成立。

2. 线性回归的核心概念与数学原理

2.1 特征、标签和样本

用 Web 开发者最熟悉的方式理解这几个概念:

  • 样本(sample):一条数据记录,类似数据库里的一行记录,或者一次 API 请求。
  • 特征(feature):输入变量,类似接口入参。在一元线性回归里只有一个特征。
  • 标签(label):要预测的目标值,类似接口返回的 result 字段。

举个例子:要预测“学习时长 → 考试成绩”,学习时长是特征,考试成绩是标签,一条条学生的记录就是样本。

2.2 假设函数

一元线性回归的假设函数是:

y_pred = w0 + w1 * x
  • w0 是截距(intercept),表示 x 为 0 时的预测值;
  • w1 是斜率(coefficient),表示 x 每增加 1 个单位,预测值变化多少。

如果特征不止一个,就变成多元线性回归:

y_pred = w0 + w1 * x1 + w2 * x2 + ...

模型训练的目标,就是找到一组 w0、w1,让预测值 y_pred 尽量接近真实标签 y。

2.3 损失函数:用 MSE 量化“错多少”

怎么衡量“接近”?最常用的是均方误差(MSE,Mean Squared Error):

MSE = (1 / n) * Σ(y_i - y_pred_i)²

其中 n 是样本数,y_i 是真实标签,y_pred_i 是预测值。

为什么用平方而不直接用差值?有两个原因:

  • 避免正负误差相互抵消。如果直接用 y_pred - y,正误差和负误差加起来可能为 0,掩盖真实误差;
  • 放大较大误差,让模型更关注偏离严重的样本。差 10 分和差 1 分,平方后是 100 和 1,代价差距很明显。

MSE 越小,说明模型预测越准。

2.4 求解参数的两条路线

有了损失函数,下一步是找一组让损失最小的参数。常见两条路线:

  • 正规方程(最小二乘法):直接算解析解。公式为:w = (XᵀX)⁻¹Xᵀy。适合特征少、数据量小的场景。
  • 梯度下降:从任意初始参数出发,计算损失函数对每个参数的梯度,沿着梯度反方向更新参数。适合数据量大、特征多的场景,也是神经网络训练的基础。

梯度下降的参数更新公式是:

w = w - learning_rate * gradient

learning_rate 是学习率,控制每次走多大步。它类似 Web 开发里的“提交粒度”:步子太大容易跳过最优解,步子太小训练太慢。

为了帮你快速建立概念映射,下面这个表可以收藏:

概念Web 开发类比机器学习定义
样本数据库中的一行记录一条特征与标签的组合
特征接口入参,Query 参数输入变量 x
标签接口返回值 result目标值 y
损失函数线上错误率、报错率预测值与真实值的偏差程度
模型训练编写并调试业务逻辑学习参数 w0、w1
模型评估测试环境验收、灰度验证在测试集上验证模型效果

3. 环境准备与开发工具链

做机器学习实验,最常用的开发环境是 Python + Jupyter Notebook。你也可以直接在 VS Code 里用 Python 文件运行,本文的代码两种方式都支持。

建议使用 Python 3.9 以上版本,具体版本以你本机环境为准。建议先创建虚拟环境,避免污染全局环境:

python -m venv .venv source .venv/bin/activate # Windows 下使用 .venv\Scripts\activate

然后安装四个基础库:

pip install numpy scikit-learn matplotlib jupyter

安装完成后,验证一下环境:

python -c "import numpy, sklearn, matplotlib; print('环境OK')"

各库的作用:

库用途
numpy数值计算,处理矩阵和向量
scikit-learn机器学习算法库,线性回归模型在这里
matplotlib绘图,可视化数据和模型
jupyter交互式 Notebook,方便边写边看结果

如果后面画图时中文乱码,需要再设置 matplotlib 中文字体,第 6 章会给出配置代码。

4. 从零实现线性回归

这一章先不引入现成的机器学习库,只用 numpy 手写核心逻辑。目的是拆开模型训练的黑盒,让你看清每一步发生了什么。

4.1 准备一份简单演示数据

先造一份“学习时长 → 考试成绩”的演示数据:特征 x 从 1 到 8,标签 y 整体呈线性增长,带一点波动。

import numpy as np # 特征:学习时长(小时) X = np.array([1, 2, 3, 4, 5, 6, 7, 8], dtype=float).reshape(-1, 1) # 标签:考试成绩(0-100) y = np.array([50, 55, 58, 65, 70, 75, 78, 85], dtype=float) print(X.shape, y.shape)

输出结果是(8, 1)和(8,)。X 是二维列向量,y 是一维数组。这是 scikit-learn 标准输入要求:特征是二维矩阵,标签是一维数组。这个习惯要尽早养成。

4.2 用正规方程直接求解

为了能同时算出截距 w0,需要在 X 左边拼接一列 1:

# 在 X 左侧拼接一列 1,对应截距项 w0 X_b = np.c_[np.ones((X.shape[0], 1)), X] # 正规方程:w = (X^T X)^(-1) X^T y w = np.linalg.inv(X_b.T @ X_b) @ X_b.T @ y print("截距 w0:", w[0]) print("斜率 w1:", w[1])

这段代码的要点:

  • 第一列全 1 的含义是:当 x = 0 时,预测值 y_pred = w0,正好对应截距。
  • np.c_是按列拼接矩阵。
  • @是矩阵乘法运算符。
  • np.linalg.inv是求矩阵的逆。

运行这段代码会得到类似 w0 ≈ 44.7、w1 ≈ 4.95 的结果。也就是说,最佳拟合线大约是:

y = 44.7 + 4.95 * x

用业务语言翻译:每多学一小时,成绩大约提高 5 分。

4.3 用梯度下降模拟“学习”过程

正规方程一步出结果,但数据量大了之后,矩阵求逆会变得非常慢。梯度下降是更通用、也更接近神经网络训练方式的优化方法。

import numpy as np X = np.array([1, 2, 3, 4, 5, 6, 7, 8], dtype=float).reshape(-1, 1) y = np.array([50, 55, 58, 65, 70, 75, 78, 85], dtype=float).reshape(-1, 1) X_b = np.c_[np.ones((X.shape[0], 1)), X] w = np.zeros((2, 1)) learning_rate = 0.001 n_iterations = 5000 m = len(X_b) for _ in range(n_iterations): y_pred = X_b @ w error = y_pred - y gradient = (2 / m) * (X_b.T @ error) w -= learning_rate * gradient print("截距 w0:", w[0][0]) print("斜率 w1:", w[1][0])

每一步在做什么:

  1. y_pred = X_b @ w:用当前参数做一次预测;
  2. error = y_pred - y:计算预测值和真实值的差距;
  3. gradient = (2 / m) * (X_b.T @ error):计算损失函数对 w0 和 w1 的梯度;
  4. w -= learning_rate * gradient:参数往损失减小的方向走一小步。

运行输出和正规方程的结果应该非常接近。这意味着,两种方法都在做同一件事:找到损失函数的最小值点。

这里有一个新手很容易踩的坑:y 必须 reshape 成列向量(8,1),才能和X_b @ w的结果直接相减。如果发现矩阵乘法报维度错误,第一反应就是打印各数组的 shape。

4.4 两种解法怎么选

对比项正规方程梯度下降
计算方式矩阵求逆,一次性求解析解多次迭代逼近最优解
数据量大计算慢,内存占用高按批次取数据,适用性好
特征多不适合,求逆代价高相对推荐
理解难度数学上直接,代码简单需要理解导数和学习率
神经网络不适用是基础训练方法

结论很简单:小数据、少特征,用正规方程方便;大规模数据和复杂模型,梯度下降才是通用方案。

5. 使用 scikit-learn 实现线性回归

从零实现是为了让你看懂原理。工程里直接手写就不合理了。scikit-learn 提供封装好的线性回归模型,几行代码就能完成训练和预测。

5.1 构建数据并划分训练集、测试集

为了更好演示训练和测试划分,这次用 10 个样本:

import numpy as np from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score # 准备数据 X = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], dtype=float).reshape(-1,

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询