线性模型
# 线性模型
线性模型的核心就 3 个关键词:变量、系数、一次关系,用 “多个变量分别乘上一个固定系数,再相加” 得到结果的模型,就是线性模型。
假设我们有几个 “输入变量”(比如 x₁、x₂,叫 “特征”),想要得到一个 “输出结果”(比如 y),线性模型的公式是:y = a₁x₁ + a₂x₂ + ... + aₙxₙ + b
- x₁、x₂:输入变量(比如 “学习时间”“做题数量”)
- a₁、a₂:系数(也叫 “权重”,是模型要找的 “固定数”,比如 a₁=2,就代表 x₁每变 1,y 就变 2)
- b:常数项(也叫 “截距”,可以理解为 “基础值”,比如就算 x₁、x₂都是 0,y 的基础值是 b)
- 关键要求:变量 x 只能是 “一次方”(不能是 x²、x³,也不能是 x₁*x₂这种相乘),系数 a 是固定的(不能随 x 变)。
假设外卖总价(y)由 3 部分决定:菜品价格(x₁)、配送费(x₂)、优惠券(x₃,注意是减钱,所以系数是负的)。实际公式:y = 1x₁ + 1x₂ + (-0.5)*x₃ + 0
- 系数 a₁=1:菜品 1 元,总价就加 1 元(菜品价格和总价是 1:1 的线性关系)
- 系数 a₂=1:配送费 1 元,总价就加 1 元
- 系数 a₃=-0.5:优惠券 1 元,总价就减 0.5 元(比如 5 元优惠券,就减 2.5 元)
- 常数项 b=0:没有额外固定费用(比如平台不收服务费)
这个 “算外卖总价” 的规则,就是一个标准的线性模型 —— 变量都是一次方,靠 “变量 × 系数 + 常数” 得到结果。
线性模型的核心属于是 “万能框架”,这个框架不规定 “y 是什么类型”,也不规定 “用这个框架做什么”,只规定 “计算方式是线性的”。可以用它算 “连续值”(比如外卖总价、考试分数);也可以用它做 “分类”(比如判断邮件是垃圾邮件还是正常邮件,y=0 代表正常,y=1 代表垃圾)—— 这就是线性模型的其他分支(比如逻辑回归,注意:逻辑回归是分类,不是回归!)。
# 线性回归
线性回归是 “线性模型框架” 的一个 “具体用法”,专门用来做一件事:预测连续的、能无限取值的结果(比如价格、分数、身高)。把线性模型的 “输出 y” 限定为 “连续值”,并且通过数据找到 “最优的系数 a₁、a₂... 和 b”,让预测的 y 和真实的 y 尽可能接近 —— 这就是线性回归。
| 日期 | 学习时间 x₁(小时) | 做题数量 x₂(道) | 真实考试分数 y(分) |
|---|---|---|---|
| 第 1 天 | 2 | 5 | 60 |
| 第 2 天 | 3 | 8 | 75 |
| 第 3 天 | 4 | 10 | 90 |
我们要找的公式是:y = a₁x₁ + a₂x₂ + b,现在不知道 a₁(学习时间的系数)、a₂(做题数量的系数)、b(基础分),线性回归的核心就是 “通过上面的数据,算出这 3 个值”。
先猜一组系数:a₁=10,a₂=3,b=25
- 第 1 天预测分:102 + 35 +25 = 20+15+25=60(和真实分 60 完全一致)
- 第 2 天预测分:103 +38 +25=30+24+25=79(和真实分 75 差 4 分)
- 第 3 天预测分:104 +310 +25=40+30+25=95(和真实分 90 差 5 分)
再调整系数:a₁=12,a₂=2,b=22
- 第 1 天:122 +25 +22=24+10+22=56(差 4 分,不如之前),后面自己算。
再调整:a₁=8,a₂=4,b=20
- 第 1 天:82 +45 +20=16+20+20=56(差 4 分),后面自己算。
再调整:a₁=10,a₂=2.5,b=27.5
- 第 1 天:102 +2.55 +27.5=20+12.5+27.5=60(准)
- 第 2 天:103 +2.58 +27.5=30+20+27.5=77.5(差 2.5 分,比之前好)
- 第 3 天:104 +2.510 +27.5=40+25+27.5=92.5(差 2.5 分,比之前好)
这个 “不断调整系数,让预测值和真实值差距最小” 的过程,就是线性回归的 “训练过程”。真实情况中,电脑会用 “最小二乘法”(不用手动算)直接找到最优系数,不用我们猜。假设电脑算出最优系数:a₁=10,a₂=2.5,b=27.5,最终公式:y = 10x₁ + 2.5x₂ + 27.5,含义:每天多学 1 小时,分数加 10 分;每天多做 1 道题,分数加 2.5 分;就算不学(x₁=0)、不做题(x₂=0),基础分是 27.5 分。
比如你第 4 天学习 3.5 小时,做题 9 道,我们预测分数就是:103.5 + 2.59 +27.5 = 35 +22.5 +27.5 = 85 分 —— 这就是线性回归的用途。
# 损失函数
如上面我们进行线性回归的案例中,自己调整系数算出来的结果称为预测值 (y'),真实考试分数称之为实际值 (y),而 y-y' 就是计算出的误差。
但不能直接用 “单个 y-y'” ,损失函数要衡量 “整个模型的好坏”,不是 “某一个数据的好坏”。比如考试分数案例,第 1 天误差是 0(y-y'=60-60=0),第 2 天误差是 - 4(75-79=-4),第 3 天误差是 - 5(90-95=-5)。只看单个误差(比如第 1 天的 0),没法判断模型整体准不准 —— 总不能因为一天猜得对,就说模型好。
也不能用直接把样本里的数据 sum (y-y'),因为误差有正有负,会相互抵消,导致 “和为 0” 但模型其实不准。比如 3 个数据的误差分别是 + 5、-3、-2,和为 0,但每个误差都存在,模型明显不准 —— 如果用 “和” 当损失,会误以为模型完美,这就错了。
线性回归中,损失函数的核心是 “让所有误差的‘总影响’最小”,常用两种处理方式,都是基于 “y-y'”,但比 “sum (y-y')” 更合理:
- 均方误差 (MSE),这是线性回归默认用的损失函数(MSE)= [(y₁-y₁')² + (y₂-y₂')² + ... + (yₙ-yₙ')² ] ÷ n(n 是数据个数),目的消除正负号(平方后都是正数,不会抵消)
- 残差和 (SSR),如果觉得平方太复杂,也可以用 “绝对值” 处理,损失函数(SSR)= |y₁-y₁'| + |y₂-y₂'| + ... + |yₙ-yₙ'|,目的只消除正负号,不放大误差
那么在线性回归中,损失函数的公式一般为:
- 消除正负抵消:误差有正有负(比如预测高了是负误差,预测低了是正误差),平方后都变成正数,加起来不会相互抵消(比如 -4 和 +4 的误差,平方后都是 16,不会像直接相加那样等于 0);
- 惩罚大误差:平方会放大 “大误差” 的影响(比如误差 10 的平方是 100,误差 1 的平方是 1),符合我们的需求 —— 模型更应该避免 “猜得太离谱”;
- 数学上容易计算:平方函数是 “光滑的”,方便用数学方法(比如梯度下降)找到最小值(即最优的系数 a 和 b)。
# 偏导
求偏导是为了快速找到让损失函数最小的 “最优系数”(a₁、a₂、b),不用盲目试错,效率直接拉满。上述考试分数预测中用 “凑数法” 试系数是为了好理解,但实际中完全行不通,如果有 10 个特征(比如 x₁到 x₁₀),就有 11 个要找的参数(10 个 a+1 个 b),每个参数的可能值有无数个(比如 a₁可以是 10.1、10.01、9.99...)。
线性回归的核心目标是 “让损失函数(比如 MSE)最小”—— 损失最小,说明模型预测最准。损失函数 MSE 的公式是
- 对 a₁求偏导
:当 a₁稍微变一点时,损失 L 会怎么变 - 对 a₂求偏导
:当 a₂稍微变一点时,损失 L 会怎么变 - 对 b 求偏导
:当 b 稍微变一点时,损失 L 会怎么变。
比如:
- 如果
(正数):说明 a₁再变大,L 会跟着变大,所以要减小 a₁才能让 L 下降 - 如果
(负数):说明 a₂再变大,L 会跟着变小,所以要增大 a₂才能让 L 下降
线性回归训练的核心方法是 “梯度下降”,而偏导是梯度下降的 “指南针”,步骤超简单:
- 先随便给一组初始参数(比如 a₁=0、a₂=0、b=0),算出此时的损失 L
- 对每个参数(a₁、a₂、b)求偏导,得到各自的 “变化率”
- 按照 “偏导的反方向” 调整参数(比如偏导为正,就减小参数;偏导为负,就增大参数),调整幅度由 “学习率” 控制(比如每次调 0.01,避免步子太大踩空)
- 重复步骤 2-3,直到所有偏导都接近 0(或者 L 不再明显变小),此时的参数就是最优解
求偏导的核心规则:
- 对单个变量求偏导时,其他变量都当常数
- 常数的导数是 0
- 链式法则:复合函数求导 = 外层导数 × 内层导数(比如对 (ax+b)² 求导,先对外层 u² 求导得 2u,再对内层 u=ax+b 求导得 a,最终结果是 2a (ax+b))
# 多元化
多元化就是把一个线性模型,用多个特征(比如 x₁、x₂、x₃...)进行 “组合”,变成一个多特征模型。比如:
多元简化公式:
# 多元化的损失函数
对于模型来说,完整的损失函数是:
拆解某一个数据的损失函数:
# 多元求偏导
- 如果一项里没有 w ,对 w 求偏导结果为 0
- 如果是一次项
对 w 求偏导结果为 a - 如果是二次项
对 w 求偏导结果为 2Aw
对以上公式逐项拆解:
,这里没有 w,所有根据规则,偏导是 0; ,把 看成一个整体向量 a,那么这项可以写成 ,根据规则,对 w 求偏导结果是 ; ,把 看成一个整体向量 b,这项可以写成 ,根据规则,对 w 求偏导结果是 ; ,把 堪称矩阵 A,这项是 ,根据规则,对 w 求偏导结果是 ; - 把所有偏导结果 “加起来”,
,又因为 是一个行向量, 是一个列向量,在偏导的汇总中,为了让两项的形式一致(都是列向量),会把 转置成 ,这样就和 形式统一了,方便后续的合并计算。
最终公式演变为:
按照线性回归找最小值,就是求 w 的偏导结果等于 0,即:
为什么说是一个行向量:
- Y 是真实值向量,维度是 n×1(n 是样本数量,1 是列数,即每个样本有 1 个真实标签)
- X 是特征矩阵,维度是 n×d ( d 是特征数量,即每个样本有 d 个特征)
- 矩阵乘法的维度规则是 “前矩阵列数 = 后矩阵行数”,结果的维度是 “前矩阵行数 × 后矩阵列数”,所以
代表 1 行 d 列,所以是个行向量
# 其他公式
# 完全平方和公式
乘法分配律,把第一个括号里的每一项分别和第二个括号里的每一项相乘
# 求导法则
基本初等函数(幂函数、指数函数、对数函数、三角函数、反三角函数)的导数是求导的 “基础模块”,需熟记,可结合上述法则推导。
| 函数类型 | 函数表达式 | 导数 | 备注(定义域限制) |
|---|---|---|---|
| 幂函数 | 若 | ||
| 指数函数 | 特殊: | ||
| 对数函数 | 特殊: | ||
| 正弦函数 | 定义域:$ \mathbb {R}$ | ||
| 余弦函数 | 定义域:$ \mathbb {R}$ | ||
| 正切函数 | 定义域: | ||
| 余切函数 | 定义域: | ||
| 反正弦函数 | 定义域: | ||
| 反余弦函数 | 定义域: | ||
| 反正切函数 | 定义域: |
# 常数
常数就是固定不变的数,不会随着其他变量(比如 x)的变化而改变。为什么常数的导数是 0?导数的本质是表示函数的变化率(比如一条线的斜率)。
- 如果你把常数看作一个函数,比如 f (x)=5,它的图像是一条水平的直线(不管 x 取什么值,y 永远是 5)。
- 水平直线的斜率是 0(因为它不上升也不下降),所以它的变化率就是 0。
你口袋里永远有 5 块钱(常数),不管过了多少天(x 变化),钱的数量都没变,变化率就是 0,这就是 “常数的导数是 0” 的意思。
# 链式法则
链式法则就是就是对复合函数的拆解 ,“从外到内,层层求导再相乘”,把复杂的复合函数拆成简单的层,分别求导后相乘就可以。
首先,复合函数就是 “函数套函数”,比如
- 先求外层函数对 u 的导数:对于
,根据幂函数求导规则 ( 的导数是 ),它的导数是 2u。 - 再求内层函数对 x 的导数:对于
,ax 包要求导的 x,所以 b 就可以看为常数,常数求导为 0,此时公式为 ,x 为变量,固定的变量都是随 a 变化,所以 ax 的导数是 a。 - 最后把两者相乘:
,再把 代回去,就得到 。