技术博客 技术博客
  • JAVA编程
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
GitHub (opens new window)
  • JAVA编程
  • 设计模式
  • 人工智能
  • Spring
  • Mybatis
  • Maven
  • Git
  • Kafka
  • RabbitMQ
  • RocketMQ
  • Redis
  • Zookeeper
  • Nginx
  • 数据库套件
  • MySQL
  • Elasticsearch
  • MongoDB
  • Hadoop
  • ClickHouse
  • Hbase
  • Hive
  • Flink
  • Flume
  • SQLite
  • linux
  • Docker
  • Jenkins
  • Kubernetes
  • 工具
  • 前端
GitHub (opens new window)
  • JAVA编程

    • 基础

      • JAVA 锁 及 线程
      • JAVA NIO API
      • JVM 模块介绍
    • 版本

      • JAVA8 新特性总结
      • JAVA9 新特性总结
      • JAVA 10/11/12/13/14/15/16/17 新特性总结
    • 其他

      • jar 打包成.exe可执行文件
      • java代码混淆之 ProGuard
      • JAVA 性能监控(jvisualvm)及测试(JMeter)
      • Alibaba Arthas
      • jar启动脚本
  • 设计模式

    • 代理模式
  • 人工智能

    • 基础算法

      • 线性模型
        • 线性模型
        • 线性回归
        • 损失函数
        • 偏导
        • 多元化
          • 多元化的损失函数
          • 多元求偏导
        • 其他公式
          • 完全平方和公式
          • 求导法则
          • 常数
          • 链式法则
      • 感知机
    • 框架与工具

      • ollama本地部署
      • Spring AI
目录

线性模型

# 线性模型

线性模型的核心就 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ₙ'|,目的只消除正负号,不放大误差

那么在线性回归中,损失函数的公式一般为:,为什么线性回归偏爱 MSE?

  • 消除正负抵消:误差有正有负(比如预测高了是负误差,预测低了是正误差),平方后都变成正数,加起来不会相互抵消(比如 -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 的公式是 ,而,把 y' 代入损失函数后,你会发现,损失 L 其实是 “系数 a₁、a₂、b” 的函数 ——a₁、a₂、b 变了,L 就会跟着变。

  • 对 a₁求偏导:当 a₁稍微变一点时,损失 L 会怎么变
  • 对 a₂求偏导:当 a₂稍微变一点时,损失 L 会怎么变
  • 对 b 求偏导:当 b 稍微变一点时,损失 L 会怎么变。

比如:

  • 如果(正数):说明 a₁再变大,L 会跟着变大,所以要减小 a₁才能让 L 下降
  • 如果(负数):说明 a₂再变大,L 会跟着变小,所以要增大 a₂才能让 L 下降

线性回归训练的核心方法是 “梯度下降”,而偏导是梯度下降的 “指南针”,步骤超简单:

  1. 先随便给一组初始参数(比如 a₁=0、a₂=0、b=0),算出此时的损失 L
  2. 对每个参数(a₁、a₂、b)求偏导,得到各自的 “变化率”
  3. 按照 “偏导的反方向” 调整参数(比如偏导为正,就减小参数;偏导为负,就增大参数),调整幅度由 “学习率” 控制(比如每次调 0.01,避免步子太大踩空)
  4. 重复步骤 2-3,直到所有偏导都接近 0(或者 L 不再明显变小),此时的参数就是最优解

求偏导的核心规则:

  • 对单个变量求偏导时,其他变量都当常数
  • 常数的导数是 0
  • 链式法则:复合函数求导 = 外层导数 × 内层导数(比如对 (ax+b)² 求导,先对外层 u² 求导得 2u,再对内层 u=ax+b 求导得 a,最终结果是 2a (ax+b))

# 多元化

多元化就是把一个线性模型,用多个特征(比如 x₁、x₂、x₃...)进行 “组合”,变成一个多特征模型。比如:
,就像线性回归示例中有学习时间 (),做题数量 ()

多元简化公式:,w,x 都是一个矩阵(向量),代表 w 和 x 都有很多参数,展开的公式为:

# 多元化的损失函数

对于模型来说,完整的损失函数是:

拆解某一个数据的损失函数:,也是实际值 ()- 预测值 (),但由于矩阵乘法要求前一个矩阵的列数 = 后一个矩阵的行数, 是列向量,形状为 (n,1),直接计算
,是 (n,1) 矩阵 × (n,1) 矩阵,不符合矩阵乘法的维度要求,所以对其中一个进行转置,变成行向量,再计算:

# 多元求偏导

对 w 进行偏导,(注意转置规律),根据 “标量对向量求导” 规则:

  • 如果一项里没有 w ,对 w 求偏导结果为 0
  • 如果是一次项 (是和无关的向量)对 w 求偏导结果为 a
  • 如果是二次项 (是和无关的向量)对 w 求偏导结果为 2Aw

对以上公式逐项拆解:

  • ,这里没有 w,所有根据规则,偏导是 0;
  • ,把 看成一个整体向量 a,那么这项可以写成(一次项),根据规则,对 w 求偏导结果是;
  • ,把 看成一个整体向量 b,这项可以写成(一次项),根据规则,对 w 求偏导结果是;
  • ,把 堪称矩阵 A,这项是(二次项),根据规则,对 w 求偏导结果是;
  • 把所有偏导结果 “加起来”,,又因为 是一个行向量, 是一个列向量,在偏导的汇总中,为了让两项的形式一致(都是列向量),会把 转置成,注意:(),这样就和 形式统一了,方便后续的合并计算。

最终公式演变为:,这个就是对 w 的偏导结果。

按照线性回归找最小值,就是求 w 的偏导结果等于 0,即:,带入公式即 -> -> ,
可以使用逆矩阵消除(逆矩阵原本矩阵 = 单位矩阵,单位矩阵任何矩阵 = 原矩阵), ->

, 这个是 的结果,是带入 w 的结果公式,当 w 为如上公式, 最小。

为什么说是一个行向量:

  • 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,那原来的函数就变成了,这就形成了 “ 套内层函数” 的复合结构。接下来用链式法则 “外层导数 × 内层导数” 来计算:

  • 先求外层函数对 u 的导数:对于,根据幂函数求导规则 ( 的导数是),它的导数是 2u。
  • 再求内层函数对 x 的导数:对于,ax 包要求导的 x,所以 b 就可以看为常数,常数求导为 0,此时公式为 ,x 为变量,固定的变量都是随 a 变化,所以 ax 的导数是 a。
  • 最后把两者相乘:,再把 代回去,就得到。
上次更新: 5/24/2026, 2:55:39 PM
代理模式
感知机

← 代理模式 感知机→

Theme by Vdoing | Copyright © 2023-2026
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式