<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>数学 on 方糖猫Blog</title>
    <link>https://ftmao.com/blog/shelves/%E6%95%B0%E5%AD%A6/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Fri, 08 Mar 2024 10:40:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/shelves/%E6%95%B0%E5%AD%A6/index.xml" rel="self" type="application/rss+xml" /><item>
      <title>《具体数学》笔记：给 TAOCP 打地基的那门课，把“算得出来”变成一种信仰</title>
      <link>https://ftmao.com/blog/bookstore/concrete-mathematics-book-notes/</link>
      <pubDate>Fri, 08 Mar 2024 10:40:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/bookstore/concrete-mathematics-book-notes/</guid>
      <description>&lt;h1 id=&#34;具体数学笔记给-taocp-打地基的那门课把算得出来变成一种信仰&#34;&gt;《具体数学》笔记：给 TAOCP 打地基的那门课，把“算得出来”变成一种信仰&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;目标读者：被算法复杂度“大概是个 n log n”糊弄过、想学会把账算清楚的工程师；以及啃不动 TAOCP 数学小节、想找一本更友好的前传的人。
参考书籍：Ronald L. Graham、Donald E. Knuth、Oren Patashnik《具体数学：计算机科学基础》（Concrete Mathematics: A Foundation for Computer Science，1989 年初版，1994 年第二版）。
阅读目标：不是把九章全部复刻一遍——那等于重抄一本书——而是把每章的“核心技术”蒸馏成一张地图：每章解决什么问题、哪几个技巧值得练成肌肉记忆、哪些结论在工程里真的能变现。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一定位continuous--discrete一门为具体正名的课&#34;&gt;一、定位：continuous + discrete，一门为“具体”正名的课&lt;/h2&gt;
&lt;p&gt;先解书名的梗。&lt;strong&gt;Concrete&lt;/strong&gt; 是 &lt;strong&gt;CON&lt;/strong&gt;tinuous + dis&lt;strong&gt;CRETE&lt;/strong&gt; 的拼接文字游戏：这门课讲的是连续数学与离散数学之间那片“受控的混合地带”——和式、递推、取整、组合数、生成函数，全是既不离散得纯粹也不连续得抽象的对象。作者们在前言里说得很直白：这门课要教的是**“具体”的数学——能算出来的、能推广成闭式（closed form）的数学**，而不是那种只证明存在性、给不出数值的数学。&lt;/p&gt;
&lt;p&gt;这门课有真实的血统：它源自斯坦福自 1970 年起开设的同名课程，Knuth 本人讲过很多轮，最初就是为了给学计算机的学生补 TAOCP 所需的数学地基。三位作者里，Graham 是组合数学大家（“Graham 数”那个 Graham），Knuth 不必介绍，Patashnik 是 Knuth 的学生、BibTeX 的作者。这本书和 TAOCP 是天然的姊妹篇——TAOCP 里那些“易证，留给读者”的数学推导，这本书把它们摊开揉碎讲透。&lt;/p&gt;
&lt;p&gt;这本书还有一个别的教科书没有的特征：&lt;strong&gt;页边涂鸦（margin graffiti）&lt;/strong&gt;。每一页的页边都印着当年选课学生的批注、玩笑、吐槽和妙语——这是 Knuth 从课程助教的课堂记录里精选出来的，让整本书读起来像一间热闹的研讨室而不是一座庙。严肃内容与页边段子并置，本身就是作者的表态：数学是可以玩得起来的手艺，不是供奉起来的神像。&lt;/p&gt;
&lt;p&gt;这本书的习题也自成体系，按用途分六档：热身题（warmups，读完正文就该会做）、基本题（basics，巩固事实）、作业题（homework，加深理解）、考试题（exam problems，一题多概念）、加分题（bonus problems，超出正文范围）、研究题（research problems，出题时可能没有已知答案）。这个分档本身就是一张阅读路线图：时间紧就只做热身题和基本题，想深挖再往下走。另外交代一句版本差异：1994 年的第二版除了修订错误，还新增了超几何求和机械化（Zeilberger 对 Gosper 算法的扩展）等新材料——入手时注意对应第二版。&lt;/p&gt;
&lt;p&gt;阅读难度上给一个实话提示：这本书推导密度很高，但没有一处是“为难而难”——所有推导都服务于一个能算出来的结果。第一遍只读正文、把结论划线即可，习题先挑热身题做；真正让人回不去的是第二遍：当你发现工作里那个“算不清的复杂度”其实就是第 2 章的一道例题时，这本书就长在手边了。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    CM[&amp;#34;具体数学 Concrete Mathematics&amp;lt;br/&amp;gt;continuous + discrete&amp;#34;] --&amp;gt; R[&amp;#34;第 1-3 章 基本功&amp;lt;br/&amp;gt;递归 / 和式 / 整值函数&amp;#34;]
    CM --&amp;gt; N[&amp;#34;第 4-6 章 组合核心&amp;lt;br/&amp;gt;数论 / 二项式系数 / 特殊数&amp;#34;]
    CM --&amp;gt; G[&amp;#34;第 7-9 章 分析武器&amp;lt;br/&amp;gt;生成函数 / 离散概率 / 渐近&amp;#34;]
    R -.-&amp;gt;|&amp;#34;三板斧&amp;lt;br/&amp;gt;小情形-猜测-归纳&amp;#34;| TAOCP[&amp;#34;TAOCP 的数学地基&amp;lt;br/&amp;gt;算法精确分析&amp;#34;]
    N -.-&amp;gt;|&amp;#34;计数与恒等式&amp;#34;| TAOCP
    G -.-&amp;gt;|&amp;#34;从递推到闭式到量级&amp;#34;| TAOCP
    style TAOCP fill:#fff3cd&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;二递归问题小规模情形--猜测--归纳证明&#34;&gt;二、递归问题：小规模情形 → 猜测 → 归纳证明&lt;/h2&gt;
&lt;p&gt;第 1 章用三个经典问题立起全书的方法论：&lt;strong&gt;先算小规模情形，大胆猜测一般规律，再用数学归纳法钉死它。&lt;/strong&gt; 这三板斧听起来朴素，但全书后面所有“神来之笔”都是这个套路的放大版。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[&amp;#34;小规模情形&amp;lt;br/&amp;gt;手算 n 等于 0,1,2,3&amp;#34;] --&amp;gt; B[&amp;#34;大胆猜测&amp;lt;br/&amp;gt;一般规律或闭式&amp;#34;]
    B --&amp;gt; C[&amp;#34;数学归纳法&amp;lt;br/&amp;gt;严格证明&amp;#34;]
    C --&amp;gt;|&amp;#34;证不出来&amp;lt;br/&amp;gt;回头修正猜测&amp;#34;| B
    C --&amp;gt; D[&amp;#34;得到可迁移的洞察&amp;lt;br/&amp;gt;而不只是数据&amp;#34;]
    style D fill:#fff3cd&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;汉诺塔&lt;/strong&gt;：$n$ 个盘子的最少移动次数满足 $T_n = 2T_{n-1} + 1$，$T_0 = 0$，算几项猜出 $T_n = 2^n - 1$，归纳法一行收尾。这题的标准价值在于示范了“把大问题化归成同构的小问题”这个递归思维本身。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;汉诺塔变体&lt;/strong&gt;：书中接着玩规则——若规定盘子每次只能在相邻柱子间移动，答案变成 $3^n - 1$。同一个游戏，约束一改，闭式的底数从 2 变 3：递推结构决定一切。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;平面分割直线（切披萨）&lt;/strong&gt;：$n$ 条直线最多把平面分成几块？第 $n$ 条直线最多与前面 $n-1$ 条各交一点，被切成 $n$ 段，每段多劈出一个区域：$L_n = L_{n-1} + n$，展开得 $L_n = n(n+1)/2 + 1$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高维推广&lt;/strong&gt;：书中顺势把切披萨推到高维——$n$ 张平面最多把空间切成 $\binom{n}{0} + \binom{n}{1} + \binom{n}{2} + \binom{n}{3}$ 块，一般维度的答案都是二项式系数的截断和。这是二项式系数在第 5 章正式登场前的第一次亮相。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;约瑟夫问题（Josephus problem）&lt;/strong&gt;：$n$ 人围圈，每隔一人杀一人，最后幸存者的编号 $J(n)$ 是多少？这是全章的高潮。算小情形发现 $J(n)$ 总是奇数且按 $2$ 的幂分段线性，猜出并证明：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$J(2^m + \ell) = 2\ell + 1, \qquad 0 \le \ell &amp;lt; 2^m$$&lt;/p&gt;
&lt;p&gt;真正的神来之笔是它的&lt;strong&gt;二进制形态&lt;/strong&gt;：把 $n$ 写成二进制 $n = (1\, b_{m-1} b_{m-2} \ldots b_0)_2$，则 $J(n)$ 就是把最高位的 $1$ 循环移到最低位——$J(n) = (b_{m-1} b_{m-2} \ldots b_0\, 1)_2$。一个看起来要模拟整个过程的问题，答案是一次&lt;strong&gt;循环左移&lt;/strong&gt;。这个结果是“猜小情形”方法论能给的最高奖赏：不光有闭式，还有一个看一眼就忘不掉的结构。&lt;/p&gt;
&lt;p&gt;书里也诚实地泼了冷水：把规则改成每隔两人杀一人，约瑟夫问题就没有这么漂亮的闭式了——&lt;strong&gt;漂亮的闭式是运气，小情形-猜测-归纳的方法论才是常态&lt;/strong&gt;。这个提醒对工程实践同样适用：先问有没有结构，再决定要不要追闭式。&lt;/p&gt;
&lt;p&gt;章末还埋了一个进阶武器：&lt;strong&gt;套招法（repertoire method）&lt;/strong&gt;。遇到带一般常数项的递推（比如 $f(1) = \alpha$、$f(2n) = 2f(n) + \beta$ 这类约瑟夫问题的推广式），先找一批函数已知、常数项也已知的“招式”作为基，再把目标常数项表成这些基的线性组合——解也就跟着线性组合出来。它和线性代数里“基展开”是同一件事，只不过向量换成了递推的解。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;感悟&lt;/strong&gt;：工程师遇到递推的第一反应常是“写个程序跑一下”。这一章的立场是：跑程序只能给你数据，&lt;strong&gt;归纳-猜测-证明&lt;/strong&gt;才能给你洞察——而洞察是可以迁移的，数据不能。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三和式扰动法与-iverson-括号&#34;&gt;三、和式：扰动法与 Iverson 括号&lt;/h2&gt;
&lt;p&gt;第 2 章把“求和”从小学算术升级成一套形式演算。&lt;/p&gt;
&lt;p&gt;**扰动法（perturbation method）**是本章的招牌技巧，以求几何级数为例：设 $S_n = \sum_{k=0}^{n} a x^k$，把最后一项拆出来再重新配齐下标，得到&lt;/p&gt;
&lt;p&gt;$$S_n + a x^{n+1} = a + x S_n \quad\Longrightarrow\quad S_n = \frac{a - a x^{n+1}}{1 - x}$$&lt;/p&gt;
&lt;p&gt;整个过程没有一个“聪明的灵感”，纯粹是把和式当作可以代数操作的符号对象——这就是“形式方法”的力量：把直觉题变成机械题。等差数列和、算术-几何混合级数，同一个套路通吃。本质上它是“把未知量凑进自己的方程里再解出来”，和代数里的移项是同一个思想，只是操作对象从数换成了和式。&lt;/p&gt;
&lt;p&gt;同一个动作还能解递推。书中用**求和因子法（summation factor）**处理 $a_n T_n = b_n T_{n-1} + c_n$ 型的一阶递推，并用它解出快速排序的平均比较次数：递推 $C_n = n + 1 + \frac{2}{n}\sum_{k&amp;lt;n} C_k$ 的精确解是 $C_n = 2(n+1)H_n - 4n$——教科书里“快排平均 $O(n \log n)$”这句话的完整账，就长这样。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;多重和式交换求和次序&lt;/strong&gt;是另一项基本功：$\sum_i \sum_j a_{ij}$ 先加哪个，取决于哪个方向好算——这和数据库优化器决定 join 顺序是同构的思维。配上 Iverson 括号，这个技巧变得完全机械：界限互相依赖的双重和可以写成&lt;/p&gt;
&lt;p&gt;$$\sum_j \sum_k a_{j,k}\,[1 \le j \le k \le n]$$&lt;/p&gt;
&lt;p&gt;界限信息全部进括号之后，交换次序就退化成对括号里的条件做代数变换，不再需要在脑子里维护“哪一层界限依赖哪个下标”。&lt;/p&gt;
&lt;p&gt;然后是全书影响力最大的记号发明之一：&lt;strong&gt;Iverson 括号（Iverson&amp;rsquo;s convention）&lt;/strong&gt;。对任意命题 $P$：&lt;/p&gt;
&lt;p&gt;$$[P] = \begin{cases} 1, &amp;amp; P \text{ 为真} \\ 0, &amp;amp; P \text{ 为假} \end{cases}$$&lt;/p&gt;
&lt;p&gt;（源码里上面 cases 环境的换行写作 &lt;code&gt;\\\\&lt;/code&gt;，这是本站 KaTeX 渲染链路的转义要求，不是笔误。）Iverson 括号的威力在于&lt;strong&gt;消灭求和界限上的特例讨论&lt;/strong&gt;：比如“小于 $n$ 的素数个数”可以不带任何附加条件地写成 $\sum_{0 \le k &amp;lt; n}[k \in \mathbb{P}]$，求和范围随便切，条件全部进括号。这个记号源自 Ken Iverson 的 APL 语言，由 Knuth 大力推广——它是编程思想（布尔值即 0/1）反哺数学记号的典范。&lt;/p&gt;
&lt;p&gt;第 2 章的后半还有一套常被跳过的重武器：&lt;strong&gt;有限微积分（finite calculus）&lt;/strong&gt;。定义差分算子 $\Delta f(x) = f(x+1) - f(x)$，它是导数的离散对应；再定义&lt;strong&gt;下降阶乘幂&lt;/strong&gt; $x^{\underline{m}} = x(x-1)\cdots(x-m+1)$（共 $m$ 个递减因子），则有一条漂亮的平行定理：$\Delta(x^{\underline{m}}) = m\,x^{\underline{m-1}}$，对应的不定和公式 $\sum_{0 \le k &amp;lt; n} k^{\underline{m}} = n^{\underline{m+1}}/(m+1)$ 就是幂函数积分的离散版。普通幂拆成下降幂（比如 $k^2 = k^{\underline{2}} + k^{\underline{1}}$）之后，平方和公式三行就出来了；章末的**分部求和（summation by parts）**则把分部积分整套搬了过来。有限微积分的意义在于：&lt;strong&gt;一整类多项式与阶乘幂的求和变成了查表，不再需要每题一灵感。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;最后补一条书中反复强调的边界：以上所有形式操作默认和式是有限或绝对收敛的。对无穷和式随意交换次序、随意套用扰动，会撞上经典悖论——&lt;strong&gt;形式方法的自由是有边界的，边界叫收敛性。&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四整值函数与数论floorceiling-与欧几里得&#34;&gt;四、整值函数与数论：floor、ceiling 与欧几里得&lt;/h2&gt;
&lt;p&gt;第 3 章处理一个工程师天天用、却很少细想的对象：下取整 $\lfloor x \rfloor$ 与上取整 $\lceil x \rceil$。核心性质几条就够日常防身：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;界定：$x - 1 &amp;lt; \lfloor x \rfloor \le x$；镜像关系 $\lceil x \rceil = -\lfloor -x \rfloor$；&lt;/li&gt;
&lt;li&gt;判定式：$\lfloor x \rfloor = n$ 当且仅当 $n \le x &amp;lt; n+1$——这条“把取整翻译成不等式”的等价式是证明一切 floor 恒等式的钥匙；&lt;/li&gt;
&lt;li&gt;整数进出：$\lfloor x + n \rfloor = \lfloor x \rfloor + n$（整数可以自由进出取整号）——看似显然，却是 floor 恒等式证明里被用得最多的动作；&lt;/li&gt;
&lt;li&gt;取模的定义式：$x \bmod y = x - y\lfloor x/y \rfloor$，它让 $\bmod$ 在负数和小数上也有确定含义；&lt;/li&gt;
&lt;li&gt;同余的代数：$(a + b) \bmod m$ 可以先各自取模再相加（乘法同理）——这是大数计算不溢出、哈希设计不散架的基本功。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第 3 章还有一类硬功夫是&lt;strong&gt;含 floor/ceiling 的和式&lt;/strong&gt;：把求和区间按 floor 值的变化点切开（“区间划分”技巧），一个看似无规律的取整和就被拆成几段普通和式。本章最让人意外的收尾是&lt;strong&gt;瑞利定理（Beatty 序列，又称谱定理）&lt;/strong&gt;：若 $\alpha, \beta$ 是正无理数且 $1/\alpha + 1/\beta = 1$，则两个序列 $\lfloor n\alpha \rfloor$ 与 $\lfloor n\beta \rfloor$（$n = 1, 2, 3, \ldots$）不重不漏地恰好划分全体正整数——取整这种“坑坑洼洼”的运算，竟然能产出完美的划分。&lt;/p&gt;
&lt;p&gt;第 4 章进入数论，主线清晰：整除与最大公约数、素数与唯一分解定理、互素与欧拉 $\varphi$ 函数、模运算。章首的技术核心是&lt;strong&gt;欧几里得算法&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$\gcd(m, n) = \gcd(n,\, m \bmod n)$$&lt;/p&gt;
&lt;p&gt;及其扩展形式（把 $\gcd$ 表成 $m&amp;rsquo; m + n&amp;rsquo; n$ 的线性组合）。唯一分解定理（每个正整数分解为素数幂的乘积且方式唯一）是全章的地基，阶乘中素因子次数的计算（Legendre 公式：$n!$ 中素数 $p$ 的次数为 $\sum_{k \ge 1} \lfloor n/p^k \rfloor$）是它的漂亮应用。$\varphi(n)$ 计“与 $n$ 互素的剩余类个数”，乘性公式 $\varphi(n) = n \prod_{p \mid n}(1 - 1/p)$ 一条就够记住。&lt;/p&gt;
&lt;p&gt;这一章还有三件值得单独记住的东西：一是&lt;strong&gt;约数求和恒等式&lt;/strong&gt; $\sum_{d \mid n} \varphi(d) = n$——把 $1$ 到 $n$ 按“与 $n$ 的最大公约数”分桶即可一行证出；二是 &lt;strong&gt;Stern-Brocot 树&lt;/strong&gt;：从 $0/1$ 与 $1/0$ 两个哨兵出发，不断插入相邻分数的中位分数（mediant）$\frac{m+m&amp;rsquo;}{n+n&amp;rsquo;}$，能生成全部正有理数，每个恰好一次且自动是最简形式——这是连分数与有理逼近理论的入口；三是&lt;strong&gt;中国剩余定理的一个具体例子&lt;/strong&gt;：模 3 余 2、模 5 余 3 的数，在模 15 意义下被唯一确定（就是 8）——一般定理不过是这个例子的机械推广，书里强调的思想是&lt;strong&gt;局部余数信息可以无损拼出全局&lt;/strong&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五二项式系数恒等式的丛林与机械化证明&#34;&gt;五、二项式系数：恒等式的丛林与机械化证明&lt;/h2&gt;
&lt;p&gt;第 5 章是全书最厚、也最容易迷路的一章：二项式系数的恒等式多到像丛林。正确的读法是抓住少数几条“母恒等式”，其余都是它们的子女。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;定义与基本款：$\binom{n}{k} = \binom{n}{n-k}$（对称），加法公式 $\binom{n}{k} = \binom{n-1}{k} + \binom{n-1}{k-1}$（帕斯卡三角的生成规则），吸收恒等式 $k\binom{n}{k} = n\binom{n-1}{k-1}$（把下标里的 $k$ 吸出去）。&lt;/li&gt;
&lt;li&gt;平行求和（曲棍球棒恒等式）：$\sum_{0 \le k \le n} \binom{r+k}{k} = \binom{r+n+1}{n}$——沿帕斯卡三角斜着加，和落在下一行，是处理“带前缀的二项式求和”的第一反应。&lt;/li&gt;
&lt;li&gt;二项式定理：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$(x + y)^n = \sum_{k=0}^{n} \binom{n}{k} x^k y^{n-k}$$&lt;/p&gt;
&lt;p&gt;令 $x = y = 1$ 得全体二项系数之和为 $2^n$；令 $x = -1$ 得交错和为 $0$——“代入特殊值”本身就是制造恒等式的流水线。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;三项式系数与多项式定理是二项式的直接推广，拆开字母逐个分配即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;丛林里还有两条路标值得记住：&lt;strong&gt;范德蒙德卷积&lt;/strong&gt; $\sum_{k} \binom{r}{k}\binom{s}{n-k} = \binom{r+s}{n}$——组合解释是“从 $r+s$ 个元素里选 $n$ 个，按从第一堆里选了几个分类”，它展示了组合论证与代数恒等式的互译；&lt;strong&gt;上指标取反&lt;/strong&gt; $\binom{r}{k} = (-1)^k \binom{k-r-1}{k}$，把上指标推广到负数，是生成函数展开里处理负幂的常备变换。&lt;/p&gt;
&lt;p&gt;这一章真正的“现代”内容在末尾：大量二项式恒等式可以写成&lt;strong&gt;超几何级数&lt;/strong&gt;的标准形式，而 &lt;strong&gt;Gosper 算法&lt;/strong&gt;能机械地判定一个超几何项是否有闭式不定和、有就直接算出来——也就是说，曾经需要灵感的恒等式证明，有相当大一类已经&lt;strong&gt;被算法化了&lt;/strong&gt;。这是全书精神最锋利的一次展示：连“证明数学恒等式”这件事本身都可以具体化、机械化。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;六特殊数给高频出现的数建档案&#34;&gt;六、特殊数：给高频出现的数建档案&lt;/h2&gt;
&lt;p&gt;第 6 章给一批在计数问题里反复冒头的“特殊数”立档案，每个都值一行记住：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;斯特林数&lt;/strong&gt;分两类，记住口诀“子集与轮换”：第二类 $\left\{ {n \atop k} \right\}$ 是把 $n$ 个元素划分成 $k$ 个非空子集的方案数；第一类 $\left[ {n \atop k} \right]$ 是把 $n$ 个元素排成 $k$ 个轮换的方案数。第二类的递推是 $\left\{ {n \atop k} \right\} = k \left\{ {n-1 \atop k} \right\} + \left\{ {n-1 \atop k-1} \right\}$——第 $n$ 个元素要么自立门户，要么加入已有 $k$ 个子集之一。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;斯特林数还是翻译器&lt;/strong&gt;：$x^n = \sum_{k} \left\{ {n \atop k} \right\} x^{\underline{k}}$，普通幂与下降阶乘幂之间的互译靠它完成——这一式把第 2 章的有限微积分和本章的计数数列缝在了一起。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;欧拉数&lt;/strong&gt;数的是排列中“上升”的个数——这是分析插入类排序时会自然冒出来的数。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调和数&lt;/strong&gt; $H_n = \sum_{k=1}^{n} \frac{1}{k}$，全书最重要的渐近式之一：$H_n = \ln n + \gamma + O(1/n)$，其中 $\gamma$ 是欧拉常数。快速排序平均比较次数、优惠券收集问题，答案里全是 $H_n$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;斐波那契数&lt;/strong&gt;：$F_n = F_{n-1} + F_{n-2}$，下一章用生成函数一次性解出闭式；顺记其渐近：$F_n$ 最接近 $\phi^n/\sqrt{5}$，增长率由黄金比例封顶。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卡塔兰数&lt;/strong&gt; $C_n = \frac{1}{n+1}\binom{2n}{n}$：合法括号序列、二叉树形状数、栈置换数——凡是“任意前缀中左括号不少于右括号”的计数，答案都是它。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这一章的读法是当字典用：不必一次背下所有递推，但要建立“这个长相的问题答案里会出现哪种数”的条件反射。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;七生成函数把数列打包成幂级数&#34;&gt;七、生成函数：把数列打包成幂级数&lt;/h2&gt;
&lt;p&gt;第 7 章是全书皇冠。思想一句话：&lt;strong&gt;把数列 $g_0, g_1, g_2, \ldots$ 打包成幂级数 $G(z) = \sum_{n \ge 0} g_n z^n$&lt;/strong&gt;。打包之后，对数列的操作全部翻译成对级数的代数运算——这就是我私下叫它“数列的 DSL”的原因：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    S[&amp;#34;数列操作&amp;#34;] --&amp;gt; T[&amp;#34;生成函数对应物&amp;#34;]
    S1[&amp;#34;整体平移下标&amp;#34;] --&amp;gt; T1[&amp;#34;乘或除以 z&amp;#34;]
    S2[&amp;#34;逐项乘 n&amp;#34;] --&amp;gt; T2[&amp;#34;求导再乘 z&amp;#34;]
    S3[&amp;#34;两个数列卷积&amp;#34;] --&amp;gt; T3[&amp;#34;两个级数相乘&amp;#34;]
    S4[&amp;#34;前缀和&amp;#34;] --&amp;gt; T4[&amp;#34;乘 1/(1-z)&amp;#34;]
    style T fill:#e8f5e9&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;常用生成函数其实就一小张表：$\frac{1}{1-z} = \sum_{n \ge 0} z^n$ 对应全 1 数列，$\frac{1}{(1-z)^2} = \sum_{n \ge 0} (n+1) z^n$ 对应自然数序列，$e^z = \sum_{n \ge 0} z^n/n!$ 是指数生成函数的入口。背下这三条，再配上平移、求导、卷积三个操作，大多数有理型生成函数都能徒手展开。&lt;/p&gt;
&lt;p&gt;解递推的标准流水线因此变成纯机械三步：递推两边乘 $z^n$ 求和 → 解出 $G(z)$ 的有理式 → 部分分式展开读系数。斐波那契是标准演示：递推代入得 $F(z) = \frac{z}{1 - z - z^2}$，分母用黄金比例 $\phi = \frac{1+\sqrt{5}}{2}$ 与 $\hat{\phi} = \frac{1-\sqrt{5}}{2}$ 因式分解，部分分式后读出&lt;strong&gt;比内公式（Binet formula）&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$F_n = \frac{\phi^n - \hat{\phi}^n}{\sqrt{5}}$$&lt;/p&gt;
&lt;p&gt;卡塔兰数则是卷积解法的标准演示：由递推 $C_{n+1} = \sum_{k} C_k C_{n-k}$ 知生成函数满足二次方程 $C(z) = 1 + z\,C(z)^2$，解出 $C(z) = \frac{1 - \sqrt{1-4z}}{2z}$，再用广义二项式定理展开读系数，$\frac{1}{n+1}\binom{2n}{n}$ 就掉出来了。&lt;/p&gt;
&lt;p&gt;整章的信息量很大，但骨架就是这一句：&lt;strong&gt;递推是数列的“源码”，生成函数是编译器，闭式是编译产物。&lt;/strong&gt; 卷积对应乘法则让生成函数同时成为计数工具——把“选法”按规模分母，乘起来就读出组合方案数。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;八离散概率与渐近期望的算术与-o-的纪律&#34;&gt;八、离散概率与渐近：期望的算术与 O 的纪律&lt;/h2&gt;
&lt;p&gt;第 8 章把概率论限制在离散空间重做一遍：随机变量是样本空间上的函数，期望线性性（哪怕变量不独立也成立）是本章最锋利的工具，方差度量散布。三个工程味十足的计算实例：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优惠券收集&lt;/strong&gt;：集齐 $n$ 种优惠券的期望购买次数是 $E = n H_n$——把过程按“已收集到 $k$ 种”切成 $n$ 个阶段，每阶段是几何分布，期望直接相加。这是期望线性性最经典的演示：变量不独立也没关系，期望照样可加。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生日悖论&lt;/strong&gt;：$n$ 个人生日全不同的概率是 $P = \prod_{k=1}^{n-1}(1 - k/365)$，代入数值可知 23 人左右就跌破一半——所有用随机 ID 的系统都该对这个数有直觉。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;哈希分析&lt;/strong&gt;：拉链法下，设装填因子 $\alpha = n/m$，成功查找的平均探查次数用期望线性性直接算出，约为 $1 + \alpha/2$——装填因子是唯一旋钮，这个式子就是哈希表扩容阈值的理论出处。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;概率生成函数&lt;/strong&gt; $G_X(z) = \sum_{k} P(X = k)\, z^k$ 把第 7 章的机器整套搬进概率：分布的各阶矩可以从导数里读出，均值 $E(X) = G&amp;rsquo;_X(1)$，方差 $\mathrm{Var}(X) = G&amp;rsquo;&amp;rsquo;_X(1) + G&amp;rsquo;_X(1) - (G&amp;rsquo;_X(1))^2$——算矩变成了求导加代值的机械操作。注意一个不对称：期望可加不需要独立性，方差可加却需要（准确说是不相关）——这是实战里最容易踩的坑。&lt;/p&gt;
&lt;p&gt;独立随机变量之和的概率生成函数等于各自生成函数的乘积——“独立和”在生成函数世界里就是乘法，这是卷积对应的概率版本，也是分析“多次独立试验总代价”的标准入口。&lt;/p&gt;
&lt;p&gt;第 9 章给“量级”立规矩。大 O 的精确定义：$f(n) = O(g(n))$ 当且仅当存在常数 $C$ 使 $|f(n)| \le C|g(n)|$ 在定义域上成立。运算规则要当语法记：$O(f) + O(g) = O(f + g)$，$O(f) \cdot O(g) = O(f \cdot g)$，常数因子被吸收即 $O(C f) = O(f)$。常见坑书里都点了名：&lt;strong&gt;等号只能从左往右读&lt;/strong&gt;——$n^2 = O(n^3)$ 合法，反过来写是语法错误；O 里藏着看不见的常数，所以“两个实现同为 O(n)”不包含任何比较信息。&lt;strong&gt;O 不是一个值，是一个吸收记号。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;书里顺带给出一张该背下来的量级阶梯：$\log n \prec n \prec n \log n \prec n^2 \prec 2^n \prec n!$（$\prec$ 表示“渐近意义上严格小”）。遇到复杂表达式先把各项归到这条阶梯上，主次立刻分明——这是渐近分析的第一直觉训练。&lt;/p&gt;
&lt;p&gt;尾式交换（tail swap）是本章一个漂亮的通用技巧：当一个和式的尾部难算时，利用被求和量的对称性或单调性，把尾部换成结构相同但好算的镜像部分——很多“首尾呼应”的恒等式证明背后都是这一招。&lt;/p&gt;
&lt;p&gt;章尾是两件重器：&lt;strong&gt;欧拉求和公式&lt;/strong&gt;和&lt;strong&gt;斯特林渐近公式&lt;/strong&gt;。欧拉求和公式的一阶形态是&lt;/p&gt;
&lt;p&gt;$$\sum_{a \le k &amp;lt; b} f(k) = \int_a^b f(x)\, dx + \frac{f(a) + f(b)}{2} + \cdots$$&lt;/p&gt;
&lt;p&gt;它把“用积分逼近和式”从粗略估计变成带修正项的严格展开；令 $f(x) = \ln x$ 代入并对误差项做渐近分析，就得到斯特林公式：&lt;/p&gt;
&lt;p&gt;$$n! \sim \sqrt{2\pi n}\, (n/e)^n$$&lt;/p&gt;
&lt;p&gt;取对数即 $\ln n! = n\ln n - n + O(\log n)$——排序下界 $n \log n$ 里的那个 $n \log n$ 就是从这里来的，接上了 TAOCP 卷 3 的信息论论证。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;九落到工程实践这本书改变了什么&#34;&gt;九、落到工程实践：这本书改变了什么&lt;/h2&gt;
&lt;p&gt;九章的武器收拢成日常纪律，一共七条：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;什么时候值得求闭式解。&lt;/strong&gt; 容量规划、复杂度精算、协议参数推导——凡是“答案要进 Excel 或设计文档”的场合，闭式解比模拟程序值钱：它能代入、能求导、能看出参数敏感度。反过来，一次性的、答案只用一个数值的问题，别硬求闭式，直接算。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iverson 括号是代码评审的语言。&lt;/strong&gt; “当 x 为偶数且未越界时累加”这类口头描述歧义丛生，写成 $\sum_k a_k [k \text{ 为偶数}][k &amp;lt; n]$ 就没有歧义。评审里坚持“把条件写成显式谓词”，是从这一章借来的纪律。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;生成函数当 DSL 用。&lt;/strong&gt; 遇到“按规模计数”的需求（消息组合数、状态转移路径数），先想能不能写出递推；能写出递推，生成函数流水线就是确定的求解路径，不必靠灵感。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;渐近思维的纪律与大 O 滥用。&lt;/strong&gt; “这是 O(n²)”不是分析的终点：常数多大、输入规模落在哪个区间、低阶项什么时候反超，第 9 章训练的就是这种追问。见过太多拿大 O 当挡箭牌、把 $100n$ 和 $n^2/100$ 在 $n = 1000$ 下混为一谈的事故。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扰动法与区间划分可以直接进性能分析。&lt;/strong&gt; 循环里带取整、带分支条件的代价累加，本质上就是含 floor 的和式：按跳跃点切开区间分段求和，比“拍个上界”准确得多。第 2、3 章的技巧是精确复杂度分析的扳手。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;机械化证明改变了“恒等式”的处境。&lt;/strong&gt; Gosper 算法的存在意味着：评审一个组合恒等式时先问“这能不能机判”，能机判的就不值得人肉推导——把人的精力留给机判不了的部分。这个分工原则对一切“已被算法化的技能”都成立。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对“算得出来”的信仰。&lt;/strong&gt; 这本书最深的影响是态度上的：遇到和式、递推、取整，默认它是&lt;strong&gt;可以算&lt;/strong&gt;的，只是还没找到对的技巧。把“大概”“估计”换成“我算算看”，是这本书送给工程师最好的礼物。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;本篇小结&#34;&gt;本篇小结&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;书名 Concrete 是 continuous + discrete 的文字游戏：教的是“能算出来、能推广成闭式”的数学；源自斯坦福课程，是 TAOCP 的数学地基；页边涂鸦与习题六档分级是这本书独有的气质与路线图。&lt;/li&gt;
&lt;li&gt;第 1 章立方法论：小情形 → 猜测 → 归纳证明，外加套招法；约瑟夫问题的答案是二进制循环左移，$J(2^m+\ell) = 2\ell+1$；漂亮闭式是运气，方法论是常态。&lt;/li&gt;
&lt;li&gt;第 2-3 章是基本功：扰动法与求和因子（快排平均比较次数 $2(n+1)H_n - 4n$ 就是这么算出来的）、Iverson 括号消灭特例讨论、有限微积分把求和变查表、floor/ceiling 的不等式翻译与区间划分、瑞利定理。&lt;/li&gt;
&lt;li&gt;第 4-6 章是组合核心：欧几里得算法与唯一分解、Stern-Brocot 树、二项式恒等式丛林与 Gosper 机械化证明、斯特林数/调和数/斐波那契/卡塔兰数档案。&lt;/li&gt;
&lt;li&gt;第 7-9 章是分析武器：生成函数把递推编译成闭式（Binet 公式是标准产物）、期望线性性算优惠券收集与生日悖论、概率生成函数算矩、大 O 的精确定义与运算语法、欧拉求和公式推出斯特林渐近。&lt;/li&gt;
&lt;li&gt;工程落地一句话：该求闭式时别满足于模拟，该谈常数时别躲进大 O。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这本书和 TAOCP 放在一起读效果最好：TAOCP 告诉你账要算，这本书教你账怎么算。读完后我写性能分析报告的习惯变了——先递推，再闭式，最后才轮到 profiler。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;参考资料&#34;&gt;参考资料&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Ronald L. Graham, Donald E. Knuth, Oren Patashnik, &lt;em&gt;Concrete Mathematics: A Foundation for Computer Science&lt;/em&gt;, 2nd ed., Addison-Wesley, 1994（初版 1989）。中译本《具体数学：计算机科学基础》，人民邮电出版社。&lt;/li&gt;
&lt;li&gt;Donald E. Knuth, &amp;ldquo;Two Notes on Notation&amp;rdquo;, &lt;em&gt;American Mathematical Monthly&lt;/em&gt;, 1992（Iverson 括号与斯特林数记号的推广短文）。&lt;/li&gt;
&lt;li&gt;Ralph W. Gosper, Jr., &amp;ldquo;Decision procedure for indefinite hypergeometric summation&amp;rdquo;, &lt;em&gt;Proceedings of the National Academy of Sciences&lt;/em&gt;, 1978（第 5 章机械化证明的原始论文）。&lt;/li&gt;
&lt;li&gt;Donald E. Knuth, &lt;em&gt;The Art of Computer Programming&lt;/em&gt;, Volume 1（本书是其中数学预备知识的完整展开）。&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    <item>
      <title>《数学之美》学习总结：程序员视角下的核心数学知识与工程实践</title>
      <link>https://ftmao.com/blog/bookstore/beauty-of-mathematics-notes/</link>
      <pubDate>Tue, 28 Jul 2020 09:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/bookstore/beauty-of-mathematics-notes/</guid>
      <description>&lt;h1 id=&#34;数学之美学习总结程序员视角下的核心数学知识与工程实践&#34;&gt;《数学之美》学习总结：程序员视角下的核心数学知识与工程实践&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;目标读者：写过代码、对数学有点畏惧、想知道“学这些到底有什么用”的新人。&lt;br&gt;
参考书籍：吴军《数学之美》&lt;br&gt;
阅读目标：建立数学与软件工程之间的直觉连接，避开最常见的学习误区。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0-写在前面数学不是应试而是降维工具&#34;&gt;0. 写在前面：数学不是应试，而是“降维工具”&lt;/h2&gt;
&lt;p&gt;很多程序员对数学的印象还停留在大学课堂：公式推导、考试算题、考完就忘。《数学之美》这本书最大的价值，是让我们看到&lt;strong&gt;数学在真实工程问题中如何把复杂问题变简单&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索怎么在海量网页里找到最相关的结果？→ 用&lt;strong&gt;概率&lt;/strong&gt;和&lt;strong&gt;线性代数&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;语音识别怎么把声波变成文字？→ 用&lt;strong&gt;概率模型&lt;/strong&gt;和&lt;strong&gt;隐马尔可夫模型&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;机器翻译怎么做到“信达雅”？→ 用&lt;strong&gt;统计&lt;/strong&gt;和&lt;strong&gt;信息论&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;推荐系统怎么猜你喜欢？→ 用&lt;strong&gt;矩阵分解&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;中文分词怎么切得准？→ 用&lt;strong&gt;统计语言模型&lt;/strong&gt;和&lt;strong&gt;动态规划&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;数据怎么压缩得更小？→ 用&lt;strong&gt;信息论&lt;/strong&gt;中的熵和哈夫曼编码。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这本书的核心启示：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;好的数学模型，能把一个看似需要“理解人类智能”的问题，转化为可以计算、可以优化的工程问题。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;下面我从程序员最关心的几大数学分支入手，分别讲清楚它们的作用、典型场景和学习避坑技巧。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-线性代数把关系变成矩阵运算&#34;&gt;1. 线性代数：把“关系”变成“矩阵运算”&lt;/h2&gt;
&lt;h3 id=&#34;11-一句话理解线性代数&#34;&gt;1.1 一句话理解线性代数&lt;/h3&gt;
&lt;p&gt;线性代数研究的是&lt;strong&gt;向量、矩阵和它们之间的变换&lt;/strong&gt;。对程序员来说，它最大的用处是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;把一堆有关系的数字，统一表示成矩阵，然后用高效的矩阵运算一次性处理。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;12-先修复习向量内积与矩阵乘法&#34;&gt;1.2 先修复习：向量、内积与矩阵乘法&lt;/h3&gt;
&lt;p&gt;如果你从没接触过线性代数，先把这几个概念过一遍，后面所有内容都建立在它们之上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. 向量：一组有顺序的数字&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;向量就是一个排好序的数字列表。比如用一个向量描述一个用户：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;[年龄 25, 月消费 300, 活跃天数 12]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;位置是有意义的：第 1 位永远是年龄，不能随便换。推荐系统、神经网络里说的“特征向量”，就是这个东西。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 内积（点积）：对应位置相乘再相加&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;两个长度相同的向量，对应位置的数字相乘，再把结果全部加起来，就是内积：&lt;/p&gt;
&lt;p&gt;$$
[2, 1] \cdot [3, 4] = 2 \times 3 + 1 \times 4 = 6 + 4 = 10
$$&lt;/p&gt;
&lt;p&gt;直觉上，内积衡量“两个方向有多像”：两个向量越是“同向”，内积越大。这就是为什么推荐系统能用它来算“用户口味”和“电影风格”的匹配度（见 1.4 节）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 矩阵：一张二维数字表&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;矩阵就是一张有行有列的数字表。我们用 $(m \times n)$ 表示它的形状，$m$ 是行数，$n$ 是列数。比如一张 3 个用户 × 4 部电影的评分表，就是一个 $(3 \times 4)$ 的矩阵。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 矩阵乘法：左矩阵的行，与右矩阵的列做内积&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;矩阵 $A$ 乘矩阵 $B$，结果第 $i$ 行第 $j$ 列的元素 = “$A$ 的第 $i$ 行”与“$B$ 的第 $j$ 列”的内积。看一个完整例子，$A$ 是 $(2 \times 3)$，$B$ 是 $(3 \times 2)$：&lt;/p&gt;
&lt;p&gt;$$
A = \begin{bmatrix} 1 &amp;amp; 2 &amp;amp; 0 \\ 3 &amp;amp; 1 &amp;amp; 1 \end{bmatrix}, \quad
B = \begin{bmatrix} 1 &amp;amp; 2 \\ 0 &amp;amp; 1 \\ 2 &amp;amp; 0 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;结果 $C = A \times B$ 是一个 $(2 \times 2)$ 矩阵，4 个元素逐个算：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$C_{11}$ = $A$ 第 1 行 · $B$ 第 1 列 = $[1,2,0] \cdot [1,0,2]$ = $1\times1 + 2\times0 + 0\times2 = 1$&lt;/li&gt;
&lt;li&gt;$C_{12}$ = $A$ 第 1 行 · $B$ 第 2 列 = $[1,2,0] \cdot [2,1,0]$ = $1\times2 + 2\times1 + 0\times0 = 4$&lt;/li&gt;
&lt;li&gt;$C_{21}$ = $A$ 第 2 行 · $B$ 第 1 列 = $[3,1,1] \cdot [1,0,2]$ = $3\times1 + 1\times0 + 1\times2 = 5$&lt;/li&gt;
&lt;li&gt;$C_{22}$ = $A$ 第 2 行 · $B$ 第 2 列 = $[3,1,1] \cdot [2,1,0]$ = $3\times2 + 1\times1 + 1\times0 = 7$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
C = \begin{bmatrix} 1 &amp;amp; 4 \\ 5 &amp;amp; 7 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;形状规则：&lt;strong&gt;$(m \times k) \cdot (k \times n) = (m \times n)$&lt;/strong&gt;——左矩阵的列数必须等于右矩阵的行数，这两个相同的 $k$ 会“抵消”掉。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 转置：行列互换&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;转置就是把矩阵“翻个面”，第 $i$ 行变成第 $i$ 列，记作 $A^T$。上面的 $A$ 转置后变成 $(3 \times 2)$：&lt;/p&gt;
&lt;p&gt;$$
A^T = \begin{bmatrix} 1 &amp;amp; 3 \\ 2 &amp;amp; 1 \\ 0 &amp;amp; 1 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这和后面的工程应用有什么关系？&lt;/strong&gt; 推荐系统的矩阵分解，本质就是“用户向量 · 电影向量”的内积；神经网络每一层都是一次矩阵乘法。看懂上面的计算过程，后面公式里的 $u_i^T v_j$、$W\mathbf{x}$ 对你来说就不再是天书。&lt;/p&gt;
&lt;h3 id=&#34;13-核心概念速查&#34;&gt;1.3 核心概念速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;概念&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;程序员直觉&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;软件行业用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;向量&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;一组有顺序的数字&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;用户特征、词向量、颜色 RGB&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;矩阵&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;一张二维表&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;邻接表、图像像素、权重参数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;矩阵乘法&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;一种“加权组合”&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;神经网络前向传播、图神经网络&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;特征值/特征向量&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;变换中的“不变方向”&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;PageRank、降维、稳定性分析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;转置、逆矩阵&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;坐标系互换、回推原值&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;最小二乘法、线性回归求解&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;14-典型场景推荐系统里的矩阵分解&#34;&gt;1.4 典型场景：推荐系统里的矩阵分解&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;什么是矩阵分解？&lt;/strong&gt; 一句话：把一张大表拆成两张小表的乘积。如果 $R \approx U \times V$，那么 $R$ 里任何一个元素，都可以用“$U$ 的一行”和“$V$ 的一列”做内积还原出来。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么评分表是稀疏的？&lt;/strong&gt; 假设有 100 万用户、10 万部电影，评分表有 $10^{11}$ 个格子。但每个用户只看过几百部电影，打过分的更少——表里 99% 以上的格子是空的。推荐系统要解决的就是：&lt;strong&gt;把这些空格子填上&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;一个完整的数字例子。&lt;/strong&gt; 假设只有 3 个用户、4 部电影，真实评分矩阵 $R$（“?” 表示没看过、需要预测）：&lt;/p&gt;
&lt;p&gt;$$
R = \begin{bmatrix} 5 &amp;amp; 4 &amp;amp; ? &amp;amp; 1 \\ ? &amp;amp; 1 &amp;amp; 5 &amp;amp; 4 \\ 5 &amp;amp; ? &amp;amp; ? &amp;amp; ? \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;我们假设每个用户只用 2 个数字就能概括他的“口味”——即 $k=2$ 个隐因子，可以脑补成“动作片程度”和“喜剧片程度”。假如通过训练（方法见下文）得到了：&lt;/p&gt;
&lt;p&gt;用户矩阵 $U$（3×2，每行是一个用户的口味向量）：&lt;/p&gt;
&lt;p&gt;$$
U = \begin{bmatrix} 1 &amp;amp; 0 \\ 0 &amp;amp; 1 \\ 1 &amp;amp; 1 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;电影矩阵 $V$（2×4，每列是一部电影的风格向量）：&lt;/p&gt;
&lt;p&gt;$$
V = \begin{bmatrix} 5 &amp;amp; 4 &amp;amp; 0 &amp;amp; 1 \\ 0 &amp;amp; 1 &amp;amp; 5 &amp;amp; 4 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;现在预测“用户 1 会给电影 3 打几分”：取 $U$ 的第 1 行 $[1, 0]$，和 $V$ 的第 3 列 $[0, 5]$，做内积：&lt;/p&gt;
&lt;p&gt;$$
\hat{R}_{13} = [1, 0] \cdot [0, 5] = 1 \times 0 + 0 \times 5 = 0
$$&lt;/p&gt;
&lt;p&gt;预测 0 分——用户 1 是纯动作片爱好者，电影 3 是纯喜剧片，系统不会推荐它。再看用户 3（口味 $[1, 1]$，什么都看一点）对电影 2：&lt;/p&gt;
&lt;p&gt;$$
\hat{R}_{32} = [1, 1] \cdot [4, 1] = 1 \times 4 + 1 \times 1 = 5
$$&lt;/p&gt;
&lt;p&gt;预测满分，大胆推荐。你可以顺手验证：已知的评分（比如 $\hat{R}_{11} = [1, 0] \cdot [5, 0] = 5$）也和原表对得上——这正是训练时调整 $U$、$V$ 的目标。&lt;/p&gt;
&lt;p&gt;这里的 $k$（本例为 2）就是压缩后的“口味维度”：原来要用 4 个数描述一个用户（每部电影一个分），现在只用 2 个数。真实场景里 $k$ 常取几十到几百。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    subgraph 原始评分矩阵R
        direction TB
        R1[&amp;#34;用户 × 电影&amp;lt;br/&amp;gt;大部分为空&amp;#34;]
    end

    subgraph 分解
        direction TB
        U[&amp;#34;用户矩阵 U&amp;lt;br/&amp;gt;用户 × 隐因子&amp;#34;]
        V[&amp;#34;电影矩阵 V&amp;lt;br/&amp;gt;隐因子 × 电影&amp;#34;]
    end

    subgraph 预测
        direction TB
        P[&amp;#34;补全后的评分矩阵&amp;lt;br/&amp;gt;R ≈ U × V&amp;#34;]
    end

    R1 --&amp;gt;|矩阵分解| U
    U --&amp;gt; V
    V --&amp;gt; P&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;数学上，我们希望：&lt;/p&gt;
&lt;p&gt;$$
R_{m \times n} \approx U_{m \times k} \cdot V_{k \times n}
$$&lt;/p&gt;
&lt;p&gt;其中每个符号的含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$R$：评分矩阵；$m$ 是用户数，$n$ 是电影数；&lt;/li&gt;
&lt;li&gt;$U$：用户矩阵，它的第 $i$ 行 $u_i$ 是第 $i$ 个用户的口味向量（$k$ 个数）；&lt;/li&gt;
&lt;li&gt;$V$：电影矩阵，它的第 $j$ 列 $v_j$ 是第 $j$ 部电影的风格向量（$k$ 个数）；&lt;/li&gt;
&lt;li&gt;$k$：隐因子维度，比如“动作片程度”“喜剧片程度”；&lt;/li&gt;
&lt;li&gt;$u_i^T v_j$：$u_i$ 转置后乘 $v_j$，就是上面演示的“行 · 列”内积，即预测的评分。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;训练目标是最小化预测评分和真实评分的差距：&lt;/p&gt;
&lt;p&gt;$$
\min_{U,V} \sum_{(i,j) \in \text{已知评分}} (R_{ij} - u_i^T v_j)^2 + \lambda (|U|^2 + |V|^2)
$$&lt;/p&gt;
&lt;p&gt;这行公式的意思是：对所有已知评分 $(i, j)$，让预测值 $u_i^T v_j$ 和真实值 $R_{ij}$ 的差的平方尽量小。最后一项里，$\lambda$（希腊字母 lambda）是一个人为设定的小系数，$|U|^2$ 表示 $U$ 里所有元素的平方和——这一项叫“正则化”，作用是惩罚过大的参数，防止模型死记硬背训练数据（过拟合）。&lt;/p&gt;
&lt;p&gt;这就是推荐系统里最经典的协同过滤思路。&lt;strong&gt;没有线性代数，这个补全问题根本无法优雅表达和求解。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;15-典型场景神经网络里的矩阵乘法&#34;&gt;1.5 典型场景：神经网络里的矩阵乘法&lt;/h3&gt;
&lt;p&gt;一个全连接层可以写成：&lt;/p&gt;
&lt;p&gt;$$
\mathbf{y} = \sigma(W \mathbf{x} + \mathbf{b})
$$&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$\mathbf{x}$ 是输入向量&lt;/li&gt;
&lt;li&gt;$W$ 是权重矩阵&lt;/li&gt;
&lt;li&gt;$\mathbf{b}$ 是偏置向量&lt;/li&gt;
&lt;li&gt;$\sigma$ 是激活函数&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    X[&amp;#34;输入向量 x&amp;#34;] --&amp;gt;|&amp;#34;乘以 W&amp;#34;| WX[&amp;#34;Wx&amp;#34;]
    B[&amp;#34;偏置 b&amp;#34;] --&amp;gt;|&amp;#34;加上&amp;#34;| WX
    WX --&amp;gt;|&amp;#34;激活 σ&amp;#34;| Y[&amp;#34;输出向量 y&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;深度学习的训练，本质上就是不断调整 $W$ 和 $\mathbf{b}$，让输出 $y$ 越来越接近期望值。&lt;/p&gt;
&lt;h3 id=&#34;16-线性代数避坑技巧&#34;&gt;1.6 线性代数避坑技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要死记公式，先画形状&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;矩阵乘法能不能做，先看维度。$(m \times k) \times (k \times n) = (m \times n)$，中间维度必须相同。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;区分“行向量”和“列向量”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很多 bug 来自默认了错误的形状。写代码时打印 &lt;code&gt;shape&lt;/code&gt; 是基本功。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意矩阵乘法和逐元素乘法的区别&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;矩阵乘法：$A \times B$，满足结合律，用于变换。&lt;/li&gt;
&lt;li&gt;逐元素乘法（Hadamard）：$A \odot B$，两个矩阵形状完全一样，对应位置相乘。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要忽视“稀疏矩阵”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;推荐系统、图数据中，90% 以上都是 0。用普通稠密矩阵会爆内存，要学 &lt;code&gt;CSR&lt;/code&gt;、&lt;code&gt;CSC&lt;/code&gt; 等稀疏存储格式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;特征值不是玄学&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在 PageRank 里，网页重要性就是某个矩阵的&lt;strong&gt;最大特征值对应的特征向量&lt;/strong&gt;。理解这一点，看很多算法会有豁然开朗的感觉。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-微积分描述变化与优化&#34;&gt;2. 微积分：描述“变化”与“优化”&lt;/h2&gt;
&lt;h3 id=&#34;21-一句话理解微积分&#34;&gt;2.1 一句话理解微积分&lt;/h3&gt;
&lt;p&gt;微积分研究的是&lt;strong&gt;变化率和累积量&lt;/strong&gt;。对程序员来说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;导数告诉你“往哪走”，积分告诉你“走了多远”。机器学习里最常用的就是导数。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;22-先修复习导数偏导梯度与链式法则&#34;&gt;2.2 先修复习：导数、偏导、梯度与链式法则&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 导数：函数在某点的瞬时变化率&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;函数 $f(x)$ 在某一点的导数，就是曲线在该点的切线斜率——“$x$ 增加一点点，$f(x)$ 会跟着变化多少”。&lt;/p&gt;
&lt;p&gt;以 $f(x) = x^2$ 为例，它的导数是 $f&amp;rsquo;(x) = 2x$（求导规则：$x^n$ 的导数是 $nx^{n-1}$）。在 $x = 3$ 处，$f&amp;rsquo;(3) = 2 \times 3 = 6$，意思是：在 $x = 3$ 附近，$x$ 每增加一小段，$f(x)$ 大约增加这一段的 6 倍。&lt;/p&gt;
&lt;p&gt;验证一下：$x$ 从 3 变成 3.01，$f$ 从 9 变成 $3.01^2 = 9.0601$，增加了 0.0601 ≈ 6 × 0.01。对得上。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 偏导数：多变量时，一次只看一个变量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;函数有多个变量时，对其中一个求导、把其他变量当常数，就是偏导数，符号用 $\partial$（读作“偏”）。比如 $f(x, y) = x^2 + 3y$：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对 $x$ 求偏导：$\frac{\partial f}{\partial x} = 2x$（把 $3y$ 当常数，常数的导数为 0）&lt;/li&gt;
&lt;li&gt;对 $y$ 求偏导：$\frac{\partial f}{\partial y} = 3$（把 $x^2$ 当常数）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;3. 梯度：所有偏导数组成的向量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把每个变量的偏导数排成一个向量，就是梯度，记作 $\nabla f$（符号 $\nabla$ 读作 nabla）。上面的例子里 $\nabla f = [2x, 3]$。&lt;/p&gt;
&lt;p&gt;梯度有一个关键性质：&lt;strong&gt;它指向函数值上升最快的方向&lt;/strong&gt;。所以要求函数的最小值，就要反着梯度的方向走——这就是 2.4 节梯度下降法的全部原理。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 链式法则：复合函数求导，层层相乘&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;函数套函数（复合函数）的导数，等于各层导数相乘。例子：$z = (2x + 1)^2$。&lt;/p&gt;
&lt;p&gt;把它拆成两层：内层 $u = 2x + 1$，外层 $z = u^2$。那么：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;内层导数：$\frac{du}{dx} = 2$&lt;/li&gt;
&lt;li&gt;外层导数：$\frac{dz}{du} = 2u$&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;链式法则：$\frac{dz}{dx} = \frac{dz}{du} \times \frac{du}{dx} = 2u \times 2 = 2(2x+1) \times 2 = 8x + 4$&lt;/p&gt;
&lt;p&gt;代入 $x = 1$：$\frac{dz}{dx} = 12$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这和工程应用有什么关系？&lt;/strong&gt; 神经网络就是几十层函数套函数，链式法则让“对每一层参数求导”变成一次从后往前的乘法传递——这就是 2.5 节反向传播在做的事。&lt;/p&gt;
&lt;h3 id=&#34;23-核心概念速查&#34;&gt;2.3 核心概念速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;概念&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;程序员直觉&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;软件行业用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;导数&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;函数在某点的变化率&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;梯度下降、敏感度分析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;偏导数&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;多变量函数中一个变量的变化率&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;神经网络反向传播&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;梯度&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;所有偏导数组成的向量&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;指向函数增长最快的方向&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;链式法则&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;复合函数求导规则&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;反向传播算法的核心&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;积分&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;变化率的累积&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;概率密度、面积、物理模拟&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;24-典型场景梯度下降法&#34;&gt;2.4 典型场景：梯度下降法&lt;/h3&gt;
&lt;p&gt;几乎所有机器学习训练，最后都在解一个优化问题：&lt;/p&gt;
&lt;p&gt;$$
\min_\theta L(\theta)
$$&lt;/p&gt;
&lt;p&gt;其中 $L$ 是损失函数，$\theta$ 是模型参数。&lt;/p&gt;
&lt;p&gt;梯度下降的更新规则：&lt;/p&gt;
&lt;p&gt;$$
\theta_{\text{新}} = \theta_{\text{旧}} - \eta \cdot \nabla L(\theta_{\text{旧}})
$$&lt;/p&gt;
&lt;p&gt;其中 $\eta$ 是学习率，$\nabla L$ 是梯度。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[初始化参数 θ] --&amp;gt; B[计算当前损失 L]
    B --&amp;gt; C[求梯度 ∇L]
    C --&amp;gt; D{梯度足够小?}
    D --&amp;gt;|否| E[沿负梯度方向更新 θ]
    E --&amp;gt; B
    D --&amp;gt;|是| F[得到近似最优解]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;用下山来比喻：你蒙着眼睛站在山坡上，每一步都朝&lt;strong&gt;最陡的下降方向&lt;/strong&gt;走一小步，重复多次就能到达山谷。&lt;/p&gt;
&lt;h3 id=&#34;25-典型场景反向传播&#34;&gt;2.5 典型场景：反向传播&lt;/h3&gt;
&lt;p&gt;神经网络的层数很多，直接对每个参数求导非常麻烦。反向传播用&lt;strong&gt;链式法则&lt;/strong&gt;，从输出层往输入层一层一层传误差。&lt;/p&gt;
&lt;p&gt;比如一个简单网络：&lt;/p&gt;
&lt;p&gt;$$
z = f(y), \quad y = g(x), \quad x = h(w)
$$&lt;/p&gt;
&lt;p&gt;求 $z$ 对 $w$ 的导数：&lt;/p&gt;
&lt;p&gt;$$
\frac{\partial z}{\partial w} = \frac{\partial z}{\partial y} \cdot \frac{\partial y}{\partial x} \cdot \frac{\partial x}{\partial w}
$$&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    w[&amp;#34;参数 w&amp;#34;] --&amp;gt; x[&amp;#34;x = h(w)&amp;#34;]
    x --&amp;gt; y[&amp;#34;y = g(x)&amp;#34;]
    y --&amp;gt; z[&amp;#34;z = f(y)&amp;#34;]
    z --&amp;gt;|&amp;#34;∂z/∂y&amp;#34;| y
    y --&amp;gt;|&amp;#34;∂y/∂x&amp;#34;| x
    x --&amp;gt;|&amp;#34;∂x/∂w&amp;#34;| w&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这就是深度学习的训练能高效进行的原因。&lt;strong&gt;链式法则让“百亿（billion）级别参数的求导”变得可行。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;26-微积分避坑技巧&#34;&gt;2.6 微积分避坑技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;梯度方向是“上升最快”，要加负号&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;求最小值时，更新公式里是 $-\eta \nabla L$，不是 $+\eta \nabla L$。符号搞反，损失会越来越大。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;学习率太大或太小都是灾难&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;太大：在最低点附近震荡，甚至发散。&lt;/li&gt;
&lt;li&gt;太小：收敛极慢，浪费算力。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[学习率 η 太大] --&amp;gt; B[震荡/不收敛]
    C[学习率 η 太小] --&amp;gt; D[收敛极慢]
    E[学习率 η 合适] --&amp;gt; F[稳定收敛]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不是所有函数都能简单求导&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;离散函数、不可导函数（如 ReLU 在 0 点）需要特殊处理。ReLU 的导数在 0 点通常直接定义为 0 或 1。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要手动推导每一层梯度&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现代框架（PyTorch、TensorFlow）都有自动微分。先理解原理，再交给框架。但&lt;strong&gt;原理不懂，调参就是瞎调&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;区分“局部最小”和“全局最小”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;梯度下降只能保证找到局部最小。深度学习中，很多局部最小其实差距不大，不必过度纠结。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-概率论处理不确定性&#34;&gt;3. 概率论：处理“不确定性”&lt;/h2&gt;
&lt;h3 id=&#34;31-一句话理解概率论&#34;&gt;3.1 一句话理解概率论&lt;/h3&gt;
&lt;p&gt;概率论研究的是&lt;strong&gt;不确定性&lt;/strong&gt;。对程序员来说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;当输入有噪声、数据不完整、结果不唯一时，概率论是最自然的建模语言。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;32-先修复习概率条件概率贝叶斯期望与方差&#34;&gt;3.2 先修复习：概率、条件概率、贝叶斯、期望与方差&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 概率：0 到 1 之间的数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$P(A)$ 表示事件 $A$ 发生的可能性：0 是不可能，1 是必然，0.5 是五五开。掷一次骰子，掷出 6 的概率 $P(6) = 1/6$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 条件概率：B 已经发生时，A 的概率&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$P(A \mid B)$ 读作“在 $B$ 发生的条件下 $A$ 的概率”，竖线右边是已知条件。用一张小表格算一遍：统计 100 封邮件——&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;含“免费”&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;不含“免费”&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;合计&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;垃圾邮件&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;30&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;10&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;40&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;正常邮件&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;5&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;55&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;60&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;合计&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;35&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;65&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;100&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;问：一封邮件含“免费”这个词，它是垃圾邮件的概率是多少？&lt;/p&gt;
&lt;p&gt;条件概率的算法是：&lt;strong&gt;只在符合条件的样本里算比例&lt;/strong&gt;。含“免费”的共 35 封，其中垃圾邮件 30 封：&lt;/p&gt;
&lt;p&gt;$$
P(\text{垃圾} \mid \text{含“免费”}) = \frac{30}{35} \approx 85.7%
$$&lt;/p&gt;
&lt;p&gt;对比一下：不看任何条件时，$P(\text{垃圾}) = 40/100 = 40%$。“含免费”这个条件把概率从 40% 拉到了 85.7%——这就是 3.4 节垃圾邮件过滤器在做的事。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 贝叶斯定理：由结果反推原因&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;贝叶斯定理：&lt;/p&gt;
&lt;p&gt;$$
P(A \mid B) = \frac{P(B \mid A) \cdot P(A)}{P(B)}
$$&lt;/p&gt;
&lt;p&gt;用经典疾病检测例子算一遍。假设：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;某病患病率 $P(\text{患病}) = 1%$&lt;/li&gt;
&lt;li&gt;检测准确率 99%：患病者 99% 检出阳性，健康者 99% 检出阴性（即 1% 被误报为阳性）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;问：一个人检测为阳性，他真的患病的概率是多少？&lt;/p&gt;
&lt;p&gt;直觉会说 99%，但实际算一下。想象 10000 个人：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;真患病：$10000 \times 1% = 100$ 人，其中检出阳性 $100 \times 99% = 99$ 人；&lt;/li&gt;
&lt;li&gt;健康：9900 人，其中误报阳性 $9900 \times 1% = 99$ 人。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;阳性一共 $99 + 99 = 198$ 人，真患病的只有 99 人：&lt;/p&gt;
&lt;p&gt;$$
P(\text{患病} \mid \text{阳性}) = \frac{99}{198} = 50%
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;远低于直觉的 99%。&lt;/strong&gt; 原因是病人基数太小（1%），健康人群的误报凑出了一半的阳性。这就是为什么医学筛查阳性后还要复查，也是贝叶斯定理最反直觉、最实用的一课。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 期望：长期平均值&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;期望 $E(X)$ 是“重复无数次后的平均结果”。掷骰子：&lt;/p&gt;
&lt;p&gt;$$
E(X) = 1\times\frac{1}{6} + 2\times\frac{1}{6} + 3\times\frac{1}{6} + 4\times\frac{1}{6} + 5\times\frac{1}{6} + 6\times\frac{1}{6} = \frac{21}{6} = 3.5
$$&lt;/p&gt;
&lt;p&gt;骰子永远掷不出 3.5，但掷一万次的平均值会非常接近 3.5。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. 方差：波动程度&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;期望相同的两个随机变量，稳定性可能天差地别。方差衡量“结果偏离期望有多远”：每个值减去期望、平方、再平均。比如三个数 1、2、3，期望是 2，方差 $= \frac{(1-2)^2 + (2-2)^2 + (3-2)^2}{3} = \frac{2}{3} \approx 0.67$。方差越大，波动越剧烈。风险评估里“期望收益相同、方差更小”的方案就是更稳的方案。&lt;/p&gt;
&lt;h3 id=&#34;33-核心概念速查&#34;&gt;3.3 核心概念速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;概念&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;程序员直觉&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;软件行业用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;概率&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;某件事发生的可能性&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;垃圾邮件识别、点击率预测&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;条件概率&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;已知某事发生，另一事发生的概率&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;贝叶斯分类、推荐系统&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;贝叶斯定理&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;由结果反推原因&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;垃圾邮件过滤、医疗诊断&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;期望&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;长期平均结果&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;A/B 测试、收益评估&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;方差/标准差&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;结果的波动程度&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;风险评估、模型稳定性&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;大数定律&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;样本越多，估计越准&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;实验设计、蒙特卡洛模拟&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;正态分布&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;最常见的“钟形”分布&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;误差建模、异常检测&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;34-典型场景朴素贝叶斯垃圾邮件过滤&#34;&gt;3.4 典型场景：朴素贝叶斯垃圾邮件过滤&lt;/h3&gt;
&lt;p&gt;假设收到一封邮件，里面出现了“免费”“中奖”“点击”等词。我们想判断它是垃圾邮件的概率：&lt;/p&gt;
&lt;p&gt;$$
P(\text{垃圾} \mid \text{词}) = \frac{P(\text{词} \mid \text{垃圾}) \cdot P(\text{垃圾})}{P(\text{词})}
$$&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$P(\text{垃圾})$ 是训练集中垃圾邮件的比例&lt;/li&gt;
&lt;li&gt;$P(\text{词} \mid \text{垃圾})$ 是垃圾邮件里出现这些词的概率&lt;/li&gt;
&lt;li&gt;$P(\text{垃圾} \mid \text{词})$ 是看到这封邮件后它是垃圾邮件的概率&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[收集大量邮件] --&amp;gt; B[统计每个词在垃圾/正常邮件中出现的频率]
    B --&amp;gt; C[新邮件到达]
    C --&amp;gt; D[提取关键词]
    D --&amp;gt; E[用贝叶斯公式计算概率]
    E --&amp;gt; F{P &amp;gt; 阈值?}
    F --&amp;gt;|是| G[判定为垃圾邮件]
    F --&amp;gt;|否| H[判定为正常邮件]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这是《数学之美》里非常经典的例子。&lt;strong&gt;它把“理解邮件含义”转化成了“统计词频”&lt;/strong&gt;，这正是概率论的魅力。&lt;/p&gt;
&lt;h3 id=&#34;35-典型场景语言模型与-n-gram&#34;&gt;3.5 典型场景：语言模型与 N-gram&lt;/h3&gt;
&lt;p&gt;搜索引擎、输入法、语音识别都要预测“下一个词最可能是什么”。&lt;/p&gt;
&lt;p&gt;N-gram 模型假设：下一个词只和前 N-1 个词有关。比如二元模型（bigram）：&lt;/p&gt;
&lt;p&gt;$$
P(w_n \mid w_1, w_2, \dots, w_{n-1}) \approx P(w_n \mid w_{n-1})
$$&lt;/p&gt;
&lt;p&gt;通过统计语料中词对出现的频率来估计概率：&lt;/p&gt;
&lt;p&gt;$$
P(w_n \mid w_{n-1}) = \frac{\text{count}(w_{n-1}, w_n)}{\text{count}(w_{n-1})}
$$&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[&amp;#34;历史词 w_{n-1}&amp;#34;] --&amp;gt; B[统计所有接在后面的词]
    B --&amp;gt; C[计算条件概率]
    C --&amp;gt; D[选择概率最大的词作为预测]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;现代大语言模型虽然用神经网络替代了 N-gram，但核心目标没变：&lt;strong&gt;最大化下一个词的预测概率&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;36-概率论避坑技巧&#34;&gt;3.6 概率论避坑技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要把“概率高”等同于“一定发生”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;模型说某件事概率 99%，也不代表绝对。工程上永远要留兜底逻辑。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意“条件概率”的方向&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$P(A \mid B)$ 和 $P(B \mid A)$ 完全不一样。看到症状推疾病，和知道疾病推症状，是两回事。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据稀疏是大问题&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;没见过的词不能直接算概率为 0，要用&lt;strong&gt;平滑技术&lt;/strong&gt;（如拉普拉斯平滑）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;小心“独立同分布”假设&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;很多模型假设数据独立同分布（i.i.d.），但真实世界往往不是。时间序列、推荐系统中的用户行为都有相关性。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;概率模型需要大量数据&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;数据量不够时，统计模型效果往往不如规则系统。先用规则跑起来，再逐步引入概率模型。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;4-信息论量化信息量&#34;&gt;4. 信息论：量化“信息量”&lt;/h2&gt;
&lt;h3 id=&#34;41-一句话理解信息论&#34;&gt;4.1 一句话理解信息论&lt;/h3&gt;
&lt;p&gt;信息论研究的是&lt;strong&gt;如何度量、传输和压缩信息&lt;/strong&gt;。对程序员来说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;信息论告诉我们：一个消息有多“意外”，就有多少信息量。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;42-先修复习log信息量与熵&#34;&gt;4.2 先修复习：log₂、信息量与熵&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. log₂ 的直觉：猜几次能猜中？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$\log_2 n$ 回答的问题是：“$n$ 个可能性，用二分法猜几次能锁定答案？” 玩猜数字游戏：我心里想一个 1-8 的数，你每次问“比 $x$ 大吗”，3 次一定能猜中（8 → 4 → 2 → 1）。所以 $\log_2 8 = 3$。这和程序员的二分查找是同一回事：在 8 个元素的有序数组里查找，最多比较 3 次。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 信息量：越意外，信息量越大&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;一个事件的信息量定义为 $-\log_2 P$，单位是 bit（比特），$P$ 是这个事件发生的概率。$P$ 越小（越意外），信息量越大：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公平硬币掷出正面：$P = 1/2$，信息量 $= -\log_2 \frac{1}{2} = 1$ bit；&lt;/li&gt;
&lt;li&gt;一个概率 $P = 1/8$ 的事件发生：信息量 $= -\log_2 \frac{1}{8} = 3$ bit。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;直觉：掷出正面没什么可惊讶的（1 bit 就够记录），8 选 1 猜中则值得多记几笔（3 bit）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 熵：平均信息量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;熵 $H(X)$ 是“平均每次能获得多少信息量”：把每种结果的“概率 × 信息量”加起来：&lt;/p&gt;
&lt;p&gt;$$
H(X) = -\sum_i P(x_i) \log_2 P(x_i)
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;完整算一遍公平硬币的熵。&lt;/strong&gt; 两种结果，概率各 1/2：&lt;/p&gt;
&lt;p&gt;$$
H = -\left( \tfrac{1}{2} \log_2 \tfrac{1}{2} + \tfrac{1}{2} \log_2 \tfrac{1}{2} \right) = -\left( \tfrac{1}{2} \times (-1) + \tfrac{1}{2} \times (-1) \right) = 1 \text{ bit}
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;再算一枚偏倚硬币&lt;/strong&gt;（正面 90%、反面 10%，查表或按计算器可得 $\log_2 0.9 \approx -0.152$，$\log_2 0.1 \approx -3.322$）：&lt;/p&gt;
&lt;p&gt;$$
H = -\left( 0.9 \times (-0.152) + 0.1 \times (-3.322) \right) = 0.137 + 0.332 \approx 0.47 \text{ bit}
$$&lt;/p&gt;
&lt;p&gt;偏倚硬币的结果更好猜（大概率是正面），不确定性低，所以熵只有约 0.47 bit，不到公平硬币的一半。&lt;strong&gt;熵最大的时候，就是所有结果等可能的时候。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这和工程应用有什么关系？&lt;/strong&gt; 熵给出了无损压缩的理论下限（4.4 节），交叉熵则是拿这个“平均信息量”的框架去衡量模型预测和真实标签的差距（4.5 节）。&lt;/p&gt;
&lt;h3 id=&#34;43-核心概念速查&#34;&gt;4.3 核心概念速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;概念&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;程序员直觉&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;软件行业用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;信息量&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;一个事件带来的“惊讶程度”&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;异常检测、日志告警&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;熵（Entropy）&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;不确定性的平均值&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;决策树、特征选择、压缩&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;交叉熵&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;模型分布与真实分布的差距&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;分类损失函数&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;KL 散度&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;两个分布有多“不像”&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;生成模型、变分推断&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;互信息&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;两个变量共享多少信息&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;特征选择、关联分析&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;44-典型场景熵与数据压缩&#34;&gt;4.4 典型场景：熵与数据压缩&lt;/h3&gt;
&lt;p&gt;熵描述的是一个随机变量的平均信息量。对于离散随机变量 $X$：&lt;/p&gt;
&lt;p&gt;$$
H(X) = -\sum_{i} P(x_i) \log P(x_i)
$$&lt;/p&gt;
&lt;p&gt;举个例子：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果某事件必然发生（$P=1$），熵为 0，因为毫无信息量。&lt;/li&gt;
&lt;li&gt;如果硬币正反概率各 0.5，熵最大，因为最不确定。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[原始数据] --&amp;gt; B[计算符号频率]
    B --&amp;gt; C[估算熵 H]
    C --&amp;gt; D[设计编码&amp;lt;br/&amp;gt;高频短码、低频长码]
    D --&amp;gt; E[压缩后的数据]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;哈夫曼编码就是根据频率构造最优前缀码，让平均编码长度接近熵。ZIP、MP3、JPEG 背后都有信息论的影子。&lt;/p&gt;
&lt;h3 id=&#34;45-典型场景交叉熵损失函数&#34;&gt;4.5 典型场景：交叉熵损失函数&lt;/h3&gt;
&lt;p&gt;分类任务中，模型输出一个概率分布 $\hat{y}$，真实标签是 $y$。交叉熵衡量两者差异：&lt;/p&gt;
&lt;p&gt;$$
H(y, \hat{y}) = -\sum_{i} y_i \log \hat{y}_i
$$&lt;/p&gt;
&lt;p&gt;在二分类中简化为：&lt;/p&gt;
&lt;p&gt;$$
L = -\left[ y \log \hat{y} + (1-y) \log(1-\hat{y}) \right]
$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么用交叉熵而不是均方误差？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;因为交叉熵对“模型很有信心但错了”的情况惩罚更大，能让分类器学得更果断。&lt;/p&gt;
&lt;h3 id=&#34;46-信息论避坑技巧&#34;&gt;4.6 信息论避坑技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;熵大不一定“信息多”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;熵大只代表不确定性高。如果全是噪声，熵也很大，但没有价值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;log 的底数要看场景&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;信息论里常用以 2 为底（单位 bit），机器学习里常用自然对数（单位 nat）。比较时要注意统一。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;交叉熵损失要配合 softmax&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;多分类时，模型最后一层通常是 softmax + 交叉熵。不要漏了 softmax。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;KL 散度不对称&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;$D_{KL}(P | Q) \neq D_{KL}(Q | P)$。写代码和解释结果时要注意方向。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;信息论是“上限”不是“下限”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;熵给出的是无损压缩的理论下限。实际压缩算法由于实现复杂度，往往达不到这个下限。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;5-统计学与数据思维从数据中提炼规律&#34;&gt;5. 统计学与数据思维：从数据中提炼规律&lt;/h2&gt;
&lt;h3 id=&#34;51-一句话理解统计学&#34;&gt;5.1 一句话理解统计学&lt;/h3&gt;
&lt;p&gt;概率论是“从模型推数据”，统计学是“从数据推模型”。对程序员来说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;统计学让你知道：手里的数据能告诉我们什么、不能告诉我们什么。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;52-先修复习总体与样本均值中位数方差置信区间&#34;&gt;5.2 先修复习：总体与样本、均值、中位数、方差、置信区间&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 总体 vs 样本&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;总体是你想研究的全部对象（比如“所有用户”），样本是你实际拿到的一小部分（比如“昨天活跃的一万名用户”）。统计学的全部工作，就是用样本去估计总体，并说清楚这个估计有多靠谱。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. 均值与中位数：谁更抗揍？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;5 个数的小例子：某功能 5 个用户的日使用时长（分钟）——&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;3, 5, 4, 6, 100&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;ul&gt;
&lt;li&gt;均值：$(3 + 5 + 4 + 6 + 100) \div 5 = 118 \div 5 = 23.6$&lt;/li&gt;
&lt;li&gt;中位数：排序后取中间那个。排序为 &lt;code&gt;3, 4, 5, 6, 100&lt;/code&gt;，中位数是 5&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;均值 23.6 被 100 这个极端值（可能是挂机用户）严重拉偏，中位数 5 稳如泰山。&lt;strong&gt;看收入、时长这类分布时，中位数往往比均值更诚实。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 方差与标准差：波动有多大？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;还是用上面 5 个数（均值 23.6）。方差 = 每个数减均值、平方、再平均：&lt;/p&gt;
&lt;p&gt;$$
\frac{(3-23.6)^2 + (5-23.6)^2 + (4-23.6)^2 + (6-23.6)^2 + (100-23.6)^2}{5} = \frac{424.36 + 345.96 + 384.16 + 309.76 + 5836.96}{5} = \frac{7301.2}{5} = 1460.24
$$&lt;/p&gt;
&lt;p&gt;标准差 = 方差开平方：$\sqrt{1460.24} \approx 38.2$。标准差的好处是单位和原数据一致（分钟），可以直接说“波动大约 ±38 分钟”。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 置信区间：估计值 ± 误差范围&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;单给一个估计值是不负责任的，要带上误差范围。比如“新方案转化率为 5% ± 1%（95% 置信区间）”，意思是真实转化率大概率落在 4% - 6% 之间。区间越窄，估计越可靠；想让区间变窄，就得加大样本量——这就是 5.4 节 A/B 测试背后在算的事。&lt;/p&gt;
&lt;h3 id=&#34;53-核心概念速查&#34;&gt;5.3 核心概念速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;概念&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;程序员直觉&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;软件行业用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;采样&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;从整体中抽一部分观察&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;A/B 测试、日志抽样&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;大数定律&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;样本越多，估计越稳定&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;实验样本量设计&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;中心极限定理&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;样本均值趋向正态分布&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;置信区间、假设检验&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;置信区间&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;估计的不确定性范围&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;转化率评估&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;假设检验&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;判断差异是否显著&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;实验效果验证&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;过拟合/欠拟合&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;模型太复杂或太简单&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;调参、正则化&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;54-典型场景ab-测试&#34;&gt;5.4 典型场景：A/B 测试&lt;/h3&gt;
&lt;p&gt;产品改了一个按钮颜色，想知道转化率有没有提升。直接看“实验组转化率 5%，对照组 4%”不够，因为可能是随机波动。&lt;/p&gt;
&lt;p&gt;统计学要做的是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;计算两组差异的标准误。&lt;/li&gt;
&lt;li&gt;做假设检验，看差异是否显著。&lt;/li&gt;
&lt;li&gt;给出置信区间，比如“提升 0.8% - 1.2%”。&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[提出假设] --&amp;gt; B[随机分流用户]
    B --&amp;gt; C[收集实验数据]
    C --&amp;gt; D[计算指标与置信区间]
    D --&amp;gt; E{差异是否显著?}
    E --&amp;gt;|是| F[上线新方案]
    E --&amp;gt;|否| G[保持原方案/重新设计]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;没有统计学，A/B 测试的结论很容易变成“拍脑袋”。&lt;/p&gt;
&lt;h3 id=&#34;55-典型场景平滑技术&#34;&gt;5.5 典型场景：平滑技术&lt;/h3&gt;
&lt;p&gt;N-gram 或朴素贝叶斯中，总会遇到训练集中没出现过的词或组合。如果直接算概率为 0，模型就会失效。&lt;/p&gt;
&lt;p&gt;拉普拉斯平滑（加一平滑）是最简单的方法：&lt;/p&gt;
&lt;p&gt;$$
P(w_n \mid w_{n-1}) = \frac{\text{count}(w_{n-1}, w_n) + 1}{\text{count}(w_{n-1}) + V}
$$&lt;/p&gt;
&lt;p&gt;其中 $V$ 是词表大小。它给每个未出现事件分配了一个很小的概率。&lt;/p&gt;
&lt;p&gt;更高级的平滑方法还有 Good-Turing、Kneser-Ney 等。《数学之美》里强调：&lt;strong&gt;数据稀疏是统计自然语言处理的核心难题之一&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&#34;56-统计学避坑技巧&#34;&gt;5.6 统计学避坑技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;相关性不等于因果性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;两个指标同时上涨，不一定是一个导致另一个。要用实验设计或因果推断方法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;样本量不足时结论不可信&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;看 100 个用户的实验结果，和看 10 万个用户的实验结果，说服力完全不同。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意幸存者偏差&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;只看到“活下来”的数据，会高估成功率。比如只分析活跃用户，会忽略流失用户。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;异常值可能毁掉统计结果&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;平均值对极端值很敏感。分析数据时要看中位数、分位数，不要只看平均。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;训练集和测试集要分开&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在训练数据上表现好，不代表在真实数据上也好。交叉验证是基本操作。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;6-图论与离散数学描述状态与连接&#34;&gt;6. 图论与离散数学：描述“状态”与“连接”&lt;/h2&gt;
&lt;h3 id=&#34;61-一句话理解图论&#34;&gt;6.1 一句话理解图论&lt;/h3&gt;
&lt;p&gt;图论研究的是&lt;strong&gt;节点和节点之间的连接&lt;/strong&gt;。对程序员来说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;只要问题能画成“点”和“线”，就可以用图论来解决。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;62-先修复习节点边度与图的两种存法&#34;&gt;6.2 先修复习：节点、边、度与图的两种存法&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 基本概念&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;节点（顶点）：图里的“点”，可以代表人、网页、城市；&lt;/li&gt;
&lt;li&gt;边：节点之间的“连线”，代表关系；&lt;/li&gt;
&lt;li&gt;有向 vs 无向：微博“关注”是有向的（你关注他，他不一定关注你），微信好友是无向的；&lt;/li&gt;
&lt;li&gt;权重：边上挂的数字，比如两个城市之间的距离。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 一个 3 节点小图的两种表示&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设一个无向图：A 和 B 之间有一条权重 2 的边，A 和 C 之间有一条权重 5 的边，B 和 C 之间没有边。&lt;/p&gt;
&lt;p&gt;邻接矩阵：用一张 $3 \times 3$ 的表，第 $i$ 行第 $j$ 列存节点 $i$ 到节点 $j$ 的边权，0 表示没边：&lt;/p&gt;
&lt;p&gt;$$
\begin{bmatrix} 0 &amp;amp; 2 &amp;amp; 5 \\ 2 &amp;amp; 0 &amp;amp; 0 \\ 5 &amp;amp; 0 &amp;amp; 0 \end{bmatrix}
$$&lt;/p&gt;
&lt;p&gt;（无向图的邻接矩阵一定是对称的。）&lt;/p&gt;
&lt;p&gt;邻接表：每个节点挂一个列表，只记录真实存在的边：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;A → [(B, 2), (C, 5)]
B → [(A, 2)]
C → [(A, 5)]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;该用哪种？&lt;/strong&gt; 邻接矩阵查询快但占 $n^2$ 空间（$n$ 是节点数），适合边很多的稠密图；邻接表只占和“节点数 + 边数”成正比的空间，适合边很少的稀疏图。社交网络这种“人均几百好友”的图就是稀疏图，工程上基本都用邻接表。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 度：一个节点有几条边&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;度 = 连在一个节点上的边的数量。上面的图里：A 的度是 2，B 和 C 的度都是 1。有向图还要分入度（多少条边指向我）和出度（我指向多少条边）——6.4 节 PageRank 里“被多少重要网页链接”，数的就是入度。&lt;/p&gt;
&lt;h3 id=&#34;63-核心概念速查&#34;&gt;6.3 核心概念速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;概念&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;程序员直觉&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;软件行业用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;图&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;节点 + 边&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;社交网络、网页链接、知识图谱&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;最短路径&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;两点之间代价最小的路径&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;地图导航、网络路由&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;拓扑排序&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;有依赖关系的任务排序&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;编译依赖、工作流调度&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;有限状态机&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;系统在有限状态间转移&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;正则表达式、协议设计&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;Trie 树&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;前缀树&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;搜索引擎提示、自动补全&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;64-典型场景网页排名与-pagerank&#34;&gt;6.4 典型场景：网页排名与 PageRank&lt;/h3&gt;
&lt;p&gt;互联网可以看作一张有向图：网页是节点，超链接是边。&lt;/p&gt;
&lt;p&gt;PageRank 的核心思想：&lt;strong&gt;一个网页的重要性，取决于链接到它的网页有多重要&lt;/strong&gt;。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[网页 A] --&amp;gt; B[网页 B]
    C[网页 C] --&amp;gt; B
    B --&amp;gt; D[网页 D]
    D --&amp;gt; A&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;数学上，PageRank 向量 $\mathbf{r}$ 满足：&lt;/p&gt;
&lt;p&gt;$$
\mathbf{r} = d M \mathbf{r} + \frac{1-d}{N} \mathbf{1}
$$&lt;/p&gt;
&lt;p&gt;其中 $M$ 是转移矩阵，$d$ 是阻尼系数（通常取 0.85），$N$ 是网页总数。&lt;/p&gt;
&lt;p&gt;这个公式同时用到了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图论&lt;/strong&gt;：网页链接关系&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;线性代数&lt;/strong&gt;：转移矩阵和特征向量&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概率论&lt;/strong&gt;：随机冲浪模型&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;65-典型场景有限状态机在词法分析中的应用&#34;&gt;6.5 典型场景：有限状态机在词法分析中的应用&lt;/h3&gt;
&lt;p&gt;编译器识别一个标识符、数字或关键字时，用的就是有限状态机（FSM）。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    S0[开始] --&amp;gt;|字母| S1[标识符]
    S1 --&amp;gt;|字母/数字| S1
    S0 --&amp;gt;|数字| S2[数字]
    S2 --&amp;gt;|数字| S2&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;正则表达式的底层也可以用有限状态机实现。理解 FSM，对写解析器、协议状态机都非常有帮助。&lt;/p&gt;
&lt;h3 id=&#34;66-图论避坑技巧&#34;&gt;6.6 图论避坑技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;图不一定是对称的&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;网页链接、关注关系都是有向图。不要用无向图的算法硬套。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意自环和重边&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;实现图算法时，自环节点和多条边会影响结果，要提前处理。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;大图要考虑存储方式&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;邻接矩阵适合稠密图，邻接表适合稀疏图。百亿级别边必须用分布式图计算框架。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;状态机要覆盖所有输入&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;设计 FSM 时，每个状态对每个可能输入都要有定义，否则会出现未定义行为。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;最短路径算法要选对&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dijkstra：无负权边，单源最短路。&lt;/li&gt;
&lt;li&gt;Bellman-Ford：有负权边。&lt;/li&gt;
&lt;li&gt;Floyd：多源最短路。&lt;/li&gt;
&lt;li&gt;BFS：无权图最短路。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;7-优化算法在复杂空间中找到好答案&#34;&gt;7. 优化算法：在复杂空间中找到“好答案”&lt;/h2&gt;
&lt;h3 id=&#34;71-一句话理解优化算法&#34;&gt;7.1 一句话理解优化算法&lt;/h3&gt;
&lt;p&gt;优化算法研究的是&lt;strong&gt;如何高效地找到最优或近似最优解&lt;/strong&gt;。对程序员来说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;很多问题没有闭式解，必须用迭代方法一步步逼近答案。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;72-先修复习优化三要素为什么迭代记忆化与贪心&#34;&gt;7.2 先修复习：优化三要素、为什么迭代、记忆化与贪心&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;1. 优化问题的三要素&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;任何优化问题都可以拆成三件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;变量：你能调的东西（比如模型的参数）；&lt;/li&gt;
&lt;li&gt;目标函数：你想最大化或最小化的东西（比如“预测误差最小”）；&lt;/li&gt;
&lt;li&gt;约束：不能违反的条件（比如“预算不超过 100 万”）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 为什么没有一步到位的公式？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;中学解方程 $x^2 - 2x = 0$ 有求根公式，一步到位。但真实问题的目标函数往往太复杂（几亿个变量、函数嵌套几十层），不存在能直接写出答案的公式（闭式解），只能“迭代逼近”：先随便猜一个答案，算一算离最优还差多远、该往哪个方向调，调完再算，循环成千上万次。梯度下降、EM 算法都是这种思路。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 动态规划：记住算过的，别重复算&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用斐波那契数列（$f(n) = f(n-1) + f(n-2)$，$f(1) = f(2) = 1$）对比两种算法。朴素递归算 $f(5)$：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;f(5) = f(4) + f(3)
f(4) = f(3) + f(2)   ← f(3) 第二次出现
f(3) = f(2) + f(1)   ← f(2) 也被反复重算&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;$f(3)$ 被完整重算了 2 次，$f(2)$ 被重算 3 次；$n$ 稍大一点，重复计算就爆炸式增长。动态规划（记忆化）的做法：算过的结果存进数组，下次直接查表，每个 $f(i)$ 只算一次，$n$ 步搞定。&lt;strong&gt;“存在重复子问题”是判断能不能用 DP 的标志。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. 贪心：每步拿当前最好&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;贪心算法的直觉：每走一步都选眼前最好的选择，不回看、不后悔。比如用 1 元、5 角、1 角的硬币凑 1.8 元：先拿 1 元（能拿的最大面额），再拿 5 角，再拿 3 个 1 角。很多场景贪心足够好（7.4 节分词里的局部最优选择就有它的影子），但要注意它不一定能得到全局最优。&lt;/p&gt;
&lt;h3 id=&#34;73-核心概念速查&#34;&gt;7.3 核心概念速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;算法&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;核心思想&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;软件行业用途&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;梯度下降&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;沿负梯度方向更新&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;深度学习训练&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;动态规划&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;把大问题拆成重叠子问题&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;最短路径、编辑距离、分词&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;贪心算法&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;每步选局部最优&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;哈夫曼编码、活动安排&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;EM 算法&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;期望-最大化迭代&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;隐变量模型、聚类&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;维特比算法&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;动态规划找最优路径&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;语音识别、HMM 解码&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;74-典型场景动态规划做中文分词&#34;&gt;7.4 典型场景：动态规划做中文分词&lt;/h3&gt;
&lt;p&gt;中文分词没有天然空格，需要判断“结合成/分子/情况”还是“结合/成分/子情况”。&lt;/p&gt;
&lt;p&gt;一种简单思路是：把句子切成词序列，让整体概率最大。&lt;/p&gt;
&lt;p&gt;$$
\text{最佳切分} = \arg\max_{\text{切分方式}} P(\text{切分方式} \mid \text{句子})
$$&lt;/p&gt;
&lt;p&gt;用动态规划可以高效求解：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[句子起始] --&amp;gt; B[考虑第一个词]
    B --&amp;gt; C[剩余子问题]
    C --&amp;gt; D[递归求解]
    D --&amp;gt; E[取概率最大的路径]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;例如“研究生命”可以切成“研究/生命”或“研究生/命”。统计语言模型会选概率更高的切分。&lt;/p&gt;
&lt;h3 id=&#34;75-典型场景维特比算法与语音识别&#34;&gt;7.5 典型场景：维特比算法与语音识别&lt;/h3&gt;
&lt;p&gt;语音识别的任务是：给定声学信号，找出最可能的文字序列。&lt;/p&gt;
&lt;p&gt;Hidden Markov Model（HMM）把这个问题建模为：&lt;/p&gt;
&lt;p&gt;$$
\hat{W} = \arg\max_W P(W \mid \text{声学信号}) = \arg\max_W P(\text{声学信号} \mid W) \cdot P(W)
$$&lt;/p&gt;
&lt;p&gt;维特比算法用动态规划，在状态序列中找出概率最大的路径，避免枚举所有可能。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    A[声学特征序列] --&amp;gt; B[每个时刻计算各状态概率]
    B --&amp;gt; C[只保留到达每个状态的最优路径]
    C --&amp;gt; D[递推到最后一帧]
    D --&amp;gt; E[回溯得到最优词序列]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;76-优化算法避坑技巧&#34;&gt;7.6 优化算法避坑技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;动态规划要能定义“状态”和“转移”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不是所有问题都适合 DP。关键是找到无后效性的子问题。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;贪心算法不一定最优&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;贪心只在具有“最优子结构”和“贪心选择性质”的问题上才能得到全局最优。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;EM 算法对初始值敏感&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不同的初始化可能收敛到不同的局部最优。通常需要多次随机初始化。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要迷信“最优”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;工程上很多时候“足够好”比“理论最优”更重要。启发式算法往往更实用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;注意时间复杂度&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;动态规划虽然比暴力快，但状态空间太大时也会超时。要会分析复杂度。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;8-nlp-中的数学让机器理解语言&#34;&gt;8. NLP 中的数学：让机器“理解”语言&lt;/h2&gt;
&lt;h3 id=&#34;81-一句话理解-nlp-数学&#34;&gt;8.1 一句话理解 NLP 数学&lt;/h3&gt;
&lt;p&gt;自然语言处理的核心数学问题是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;把离散的、有歧义的语言，转化为可以计算的概率或向量。&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;82-先修复习先把文本变成数字&#34;&gt;8.2 先修复习：先把文本变成数字&lt;/h3&gt;
&lt;p&gt;计算机只认数字，不认汉字。NLP 的一切数学操作之前，都有一步“文本 → 数字”的转换。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. one-hot：一个词一个位置&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;假设词表只有 4 个词：&lt;code&gt;[我, 爱, 北京, 上海]&lt;/code&gt;。one-hot 表示就是“词表里有几个词，向量就有几维；是哪个词，对应位置为 1，其余为 0”：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;我   → [1, 0, 0, 0]
爱   → [0, 1, 0, 0]
北京 → [0, 0, 1, 0]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;2. 词袋：一句话一个计数向量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;词袋（Bag of Words）表示一整句话：向量的每个位置记录该词在句中出现了几次。两个短句：&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;句1：我 爱 北京  → [1, 1, 1, 0]
句2：我 爱 上海  → [1, 1, 0, 1]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;注意它丢掉了语序——“我爱北京”和“北京爱我”的词袋向量一模一样。这是词袋模型的硬伤，但作为第一步表示已经够用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这和后面的工程应用有什么关系？&lt;/strong&gt; 8.4 节的 TF-IDF，就是给词袋向量的每一维乘上一个“区分度权重”；8.5 节的语言模型和机器翻译，则是在“文本已经变成数字序列”的前提下算概率。现代词向量（word2vec）本质上也是 one-hot 经过一层矩阵乘法压缩出来的稠密向量——看到“矩阵乘法”，可以翻回 1.2 节复习。&lt;/p&gt;
&lt;h3 id=&#34;83-核心任务速查&#34;&gt;8.3 核心任务速查&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;任务&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;数学工具&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;工程价值&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;中文分词&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;统计语言模型 + 动态规划&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;搜索、输入法、文本分析&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;词性标注&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;HMM / CRF&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;句法分析、信息抽取&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;语音识别&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;HMM + 高斯混合模型&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;语音助手、输入法&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;机器翻译&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;统计翻译模型 / 神经网络&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;跨语言交流&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;信息检索&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;TF-IDF + 向量空间模型&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;搜索引擎、推荐&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;84-典型场景tf-idf-与搜索排序&#34;&gt;8.4 典型场景：TF-IDF 与搜索排序&lt;/h3&gt;
&lt;p&gt;搜索引擎怎么判断一个网页和查询词有多相关？TF-IDF 是最经典的方案：&lt;/p&gt;
&lt;p&gt;$$
\text{TF-IDF}(t, d) = \text{TF}(t, d) \times \text{IDF}(t)
$$&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TF（词频）：词 $t$ 在文档 $d$ 中出现多少次。&lt;/li&gt;
&lt;li&gt;IDF（逆文档频率）：$\log \frac{N}{|{d: t \in d}|}$，衡量词的区分能力。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;“的”“是”这种词出现很多但 IDF 很低，不会拉高排序；“量子计算”出现少但 IDF 高，更有区分度。&lt;/p&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    Q[用户查询] --&amp;gt;|分词| T[关键词]
    T --&amp;gt;|计算 TF-IDF| S[候选文档得分]
    S --&amp;gt;|排序| R[返回结果]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;85-典型场景统计机器翻译&#34;&gt;8.5 典型场景：统计机器翻译&lt;/h3&gt;
&lt;p&gt;早期机器翻译用统计模型，把翻译问题建模为：&lt;/p&gt;
&lt;p&gt;$$
\hat{e} = \arg\max_e P(e \mid f) = \arg\max_e P(f \mid e) \cdot P(e)
$$&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$P(e)$ 是目标语言模型，判断翻译结果是否通顺。&lt;/li&gt;
&lt;li&gt;$P(f \mid e)$ 是翻译模型，判断源语言到目标语言的对应关系。&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    F[外语句子 f] --&amp;gt;|翻译模型| C[候选译文集合]
    C --&amp;gt;|语言模型打分| S[选择最通顺的译文]
    S --&amp;gt; E[目标语言句子 e]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;现代神经机器翻译用 Transformer 替代了这些统计模型，但“源语言 → 候选 → 语言模型打分”的直觉仍然成立。&lt;/p&gt;
&lt;h3 id=&#34;86-nlp-数学避坑技巧&#34;&gt;8.6 NLP 数学避坑技巧&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;语言模型不是真的“理解”语言&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它只是统计规律。不要对输出结果赋予过多“智能”含义。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;分词结果影响后续所有任务&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;中文分词错误会级联传播。搜索里“南京市/长江大桥”和“南京/市长/江大桥”完全不是一回事。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;TF-IDF 忽略语义&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;它只看词频，不处理同义词。现代搜索会用向量语义模型做补充。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据预处理占 80% 工作量&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;去噪、归一化、编码处理往往比模型本身更费时间。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不要忽视评估指标&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;BLEU、ROUGE、准确率、召回率、F1 各有适用场景。单一看指标容易误判。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;9-多门数学如何协同工作&#34;&gt;9. 多门数学如何协同工作？&lt;/h2&gt;
&lt;p&gt;真实工程中，这些数学工具很少单独出现，它们通常协同作战。&lt;/p&gt;
&lt;h3 id=&#34;91-一个典型-ai-项目的数学全景&#34;&gt;9.1 一个典型 AI 项目的数学全景&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    subgraph 数据层
        D1[原始数据] --&amp;gt; D2[清洗 / 采样 / 特征工程]
    end

    subgraph 建模层
        D2 --&amp;gt; L1[线性代数&amp;lt;br/&amp;gt;把特征表示成向量/矩阵]
        L1 --&amp;gt; L2[概率论&amp;lt;br/&amp;gt;定义损失/似然函数]
        L2 --&amp;gt; L3[信息论&amp;lt;br/&amp;gt;交叉熵 / KL 散度]
        L3 --&amp;gt; L4[微积分&amp;lt;br/&amp;gt;梯度下降优化参数]
        L4 --&amp;gt; L5[优化算法&amp;lt;br/&amp;gt;DP / EM / 贪心]
    end

    subgraph 输出层
        L5 --&amp;gt; O1[训练好的模型]
        O1 --&amp;gt; O2[预测/推理]
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;92-案例逻辑回归&#34;&gt;9.2 案例：逻辑回归&lt;/h3&gt;
&lt;p&gt;逻辑回归是分类问题的“基线模型”，同时用到了三种数学：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;线性代数&lt;/strong&gt;：把输入特征加权求和&lt;/p&gt;
&lt;p&gt;$$
z = \mathbf{w}^T \mathbf{x} + b
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;概率论&lt;/strong&gt;：用 sigmoid 函数把 $z$ 映射成概率&lt;/p&gt;
&lt;p&gt;$$
P(y=1 \mid \mathbf{x}) = \sigma(z) = \frac{1}{1 + e^{-z}}
$$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;微积分 + 信息论&lt;/strong&gt;：用梯度下降最小化交叉熵损失&lt;/p&gt;
&lt;p&gt;$$
L = -\left[ y \log \hat{y} + (1-y) \log(1-\hat{y}) \right]
$$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    X[&amp;#34;特征向量 x&amp;#34;] --&amp;gt;|&amp;#34;w^T x + b&amp;#34;| Z[&amp;#34;线性组合 z&amp;#34;]
    Z --&amp;gt;|&amp;#34;sigmoid&amp;#34;| P[&amp;#34;概率 ŷ&amp;#34;]
    P --&amp;gt;|&amp;#34;交叉熵损失&amp;#34;| L[&amp;#34;损失 L&amp;#34;]
    L --&amp;gt;|&amp;#34;梯度下降&amp;#34;| W[&amp;#34;更新 w, b&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;93-案例pagerank&#34;&gt;9.3 案例：PageRank&lt;/h3&gt;
&lt;p&gt;Google 的 PageRank 算法是多种数学结合的典型：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图论&lt;/strong&gt;：网页之间的链接关系&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;线性代数&lt;/strong&gt;：网页链接表示成转移矩阵 $M$&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;概率论&lt;/strong&gt;：把随机冲浪者停留在某个网页的概率作为网页重要性&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特征值&lt;/strong&gt;：PageRank 向量就是矩阵 $M$ 的&lt;strong&gt;主特征向量&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$
\mathbf{r} = d M \mathbf{r} + \frac{1-d}{N} \mathbf{1}
$$&lt;/p&gt;
&lt;p&gt;其中 $d$ 是阻尼系数，$N$ 是网页总数。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-给新人的学习路线图&#34;&gt;10. 给新人的学习路线图&lt;/h2&gt;
&lt;h3 id=&#34;101-推荐学习顺序&#34;&gt;10.1 推荐学习顺序&lt;/h3&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart LR
    A[高中数学复习&amp;lt;br/&amp;gt;函数、方程] --&amp;gt; B[线性代数基础&amp;lt;br/&amp;gt;向量、矩阵、乘法]
    B --&amp;gt; C[微积分基础&amp;lt;br/&amp;gt;导数、偏导、梯度]
    C --&amp;gt; D[概率论基础&amp;lt;br/&amp;gt;条件概率、分布、期望]
    D --&amp;gt; E[信息论入门&amp;lt;br/&amp;gt;熵、交叉熵]
    E --&amp;gt; F[统计学入门&amp;lt;br/&amp;gt;采样、假设检验]
    F --&amp;gt; G[离散数学/图论&amp;lt;br/&amp;gt;图、状态机]
    G --&amp;gt; H[优化算法&amp;lt;br/&amp;gt;DP、贪心、EM]
    H --&amp;gt; I[结合项目学习&amp;lt;br/&amp;gt;NLP / 推荐 / 搜索]
    I --&amp;gt; J[读《数学之美》&amp;lt;br/&amp;gt;看工程案例]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;102-学习资源建议&#34;&gt;10.2 学习资源建议&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;阶段&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;推荐资源&lt;/th&gt;
					&lt;th style=&#34;text-align: left&#34;&gt;目标&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;入门&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3Blue1Brown《线性代数的本质》&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;建立几何直觉&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;入门&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3Blue1Brown《微积分的本质》&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;理解导数和积分&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;入门&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3Blue1Brown《概率论》&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;理解概率直觉&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;入门&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;3Blue1Brown《信息论》&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;理解熵和编码&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;实践&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;吴军《数学之美》&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;看真实工程案例&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;深入&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;《统计学习方法》/《机器学习》周志华&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;系统学习算法&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;深入&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;《算法导论》&lt;/td&gt;
					&lt;td style=&#34;text-align: left&#34;&gt;系统学习优化与数据结构&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;103-新人最常犯的-5-个错误&#34;&gt;10.3 新人最常犯的 5 个错误&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;只看公式，不画图&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;数学公式是压缩后的表达。先用图像、例子理解，再看公式会轻松很多。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;追求严格证明，忽视直觉&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;对程序员来说，先知道“为什么有用”比“怎么严格证明”更重要。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;不跑代码，只看书&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;用 NumPy 写一遍矩阵乘法、梯度下降，理解会深很多。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;跳得太快，基础不牢&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;不要还没搞懂向量和矩阵，就直接去看 Transformer。基础不稳，后面全是黑魔法。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;学了不用，很快忘记&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;选一个实际项目（比如用逻辑回归做分类、用协同过滤做推荐、用 TF-IDF 做搜索），把数学用起来。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;11-避坑总结一张图记住要点&#34;&gt;11. 避坑总结：一张图记住要点&lt;/h2&gt;
&lt;div class=&#34;code-block&#34;&gt;
    &lt;button class=&#34;code-copy&#34; type=&#34;button&#34; hidden aria-label=&#34;Copy code to clipboard&#34;&gt;
      &lt;span class=&#34;code-copy-label&#34; aria-hidden=&#34;true&#34;&gt;Copy&lt;/span&gt;
    &lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34;&gt;&lt;code class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;mindmap
  root((数学之美&amp;lt;br/&amp;gt;避坑指南))
    线性代数
      先看形状再算
      区分矩阵乘和逐元素乘
      稀疏矩阵别用稠密存
      特征值不是玄学
    微积分
      梯度要加负号
      学习率要调参
      框架能自动求导但原理要懂
      局部最小不必纠结
    概率论
      概率高不等于一定发生
      条件概率方向别搞反
      零概率要平滑
      数据量决定模型上限
    信息论
      熵大不等于信息多
      交叉熵配合 softmax
      KL 散度不对称
    统计学
      相关不等于因果
      样本量要足够
      训练集测试集要分开
    图论与优化
      有向图无向图别混
      贪心不一定最优
      DP 状态定义要无后效性
    通用
      先直觉后证明
      一定要写代码
      用项目驱动学习&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;12-结语数学是程序员的第二门语言&#34;&gt;12. 结语：数学是程序员的“第二门语言”&lt;/h2&gt;
&lt;p&gt;《数学之美》让我印象最深的一点是：很多复杂问题，其实都有简洁的数学表达。线性代数让我们能批量处理关系，微积分让我们能自动优化，概率论让我们能坦然面对不确定性，信息论让我们能量化信息，统计学让我们能从数据中提炼规律，图论和优化算法让我们能高效搜索复杂空间。&lt;/p&gt;
&lt;p&gt;作为新人，不必一开始就精通所有推导。重要的是建立&lt;strong&gt;直觉&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;看到矩阵，想到“关系和变换”。&lt;/li&gt;
&lt;li&gt;看到导数，想到“变化和优化方向”。&lt;/li&gt;
&lt;li&gt;看到概率，想到“不确定性和可能性”。&lt;/li&gt;
&lt;li&gt;看到熵，想到“信息量和不确定性”。&lt;/li&gt;
&lt;li&gt;看到图，想到“节点和连接”。&lt;/li&gt;
&lt;li&gt;看到优化问题，想到“状态、转移、目标函数”。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当你能把业务问题翻译成数学问题，再用代码实现出来，你就已经从“写代码的人”成长为“解决问题的人”了。&lt;/p&gt;
&lt;p&gt;希望这篇总结对你有帮助。如果有具体概念想深入，欢迎在评论区交流。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;参考与延伸阅读&#34;&gt;参考与延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;吴军《数学之美》&lt;/li&gt;
&lt;li&gt;3Blue1Brown 系列视频（B 站/YouTube）&lt;/li&gt;
&lt;li&gt;周志华《机器学习》&lt;/li&gt;
&lt;li&gt;李航《统计学习方法》&lt;/li&gt;
&lt;li&gt;Thomas M. Cover《信息论基础》&lt;/li&gt;
&lt;li&gt;《算法导论》&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
  </channel>
</rss>
