【AI转行02】多元线性回归:从相亲打分表到预测房价(含代码实战)
别被这个学术名词吓到了。我们把它拆开来看,其实就是小学数学。别把矩阵想得太复杂,它本质上就是一个Excel 表格。标量 (Scalar):一个单独的数字。比如x = 100。向量 (Vector):一排数字。比如(一套房子的三个特征)。矩阵 (Matrix):多行多列的数字。比如你有 1 万套房子,把它们的数据堆在一起,就是一个大矩阵。例子X100580212010←第1套房:100平,距地铁5k
写在前面:
上一篇我们搞懂了 AI 的基本概念,今天我们来啃第一个真正的数学模型。
别怕,我不堆公式,咱们用“相亲”的例子来聊聊什么是回归。
💡 上章习题揭秘
1. 那个分袜子的例子
- 场景 A(分袜子):这是无监督学习(聚类)。因为你没告诉 AI 哪双是“红袜子”,它只是把相似的凑一对。
- 场景 B(垃圾邮件):这是有监督学习。因为你明确给了标签(“是”或“不是”)。
2. 为什么大模型会胡说八道?
- 因为它不是在查数据库,而是在猜下一个字。
- 如果你问它一个也没见过的故事,它会根据概率瞎编一个通顺的句子,而不是告诉你“我不知道”。这就是幻觉的本质。
给初学者的定心丸:
这一章我们只做一个数学题:算房价。
但我们会从最简单的初中数学,一路推导到大模型底层的矩阵运算。掌握了这一章,你就懂了 AI 预测万物的基本逻辑。
1. 到底什么是“多元线性回归”?
别被这个学术名词吓到了。我们把它拆开来看,其实就是小学数学。
1.1 拆解名字
- 回归 (Regression):意思是预测一个具体的数字。
- 比如:预测房价是 500 万,还是 505 万?(如果是预测“是/否”,那叫分类)。
- 线性 (Linear):意思是**“简单的加减法”**。
- 我们假设每个因素的影响都是独立的,直接加起来就行。没有奇奇怪怪的平方、开根号。
- 多元 (Multivariate):意思是**“参考多个线索”**。
- 世界太复杂了,光看一个因素(比如面积)肯定预测不准,还得看地段、房龄、楼层等等。
1.2 通俗比喻:相亲打分表
想象你手里有一张相亲打分表,用来预测你对一个人的满意度(yyy)。
你心里有一杆秤(模型):
- 线索 A (x1x_1x1):颜值。你是个颜控,觉得这很重要,权重 (w1w_1w1) 设为 10分。
- 线索 B (x2x_2x2):存款。你觉得钱够用就行,权重 (w2w_2w2) 设为 2分。
- 线索 C (x3x_3x3):脾气。你讨厌脾气差的,权重 (w3w_3w3) 设为 -50分(严重扣分项)。
- 基础分 (bbb):只要是个人,起步分就是 60分。
当遇到一个相亲对象时,你的大脑就在做“多元线性回归”:
满意度=(10×颜值)+(2×存款)+(−50×脾气)+60满意度 = (10 \times 颜值) + (2 \times 存款) + (-50 \times 脾气) + 60满意度=(10×颜值)+(2×存款)+(−50×脾气)+60
- 训练模型:就是你谈了 10 次恋爱后,总结出“原来我最看重颜值,不太看重钱”的过程(调整 www 的大小)。
- 预测:就是你拿着这套标准,去评估下一个新认识的人。
1.3 从“一元”到“多元”的数学表达
回到房价预测的例子:
- 一元(只看面积):
- 公式:y=w⋅x+by = w \cdot x + by=w⋅x+b
- 图形:一条直线。
- 多元(看面积、距离、房龄…):
- 公式:y=w1x1+w2x2+w3x3+...+by = w_1x_1 + w_2x_2 + w_3x_3 + ... + by=w1x1+w2x2+w3x3+...+b
- 图形:一个平面(2个特征)或超平面(更多特征)。

图解:
- 左图 (一元):只有一个变量(面积),模型是一条线。
- 右图 (多元):有两个变量(面积+距离),模型变成了一张纸(平面)。
- 虽然维度变了,但道理是一样的:找一个最合适的平面,去拟合所有的数据点。
2. 深度拆解:机器是怎么“思考”的?
这一节我们手动模拟 AI 的大脑,看它是如何修正错误的。
2.1 初始化(瞎猜)
机器一开始脑子一片空白,它随机初始化了一组权重:
- w1w_1w1 (面积权重) = 1.0
- w2w_2w2 (地铁权重) = 1.0
- bbb (基础价) = 0
2.2 第一轮预测(Forward Pass)
来了一套真房源:面积 100平,距离 5km,真实卖了 300万。
机器开始算:
预测价=1.0×100+1.0×5+0=105万预测价 = 1.0 \times 100 + 1.0 \times 5 + 0 = 105万预测价=1.0×100+1.0×5+0=105万
2.3 计算误差(Loss)
误差=真实值−预测值=300−105=195万误差 = 真实值 - 预测值 = 300 - 105 = 195万误差=真实值−预测值=300−105=195万
机器发现:少算了太多了!
2.4 归因与修正(Backward Pass)
机器开始反思:为什么算少了?
- 是因为 w1w_1w1 (面积) 太小了吗?还是 w2w_2w2 (距离) 太小了?
- 特征越大,责任越大:面积是 100,距离是 5。面积这个特征数值很大,所以如果稍微把 w1w_1w1 调大一点点,预测结果就会涨很多。
- 修正策略:大幅调大 w1w_1w1,小幅调大 w2w_2w2。
- 新 w1w_1w1 = 2.5
- 新 w2w_2w2 = 1.2
- 再次预测:2.5×100+1.2×5=256万2.5 \times 100 + 1.2 \times 5 = 256万2.5×100+1.2×5=256万。
- 你看!误差从 195万 缩小到了 44万。
这就是梯度下降的直观过程(下一章细讲数学原理)。
3. 工程师的进阶视角:矩阵运算 (Matrix Multiplication)
这是大模型工程师必须理解的深度内容。
很多教程直接甩公式,我们这里先慢下来,搞清楚什么是矩阵。
3.1 什么是矩阵?(What is a Matrix?)
别把矩阵想得太复杂,它本质上就是一个Excel 表格。
- 标量 (Scalar):一个单独的数字。比如
x = 100。 - 向量 (Vector):一排数字。比如
[100, 5, 20](一套房子的三个特征)。 - 矩阵 (Matrix):多行多列的数字。比如你有 1 万套房子,把它们的数据堆在一起,就是一个大矩阵。
例子:
X=[100580212010]←第1套房:100平,距地铁5km←第2套房:80平,距地铁2km←第3套房:120平,距地铁10km X = \begin{bmatrix} 100 & 5 \\ 80 & 2 \\ 120 & 10 \end{bmatrix} \quad \begin{matrix} \leftarrow \text{第1套房:100平,距地铁5km} \\ \leftarrow \text{第2套房:80平,距地铁2km} \\ \leftarrow \text{第3套房:120平,距地铁10km} \end{matrix} X=
100801205210
←第1套房:100平,距地铁5km←第2套房:80平,距地铁2km←第3套房:120平,距地铁10km
- 行 (Row):代表样本(每套房子)。
- 列 (Column):代表特征(面积、距离)。
- 为什么要这么排? 因为这样最整齐,计算机读起来最舒服。
3.2 为什么需要矩阵运算?
【深度解惑:物理结构决定命运】
你可能会问:“为什么不把 CPU 也设计成有 1000 个核,让它也能并行?”
答案是:地皮不够用了。

我们来看看芯片内部的装修图(如上图):
-
CPU (包工头) —— 复杂的脑子
- 装修策略:CPU 必须聪明。因为通过它运行的程序非常复杂(比如操作系统、浏览器),经常有
if-else跳转。 - Control (指挥部):占据了巨大的面积。为了预测下一步该干嘛(分支预测),防止流水线停顿。
- Cache (大缓存):占据了巨大的面积。为了让数据存取极快,不让 CPU 等内存。
- ALU (干活的手):最后留给计算单元(ALU)的地方,只剩下一点点了(通常只有 4-64 个核)。
- 结论:CPU 的晶体管都用来**“动脑子”**了,没地方长手了。所以它只能串行,或者低并发。
- 装修策略:CPU 必须聪明。因为通过它运行的程序非常复杂(比如操作系统、浏览器),经常有
-
GPU (搬砖队) —— 简单的肌肉
- 装修策略:GPU 假设你要做的计算是**“傻瓜式重复”**的(比如矩阵乘法,每一行都是 y=wx+by=wx+by=wx+b)。
- Control/Cache:砍掉!砍掉!既然不需要复杂的逻辑判断,就不需要聪明的指挥部。
- ALU (干活的手):腾出来的面积,全部塞满计算单元!一张显卡里可以有 几千甚至上万个 微小的核心。
- 结论:GPU 牺牲了“脑子”,换来了成千上万只“手”。
终极答案:
- CPU 只能串行(或少并行),是因为它为了通用性和逻辑处理,不得不把芯片面积让给控制单元。
- GPU 可以大规模并行,是因为它专为重复计算设计,把芯片面积全让给了计算单元。
3.3 公式变换
我们来看一下矩阵乘法到底是怎么“并行”的:

- 人类视角(For循环):
- 先算第 1 个房子的价格:100×2.5+5×(−1)=245100 \times 2.5 + 5 \times (-1) = 245100×2.5+5×(−1)=245
- 再算第 2 个房子的价格:80×2.5+2×(−1)=19880 \times 2.5 + 2 \times (-1) = 19880×2.5+2×(−1)=198
- … 循环 1 万次。
- 矩阵视角(一次性):
- 把所有房子数据堆在一起(矩阵 XXX)。
- 把权重放旁边(矩阵 WWW)。
- GPU 一声令下:第 1 个核心算第 1 行,第 2 个核心算第 2 行…
- 瞬间出结果:所有预测值(矩阵 YYY)同时蹦出来。
这就是为什么大模型(LLM)必须用 GPU 跑。ChatGPT 每生成一个字,都要做几千亿次这种运算,用 CPU 跑可能一个字要憋一小时。
Y=X⋅W+BY = X \cdot W + BY=X⋅W+B
- XXX (Input Matrix):[10000行, 3列] 的矩阵(1万套房,3个特征)。
- WWW (Weight Matrix):[3行, 1列] 的向量(3个权重)。
- YYY (Output Matrix):[10000行, 1列] 的结果(1万个预测房价)。
大模型本质:
ChatGPT 的一次推理,其实就是拿着你的输入 XXX,和模型里几千亿个 WWW 进行了一次超级复杂的矩阵乘法。
所以,买显卡就是为了算矩阵乘法!
4. 多元线性回归的潜在陷阱(避坑指南)
做算法工程师,最怕的不是模型跑不通,而是模型跑通了,但结果是错的。以下是两个最经典的“隐形杀手”。
4.1 陷阱一:特征量纲不一致 (Feature Scaling)
【案例:谁是老大?】
假设你要预测一个人的健康分。
- 特征 A:身高(单位:米)。范围 1.5 ~ 2.0。
- 特征 B:白细胞数量(单位:个)。范围 4000 ~ 10000。
后果:
- 在机器眼里,数字越大越牛。
- 白细胞一波动就是几千,身高一波动才 0.1。
- 机器会觉得:“哇,这个白细胞太重要了,它的变化对结果影响巨大!”
- 结局:模型会拼命去拟合白细胞,完全忽略身高的影响。哪怕身高其实更重要,也没人理它。
【解决办法】
归一化 (Normalization):大家统统把衣服脱了,把数值都压缩到 0 到 1 之间。
- 身高 1.8米 -> 0.6
- 白细胞 7000 -> 0.5
- 这样大家就在同一起跑线了。
4.2 陷阱二:多重共线性 (Multicollinearity)
【案例:左右脚打架】
假设你预测走路速度。
- 特征 A:左脚迈出的步数。
- 特征 B:右脚迈出的步数。
问题:
- 正常人走路,左脚迈一步,右脚肯定也迈一步。这俩数据是**完全同步(强相关)**的。
- 模型懵了:
- 模型:“我发现步数越多速度越快。但是……到底是左脚的功劳,还是右脚的功劳?”
- 方案 1:给左脚权重 1.0,右脚 0。
- 方案 2:给左脚 0.5,右脚 0.5。
- 方案 3:给左脚 100,右脚 -99(这也能凑出结果!)。
- 后果:
- 权重乱跳:数据稍微变一点点,模型参数就剧烈波动。
- 解释性差:你根本不知道哪个特征是真的重要。
【解决办法】
- 删特征:两个特征太像了?删掉一个,留一个就行。
- 正则化 (L2 Regularization):这是后面的大招。强迫模型“雨露均沾”,不让某个参数变得特别离谱。
5. 动手写代码 (Code Time)
光说不练假把式。作为工程师,我们需要把上面的数学公式翻译成 Python 代码。
5.1 用 Numpy 手搓一个预测器
我们来模拟一下显卡里的矩阵运算。
import numpy as np
# 1. 准备数据 (矩阵 X)
# 3套房子,每套有2个特征:[面积, 距离]
X = np.array([
[100, 5], # 第1套
[80, 2], # 第2套
[120, 10] # 第3套
])
# 2. 准备权重 (向量 w) 和 偏置 (b)
# 假设我们已经训练好了参数
w = np.array([
[2.5], # 面积的权重
[-1.0] # 距离的权重
])
b = 10 # 基础价格
# 3. 矩阵运算 (GPU 就在做这一行代码)
# y = Xw + b
# np.dot 是矩阵乘法
y_pred = np.dot(X, w) + b
print(y_pred)
# 输出结果(瞬间算出3套房价):
# [[255.]
# [208.]
# [300.]]
5.2 用 PyTorch (大模型主流框架)
在大模型开发中,我们通常用 PyTorch。写法几乎一模一样,但它可以自动用 GPU 跑。
import torch
# 1. 定义线性层 (Linear Layer)
# 输入特征 2个 (面积, 距离),输出特征 1个 (房价)
model = torch.nn.Linear(in_features=2, out_features=1)
# 2. 塞入数据
X = torch.tensor([[100.0, 5.0], [80.0, 2.0]])
# 3. 前向传播 (Forward Pass)
y_pred = model(X)
总结:
你看,所谓的“多元线性回归”,在代码里就是一行 torch.nn.Linear。
大模型(Transformer)里有成千上万个这样的 Linear 层,它们一层套一层,就变成了能听懂人话的 AI。
6. 🧠 脑洞时间:课后思考与练习
练习题 1:当一回 AI(升级版)
假设我们要预测相亲成功率。
- 特征:x1x_1x1=颜值(1-10分), x2x_2x2=年薪(万), x3x_3x3=犯罪记录(0或1)。
- 模型:y=10x1+1x2−1000x3y = 10x_1 + 1x_2 - 1000x_3y=10x1+1x2−1000x3
- 案例:
- 高富帅:颜值9,年薪100,无犯罪(0)。得分 = 90 + 100 - 0 = 190 (成)
- 逃犯:颜值9,年薪100,有犯罪(1)。得分 = 90 + 100 - 1000 = -810 (不成)
- 思考:线性回归能做到“一票否决”吗?
- 答案:可以,只要给那个特征一个巨大的负权重(比如 -10000)。但如果逻辑是“只有当年薪>50且颜值>8时才行”,这种组合逻辑(AND关系),线性回归就很难做到了。这需要神经网络。
练习题 2:拟合直线
拿一张纸,随便画三个点(不共线)。
试着画一条直线,让这条线尽量靠近这三个点。
- 思考:除了这三个点,直线外的区域是什么?
- 是模型的泛化 (Generalization)。模型通过这三个点学会了规律,就可以预测任何其他点的位置。
👉 下一章预告:梯度下降法
刚才我们在 2.4 节里手动调了一下权重,觉得挺简单?
但如果有 1000 亿个参数,靠人脑怎么调?
下一章,我们将介绍 AI 自动调参的唯一真神——梯度下降。
更多推荐



所有评论(0)