<?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/tags/%E6%A6%82%E7%8E%87%E8%AE%BA/</link>
    <description>AI 视频、AI Agent 与工程实践笔记</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    <lastBuildDate>Tue, 28 Jul 2020 09:00:00 +0800</lastBuildDate><atom:link href="https://ftmao.com/blog/tags/%E6%A6%82%E7%8E%87%E8%AE%BA/index.xml" rel="self" type="application/rss+xml" /><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>
    <item>
      <title>概率论脉络</title>
      <link>https://ftmao.com/blog/posts/probability-theory-study-notes/</link>
      <pubDate>Mon, 13 Jul 2020 09:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/probability-theory-study-notes/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;目标读者&lt;/strong&gt;：完全没有概率论基础、或高中那点排列组合早就忘光的大学生和自学者。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阅读目标&lt;/strong&gt;：读完本文，你应该能——&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;说清楚概率论这门课到底在研究什么、五大板块之间是什么关系；&lt;/li&gt;
&lt;li&gt;看懂并会用最核心的公式（全概率、贝叶斯、二项/泊松/正态分布、期望方差、中心极限定理）；&lt;/li&gt;
&lt;li&gt;避开新人最常踩的 8 个坑；&lt;/li&gt;
&lt;li&gt;知道接下来该用什么教材和路线继续深入。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;这门课在干什么一句话版本&#34;&gt;这门课在干什么：一句话版本&lt;/h2&gt;
&lt;p&gt;概率论研究的是&amp;quot;&lt;strong&gt;不确定的事情有多确定&lt;/strong&gt;&amp;quot;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;扔一枚硬币，结果不确定，但&amp;quot;正面朝上&amp;quot;的可能性大约是二分之一；&lt;/li&gt;
&lt;li&gt;一个班的考试成绩不确定，但平均分、波动程度是可以算的；&lt;/li&gt;
&lt;li&gt;工厂抽检 100 件产品发现 3 件次品，整批货的次品率大概是多少？这就是统计推断。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;整门课的逻辑主线只有一条：&lt;strong&gt;从&amp;quot;算单个事件的概率&amp;quot;出发，逐步升级到&amp;quot;用样本推测总体&amp;quot;&lt;/strong&gt;。下面这张知识地图就是全文的目录。&lt;/p&gt;
&lt;h2 id=&#34;知识地图与学习路线&#34;&gt;知识地图与学习路线&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;flowchart TD
    A[随机事件与概率] --&amp;gt; B[随机变量与分布]
    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;抽样分布/参数估计/假设检验]

    A1[古典概型] --&amp;gt; A
    A2[条件概率] --&amp;gt; A
    A3[全概率公式] --&amp;gt; A2
    A4[贝叶斯公式] --&amp;gt; A2
    A5[事件独立性] --&amp;gt; A

    B1[分布函数] --&amp;gt; B
    B2[二项分布] --&amp;gt; B
    B3[泊松分布] --&amp;gt; B
    B4[正态分布] --&amp;gt; B

    E1[用样本推测总体&amp;lt;br&amp;gt;是概率论的逆问题] -.-&amp;gt; A&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;学习顺序建议严格按照箭头走：&lt;strong&gt;不要跳过条件概率直接学贝叶斯，也不要在没搞懂正态分布之前碰中心极限定理&lt;/strong&gt;。每一块都是下一块的地基。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第一章随机事件与概率&#34;&gt;第一章：随机事件与概率&lt;/h2&gt;
&lt;h3 id=&#34;11-随机试验样本空间与事件&#34;&gt;1.1 随机试验、样本空间与事件&lt;/h3&gt;
&lt;p&gt;先建立三个最基础的概念：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;概念&lt;/th&gt;
					&lt;th&gt;白话解释&lt;/th&gt;
					&lt;th&gt;例子（掷一颗骰子）&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;随机试验&lt;/td&gt;
					&lt;td&gt;结果事先不确定、但所有可能结果是明确的实验&lt;/td&gt;
					&lt;td&gt;掷一次骰子&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;样本空间 $\Omega$&lt;/td&gt;
					&lt;td&gt;所有可能结果的集合&lt;/td&gt;
					&lt;td&gt;$\{1,2,3,4,5,6\}$&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;随机事件&lt;/td&gt;
					&lt;td&gt;样本空间的子集，即&amp;quot;某些结果组成的集合&amp;quot;&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;掷出偶数&amp;rdquo; $=\{2,4,6\}$&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;事件之间的关系用集合语言表达：并（$A \cup B$，至少一个发生）、交（$A \cap B$，同时发生）、互斥（$A \cap B = \varnothing$，不能同时发生）、对立（$\bar{A}$，$A$ 不发生）。&lt;/p&gt;
&lt;h3 id=&#34;12-古典概型数数就能算概率&#34;&gt;1.2 古典概型：数数就能算概率&lt;/h3&gt;
&lt;p&gt;当试验结果&lt;strong&gt;有限&lt;/strong&gt;且&lt;strong&gt;等可能&lt;/strong&gt;时，概率就是&amp;quot;数数&amp;quot;：&lt;/p&gt;
&lt;p&gt;$$P(A) = \frac{A \text{ 包含的基本结果数}}{\Omega \text{ 中的基本结果总数}} = \frac{|A|}{|\Omega|}$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：掷骰子、抽牌、摸球这类&amp;quot;每种结果地位平等&amp;quot;的场景，直接数分子分母即可。什么时候用：题目出现&amp;quot;任取&amp;quot;&amp;ldquo;随机抽取&amp;quot;且样本点有限等可能时。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例&lt;/strong&gt;：袋中 5 个红球 3 个白球，任取 2 个，恰好 1 红 1 白的概率：&lt;/p&gt;
&lt;p&gt;$$P = \frac{C_5^1 \cdot C_3^1}{C_8^2} = \frac{15}{28}$$&lt;/p&gt;
&lt;p&gt;这里用到了组合数 $C_n^k = \dfrac{n!}{k!(n-k)!}$，表示从 $n$ 个里&lt;strong&gt;不考虑顺序&lt;/strong&gt;地选 $k$ 个的方案数。新人最大的拦路虎往往不是概率本身，而是排列组合不熟，建议先把 $C_n^k$ 和 $A_n^k$ 的区别（要不要排顺序）搞清楚再往下走。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;历史故事 📜：赌金分配问题——概率论的诞生。&lt;/strong&gt; 1654 年，法国贵族赌徒德·梅雷向数学家帕斯卡请教：一场赌局中途被迫叫停，赌金该怎么分才公平？帕斯卡为此与费马通信讨论，两人各自给出了基于&amp;quot;剩余赌局中各方获胜概率&amp;quot;的分配方案。这些信件被公认为概率论诞生的标志——在此之前人们也掷骰子、也算点数，但从这时起，&amp;ldquo;不确定的未来如何量化&amp;quot;才第一次成为严肃的数学问题。古典概型正是为解决这类赌局问题而生的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;13-概率的公理化定义与基本性质&#34;&gt;1.3 概率的公理化定义与基本性质&lt;/h3&gt;
&lt;p&gt;现代概率论用三条公理（柯尔莫哥洛夫公理）定义概率：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;非负性：$P(A) \ge 0$；&lt;/li&gt;
&lt;li&gt;规范性：$P(\Omega) = 1$；&lt;/li&gt;
&lt;li&gt;可列可加性：两两互斥的事件 $A_1, A_2, \dots$，有 $P\!\left(\bigcup_i A_i\right) = \sum_i P(A_i)$。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由这三条可以推出常用的计算性质：&lt;/p&gt;
&lt;p&gt;$$P(\bar{A}) = 1 - P(A)$$&lt;/p&gt;
&lt;p&gt;什么时候用：直接算 $P(A)$ 很麻烦、但算&amp;quot;反面&amp;quot;很简单时，立刻想到&amp;quot;正难则反&amp;rdquo;。典型场景：&amp;ldquo;至少有一个……&amp;ldquo;型问题，先算&amp;quot;一个都没有&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;$$P(A \cup B) = P(A) + P(B) - P(A \cap B)$$&lt;/p&gt;
&lt;p&gt;这就是加法公式（容斥原理的两事件版），防止你把 $A \cup B$ 的概率重复计算交集部分。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;历史故事 📜：三条公理为什么重要。&lt;/strong&gt; 20 世纪初概率论已被广泛使用，但&amp;quot;概率到底是什么&amp;quot;始终没有严格定义，甚至出现过一些看似矛盾的悖论。1933 年，苏联数学家科尔莫戈罗夫出版《概率论基础》，把概率定义为满足这三条公理的测度，整个学科从此建立在集合论与测度论的坚实基础之上。你今天看到的&amp;quot;事件是样本空间的子集&amp;quot;这种写法，正是这次公理化的遗产。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;14-条件概率信息改变了概率&#34;&gt;1.4 条件概率：信息改变了概率&lt;/h3&gt;
&lt;p&gt;$$P(A \mid B) = \frac{P(A \cap B)}{P(B)}, \quad P(B) &amp;gt; 0$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：在&lt;strong&gt;已经知道 $B$ 发生&lt;/strong&gt;的前提下重新评估 $A$ 的概率。直观理解：样本空间从 $\Omega$ 缩小到了 $B$，在 $B$ 里面看 $A$ 占多大比例。&lt;/p&gt;
&lt;p&gt;由它立刻得到&lt;strong&gt;乘法公式&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;$$P(A \cap B) = P(B)\,P(A \mid B) = P(A)\,P(B \mid A)$$&lt;/p&gt;
&lt;p&gt;什么时候用：两个事件&amp;quot;分步骤发生&amp;quot;时，比如不放回摸球——第一次摸到红球的概率，乘以&amp;quot;第一次红的前提下第二次还是红&amp;quot;的概率。&lt;/p&gt;
&lt;p&gt;如果 $P(A \mid B) = P(A)$，即知道 $B$ 发生与否不影响 $A$ 的概率，就称 $A$ 与 $B$ &lt;strong&gt;相互独立&lt;/strong&gt;，此时乘法公式简化为：&lt;/p&gt;
&lt;p&gt;$$P(A \cap B) = P(A)\,P(B)$$&lt;/p&gt;
&lt;p&gt;什么时候用：各事件&amp;quot;互不影响&amp;quot;时（如两台独立运转的机器、两次独立抛硬币），联合概率直接相乘，是最省事的算法——但前提是独立性确实成立，不能想当然，相关辨析见避坑技巧第 1 条和第 6 条。&lt;/p&gt;
&lt;h3 id=&#34;15-全概率公式分类讨论的概率版&#34;&gt;1.5 全概率公式：分类讨论的概率版&lt;/h3&gt;
&lt;p&gt;设 $B_1, B_2, \dots, B_n$ 是样本空间 $\Omega$ 的一个&lt;strong&gt;完备事件组&lt;/strong&gt;（两两互斥且并起来是整个 $\Omega$），则：&lt;/p&gt;
&lt;p&gt;$$P(A) = \sum_{i=1}^{n} P(B_i)\,P(A \mid B_i)$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：事件 $A$ 的发生有&lt;strong&gt;多条路径&lt;/strong&gt;（多种原因），把每条路径的概率算出来再相加。什么时候用：题目结构是&amp;quot;先按某种情况分类，每类之下再谈 $A$&amp;quot;，比如&amp;quot;产品来自甲、乙、丙三条生产线&amp;rdquo;。&lt;/p&gt;
&lt;h3 id=&#34;16-贝叶斯公式由结果反推原因&#34;&gt;1.6 贝叶斯公式：由结果反推原因&lt;/h3&gt;
&lt;p&gt;同样的完备事件组下：&lt;/p&gt;
&lt;p&gt;$$P(B_k \mid A) = \frac{P(B_k)\,P(A \mid B_k)}{\sum_{i=1}^{n} P(B_i)\,P(A \mid B_i)}$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：已知&lt;strong&gt;结果&lt;/strong&gt; $A$ 发生了，反推它最可能是由哪个&lt;strong&gt;原因&lt;/strong&gt; $B_k$ 导致的。分母就是全概率公式，所以贝叶斯公式本质是&amp;quot;某条路径的概率占所有路径总概率的比重&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;经典例（务必自己算一遍）&lt;/strong&gt;：某种疾病患病率为 $0.1\%$。检测的灵敏度（患者检出阳性率）为 $99\%$，特异度（健康者检出阴性率）为 $99\%$。某人检测呈阳性，他真患病的概率是多少？&lt;/p&gt;
&lt;p&gt;$$P(\text{病} \mid \text{阳}) = \frac{0.001 \times 0.99}{0.001 \times 0.99 + 0.999 \times 0.01} \approx 0.09$$&lt;/p&gt;
&lt;p&gt;只有约 $9\%$！直觉上&amp;quot;检测 99% 准确&amp;quot;似乎意味着阳性就九成九是病人，但因为&lt;strong&gt;基础患病率（先验概率）太低&lt;/strong&gt;，假阳性占了大多数。这是贝叶斯公式最著名的一课，也是理解&amp;quot;先验概率重要性&amp;quot;的最好例子。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;历史故事 📜：死后才发表的定理。&lt;/strong&gt; 贝叶斯是英国牧师、业余数学家，他生前从未发表过这个定理。他去世后，朋友理查德·普莱斯整理其遗稿，于 1763 年递交英国皇家学会发表。此后近两百年间，&amp;ldquo;用概率反推原因&amp;quot;的贝叶斯方法因涉及先验概率的选取而备受争议，直到 20 世纪计算机普及，它才在垃圾邮件过滤、机器学习等领域大放异彩，成为今天应用最广泛的统计思想之一。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;17-本章解题流程&#34;&gt;1.7 本章解题流程&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
   Q[&amp;#34;求某事件 A 的概率&amp;#34;] --&amp;gt; D1{&amp;#34;结果有限且等可能?&amp;#34;}
    D1 -- 是 --&amp;gt; D2[&amp;#34;古典概型: 数 |A|/|Ω|&amp;#34;]
    D1 -- 否 --&amp;gt; D3{&amp;#34;A 是“至少/至多”型?&amp;#34;}
    D3 -- 是 --&amp;gt; D4[&amp;#34;用对立事件: 1-P(Ā)&amp;#34;]
    D3 -- 否 --&amp;gt; D5{&amp;#34;A 有多条发生路径/原因?&amp;#34;}
    D5 -- 是 --&amp;gt; D6[&amp;#34;全概率公式&amp;#34;]
    D5 -- 否 --&amp;gt; D6b[&amp;#34;加法/乘法公式直接算&amp;#34;]
    D6 --&amp;gt; D7{&amp;#34;题目问“已知结果反推原因”?&amp;#34;}
    D7 -- 是 --&amp;gt; D8[&amp;#34;贝叶斯公式&amp;#34;]
    D7 -- 否 --&amp;gt; D9[&amp;#34;输出全概率结果&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;18-应用场景条件概率与贝叶斯在哪里&#34;&gt;1.8 应用场景：条件概率与贝叶斯在哪里&lt;/h3&gt;
&lt;h3 id=&#34;18-应用场景条件概率与贝叶斯在哪里用&#34;&gt;1.8 应用场景：条件概率与贝叶斯在哪里用&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;用到的公式/概念&lt;/th&gt;
					&lt;th&gt;解决什么问题&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;疾病筛查（医学）&lt;/td&gt;
					&lt;td&gt;贝叶斯公式、先验概率&lt;/td&gt;
					&lt;td&gt;计算&amp;quot;检测阳性后真患病&amp;quot;的概率（见 1.6 节例子）。核心启示：评价检测不能只看灵敏度，还要看基础患病率&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;垃圾邮件过滤（计算机）&lt;/td&gt;
					&lt;td&gt;贝叶斯公式、条件独立性假设&lt;/td&gt;
					&lt;td&gt;朴素贝叶斯分类器统计&amp;quot;含&amp;rsquo;中奖&amp;rsquo;&amp;lsquo;免费&amp;rsquo;等词的邮件是垃圾邮件&amp;quot;的概率，是最早大规模落地的机器学习算法之一&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;故障诊断（工程）&lt;/td&gt;
					&lt;td&gt;贝叶斯公式&lt;/td&gt;
					&lt;td&gt;设备出现某种报警（结果），反推最可能的故障部件（原因），指导检修顺序&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;可靠性分析（工程）&lt;/td&gt;
					&lt;td&gt;独立性乘法公式&lt;/td&gt;
					&lt;td&gt;串联系统可靠性是各部件可靠性相乘；冗余并联设计则利用&amp;quot;至少一个正常&amp;quot;的对立事件思路&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第二章随机变量与分布&#34;&gt;第二章：随机变量与分布&lt;/h2&gt;
&lt;h3 id=&#34;21-为什么需要随机变量&#34;&gt;2.1 为什么需要随机变量&lt;/h3&gt;
&lt;p&gt;第一章的语言是&amp;quot;集合&amp;rdquo;，计算起来很累。随机变量的思想是：&lt;strong&gt;给每个试验结果编一个数&lt;/strong&gt;，把事件问题转化为数的问题。&lt;/p&gt;
&lt;p&gt;$$X: \Omega \to \mathbb{R}, \quad \omega \mapsto X(\omega)$$&lt;/p&gt;
&lt;p&gt;比如掷骰子，$X$ 就是点数本身；抛 3 次硬币，令 $X$ = 正面朝上的次数。这样 $\{X = 2\}$、$\{X \le 1\}$ 都是事件，可以谈概率。&lt;/p&gt;
&lt;p&gt;随机变量分两大类：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;类型&lt;/th&gt;
					&lt;th&gt;取值特点&lt;/th&gt;
					&lt;th&gt;例子&lt;/th&gt;
					&lt;th&gt;概率怎么描述&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;离散型&lt;/td&gt;
					&lt;td&gt;可数个取值&lt;/td&gt;
					&lt;td&gt;掷骰子点数、次品个数&lt;/td&gt;
					&lt;td&gt;分布律 $P(X = x_k) = p_k$&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;连续型&lt;/td&gt;
					&lt;td&gt;充满某个区间&lt;/td&gt;
					&lt;td&gt;身高、等待时间、测量误差&lt;/td&gt;
					&lt;td&gt;概率密度函数 $f(x)$&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;22-分布函数离散与连续的统一语言&#34;&gt;2.2 分布函数：离散与连续的统一语言&lt;/h3&gt;
&lt;p&gt;$$F(x) = P(X \le x), \quad x \in \mathbb{R}$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：无论离散还是连续，都可以用&amp;quot;不超过 $x$ 的概率&amp;quot;这一个函数来完整描述随机变量的分布。它是&lt;strong&gt;单调不减、右连续&lt;/strong&gt;，且 $\lim_{x\to-\infty}F(x)=0$，$\lim_{x\to+\infty}F(x)=1$。&lt;/p&gt;
&lt;p&gt;有了 $F$ 之后，区间概率就是函数值之差：&lt;/p&gt;
&lt;p&gt;$$P(a &amp;lt; X \le b) = F(b) - F(a)$$&lt;/p&gt;
&lt;p&gt;对连续型随机变量，密度函数与分布函数互为&amp;quot;导数与积分&amp;quot;：&lt;/p&gt;
&lt;p&gt;$$F(x) = \int_{-\infty}^{x} f(t)\,dt, \qquad P(a &amp;lt; X \le b) = \int_a^b f(x)\,dx$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：连续型变量的概率不靠&amp;quot;数点&amp;quot;，而靠对密度函数积分——&lt;strong&gt;密度曲线下的面积才是概率&lt;/strong&gt;。会算积分，就会算任何区间的概率。&lt;/p&gt;
&lt;p&gt;注意：连续型随机变量取&lt;strong&gt;任何单点的概率都是 0&lt;/strong&gt;，即 $P(X = a) = 0$。这是新人最容易懵的一点，详见避坑技巧第 3 条。&lt;/p&gt;
&lt;h3 id=&#34;23-三大常用分布&#34;&gt;2.3 三大常用分布&lt;/h3&gt;
&lt;h4 id=&#34;二项分布-bn-p&#34;&gt;二项分布 $B(n, p)$&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：独立重复 $n$ 次试验，每次只有&amp;quot;成功/失败&amp;quot;两种结果，成功概率都是 $p$，问恰好成功 $k$ 次的概率。&lt;/p&gt;
&lt;p&gt;$$P(X = k) = C_n^k\, p^k (1-p)^{n-k}, \quad k = 0, 1, \dots, n$$&lt;/p&gt;
&lt;p&gt;什么时候用：抛 10 次硬币恰好 6 次正面；抽检 20 件产品恰好 2 件次品。关键词是&amp;quot;&lt;strong&gt;$n$ 次独立重复试验中成功的次数&lt;/strong&gt;&amp;quot;。$n=1$ 时退化为两点分布（伯努利分布）。&lt;/p&gt;
&lt;h4 id=&#34;泊松分布-plambda&#34;&gt;泊松分布 $P(\lambda)$&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：单位时间/单位空间内&lt;strong&gt;稀有事件&lt;/strong&gt;发生的次数。&lt;/p&gt;
&lt;p&gt;$$P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!}, \quad k = 0, 1, 2, \dots$$&lt;/p&gt;
&lt;p&gt;什么时候用：一小时内到达银行窗口的顾客数、一页书上的印刷错误数。其中 $\lambda$ 是平均发生次数。当二项分布的 $n$ 很大、$p$ 很小且 $np \to \lambda$ 时，可用泊松分布近似二项分布（泊松定理），例如&amp;quot;1000 人投保，每人出险概率 0.001，求出险 3 人的概率&amp;quot;。&lt;/p&gt;
&lt;h4 id=&#34;正态分布-nmu-sigma2&#34;&gt;正态分布 $N(\mu, \sigma^2)$&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：由大量微小随机因素叠加产生的量——身高、测量误差、考试成绩。&lt;/p&gt;
&lt;p&gt;$$f(x) = \frac{1}{\sqrt{2\pi}\,\sigma}\, e^{-\frac{(x-\mu)^2}{2\sigma^2}}, \quad x \in \mathbb{R}$$&lt;/p&gt;
&lt;p&gt;这条曲线关于 $x = \mu$ 对称，$\sigma$ 控制&amp;quot;胖瘦&amp;quot;：$\sigma$ 越大曲线越扁平，数据越分散。&lt;/p&gt;
&lt;p&gt;标准化是必考操作：若 $X \sim N(\mu, \sigma^2)$，则&lt;/p&gt;
&lt;p&gt;$$Z = \frac{X - \mu}{\sigma} \sim N(0, 1)$$&lt;/p&gt;
&lt;p&gt;什么时候用：任何正态概率计算都先标准化，再查标准正态表 $\Phi(z)$。记住 $3\sigma$ 法则（经验法则）：&lt;/p&gt;
&lt;p&gt;$$P(|X - \mu| \le \sigma) \approx 0.6826,\quad P(|X - \mu| \le 2\sigma) \approx 0.9544,\quad P(|X - \mu| \le 3\sigma) \approx 0.9974$$&lt;/p&gt;
&lt;p&gt;即几乎所有数据都落在均值±3 个标准差之内。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;历史故事 📜：正态分布与谷神星。&lt;/strong&gt; 1801 年元旦，意大利天文学家皮亚齐发现了小行星谷神星，但它很快运行到太阳附近失去踪迹。年轻的高斯仅凭有限的观测数据，用自己发展的最小二乘法算出轨道，准确预言了它重现的位置，轰动欧洲。1809 年高斯在《天体运动论》中系统建立了以正态分布刻画观测误差的理论，因此正态分布也常被称为&amp;quot;高斯分布&amp;quot;——尽管更早从数学上研究它的其实是棣莫弗与拉普拉斯。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;24-三大分布的关系&#34;&gt;2.4 三大分布的关系&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
    Bern[&amp;#34;伯努利试验&amp;lt;br&amp;gt;单次成功概率 p&amp;#34;] --&amp;gt; Bin[&amp;#34;二项分布 B(n,p)&amp;lt;br&amp;gt;n 次成功次数&amp;#34;]
    Bin -- &amp;#34;n大,p小,np→λ&amp;#34; --&amp;gt; Pois[&amp;#34;泊松分布 P(λ)&amp;lt;br&amp;gt;稀有事件次数&amp;#34;]
    Bin -- &amp;#34;n大时 由中心极限定理&amp;#34; --&amp;gt; Norm[&amp;#34;正态分布 N(μ,σ²)&amp;#34;]
    Pois -- &amp;#34;λ较大时近似&amp;#34; --&amp;gt; Norm
    Norm -- &amp;#34;标准化 Z=(X-μ)/σ&amp;#34; --&amp;gt; StdN[&amp;#34;标准正态 N(0,1)&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;这张图非常重要：它告诉你三大分布不是孤立的，二项分布是&amp;quot;根&amp;quot;，泊松和正态都可以看作它在不同极限下的近似。&lt;/p&gt;
&lt;h3 id=&#34;25-应用场景三大分布在哪里用&#34;&gt;2.5 应用场景：三大分布在哪里用&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;用到的公式/概念&lt;/th&gt;
					&lt;th&gt;解决什么问题&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;质量抽检（制造）&lt;/td&gt;
					&lt;td&gt;二项分布 $B(n,p)$&lt;/td&gt;
					&lt;td&gt;计算&amp;quot;抽检 $n$ 件恰好 $k$ 件次品&amp;quot;的概率，是制定验收抽样方案的基础&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;排队与客服（运筹）&lt;/td&gt;
					&lt;td&gt;泊松分布 $P(\lambda)$&lt;/td&gt;
					&lt;td&gt;刻画单位时间内的到达数，用于呼叫中心配置坐席、银行决定开几个窗口&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;质量管理（制造）&lt;/td&gt;
					&lt;td&gt;正态分布、$3\sigma$ 法则&lt;/td&gt;
					&lt;td&gt;用均值±$3\sigma$ 设定工艺控制限，超出即报警；摩托罗拉公司 20 世纪 80 年代提出的&amp;quot;六西格玛&amp;quot;管理，目标就是把缺陷率压到百万分之几的水平&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;测量与传感器（工程）&lt;/td&gt;
					&lt;td&gt;正态分布、标准化&lt;/td&gt;
					&lt;td&gt;测量误差通常近似正态，标准化后可算&amp;quot;误差超过容许值&amp;quot;的概率&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第三章数字特征期望方差与协方差&#34;&gt;第三章：数字特征——期望、方差与协方差&lt;/h2&gt;
&lt;p&gt;分布函数虽然完整，但太复杂。实际中我们常只关心几个&amp;quot;汇总数字&amp;quot;：平均水平是多少？波动大不大？两个变量有没有关联？&lt;/p&gt;
&lt;h3 id=&#34;31-数学期望长期平均水平&#34;&gt;3.1 数学期望：长期平均水平&lt;/h3&gt;
&lt;p&gt;离散型：&lt;/p&gt;
&lt;p&gt;$$E(X) = \sum_k x_k\, p_k$$&lt;/p&gt;
&lt;p&gt;连续型：&lt;/p&gt;
&lt;p&gt;$$E(X) = \int_{-\infty}^{+\infty} x\, f(x)\,dx$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：期望就是&lt;strong&gt;以概率为权重的加权平均&lt;/strong&gt;，回答&amp;quot;这个随机变量平均来说等于多少&amp;quot;。注意它是&amp;quot;长期重复的平均值&amp;quot;，不是&amp;quot;最可能出现的值&amp;quot;。&lt;/p&gt;
&lt;p&gt;期望的运算性质（非常重要，方差和协方差的计算全靠它）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;线性性：$E(aX + bY) = aE(X) + bE(Y)$——&lt;strong&gt;不需要任何独立性假设，永远成立&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;若 $X, Y$ 独立：$E(XY) = E(X)E(Y)$；&lt;/li&gt;
&lt;li&gt;随机变量函数的期望：$E[g(X)] = \sum_k g(x_k)p_k$（连续型换成积分），&lt;strong&gt;不要&lt;/strong&gt;先把 $g(X)$ 的分布求出来再算期望。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;32-方差与标准差波动有多大&#34;&gt;3.2 方差与标准差：波动有多大&lt;/h3&gt;
&lt;p&gt;$$D(X) = \mathrm{Var}(X) = E\!\left[(X - E(X))^2\right]$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：衡量随机变量&lt;strong&gt;偏离其平均水平的平均程度&lt;/strong&gt;。方差越大，数据越&amp;quot;散&amp;quot;。标准差 $\sigma = \sqrt{D(X)}$ 与 $X$ 同量纲，更直观。&lt;/p&gt;
&lt;p&gt;计算时几乎不用定义式，而用推导出的公式：&lt;/p&gt;
&lt;p&gt;$$D(X) = E(X^2) - [E(X)]^2$$&lt;/p&gt;
&lt;p&gt;什么时候用：先分别算 $E(X^2)$ 和 $E(X)$，一减即可，比算 $E[(X-EX)^2]$ 省事得多。&lt;/p&gt;
&lt;p&gt;常用性质：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$D(aX + b) = a^2 D(X)$——&lt;strong&gt;常数项消失，系数要平方&lt;/strong&gt;，新人常忘记平方；&lt;/li&gt;
&lt;li&gt;若 $X, Y$ 独立：$D(X + Y) = D(X) + D(Y)$（不独立时要加协方差项，见下）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;三大常见分布的数字特征值得直接背下来：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;分布&lt;/th&gt;
					&lt;th&gt;期望&lt;/th&gt;
					&lt;th&gt;方差&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;二项 $B(n,p)$&lt;/td&gt;
					&lt;td&gt;$np$&lt;/td&gt;
					&lt;td&gt;$np(1-p)$&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;泊松 $P(\lambda)$&lt;/td&gt;
					&lt;td&gt;$\lambda$&lt;/td&gt;
					&lt;td&gt;$\lambda$&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;正态 $N(\mu,\sigma^2)$&lt;/td&gt;
					&lt;td&gt;$\mu$&lt;/td&gt;
					&lt;td&gt;$\sigma^2$&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;33-协方差与相关系数两个变量的联动&#34;&gt;3.3 协方差与相关系数：两个变量的联动&lt;/h3&gt;
&lt;p&gt;$$\mathrm{Cov}(X, Y) = E\!\left[(X - E(X))(Y - E(Y))\right] = E(XY) - E(X)E(Y)$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：衡量两个变量&lt;strong&gt;同向还是反向变动&lt;/strong&gt;。$\mathrm{Cov} &amp;gt; 0$ 说明 $X$ 偏大时 $Y$ 倾向也偏大；$\mathrm{Cov} &amp;lt; 0$ 则相反。&lt;/p&gt;
&lt;p&gt;相关系数是把协方差标准化到 $[-1, 1]$：&lt;/p&gt;
&lt;p&gt;$$\rho_{XY} = \frac{\mathrm{Cov}(X, Y)}{\sqrt{D(X)}\,\sqrt{D(Y)}}$$&lt;/p&gt;
&lt;p&gt;$\rho = \pm 1$ 表示完全线性关系，$\rho = 0$ 称&lt;strong&gt;不相关&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;有了协方差，方差的加法公式完整版是：&lt;/p&gt;
&lt;p&gt;$$D(X + Y) = D(X) + D(Y) + 2\,\mathrm{Cov}(X, Y)$$&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键辨析&lt;/strong&gt;：独立 $\Rightarrow$ 不相关，但&lt;strong&gt;不相关推不出独立&lt;/strong&gt;。唯一的重要例外是：若 $(X, Y)$ 服从二维正态分布，则不相关与独立等价。&lt;/p&gt;
&lt;h3 id=&#34;34-应用场景数字特征在哪里用&#34;&gt;3.4 应用场景：数字特征在哪里用&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;用到的公式/概念&lt;/th&gt;
					&lt;th&gt;解决什么问题&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;金融风险度量&lt;/td&gt;
					&lt;td&gt;期望、方差/标准差&lt;/td&gt;
					&lt;td&gt;期望刻画资产的平均收益率，标准差就是&amp;quot;波动率&amp;quot;，是最经典的风险度量&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;投资组合理论&lt;/td&gt;
					&lt;td&gt;协方差、相关系数、$D(X+Y)$ 完整公式&lt;/td&gt;
					&lt;td&gt;分散投资的数学本质：挑选低相关的资产，利用协方差项为负来压低组合总方差&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;决策分析（管理）&lt;/td&gt;
					&lt;td&gt;数学期望&lt;/td&gt;
					&lt;td&gt;期望是&amp;quot;这件事长期值不值得做&amp;quot;的标尺——所有期望为负的赌局，长期玩下去必输&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;项目排期（工程）&lt;/td&gt;
					&lt;td&gt;期望与方差&lt;/td&gt;
					&lt;td&gt;期望工期用于排计划，方差大的任务意味着延期风险高，需要预留缓冲&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;信号处理（电子）&lt;/td&gt;
					&lt;td&gt;期望与方差&lt;/td&gt;
					&lt;td&gt;期望对应信号的直流分量，方差刻画噪声功率，是滤波与降噪设计的基础&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第四章大数定律与中心极限定理&#34;&gt;第四章：大数定律与中心极限定理&lt;/h2&gt;
&lt;p&gt;这一章是全课程的&amp;quot;理论高地&amp;quot;，也是连接概率论与数理统计的桥梁。&lt;/p&gt;
&lt;h3 id=&#34;41-切比雪夫不等式&#34;&gt;4.1 切比雪夫不等式&lt;/h3&gt;
&lt;p&gt;设 $X$ 的期望 $\mu$ 与方差 $\sigma^2$ 存在，则对任意 $\varepsilon &amp;gt; 0$：&lt;/p&gt;
&lt;p&gt;$$P(|X - \mu| \ge \varepsilon) \le \frac{\sigma^2}{\varepsilon^2}$$&lt;/p&gt;
&lt;p&gt;这个公式是干什么用的：&lt;strong&gt;在只知道期望和方差、不知道具体分布&lt;/strong&gt;的情况下，给出&amp;quot;偏离均值很远&amp;quot;的概率上界。它比较粗糙，但只需两个数字特征就能用，是证明大数定律的工具。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;历史故事 📜：切比雪夫与圣彼得堡学派。&lt;/strong&gt; 19 世纪中叶，概率论的研究重心在法国。俄国数学家切比雪夫在圣彼得堡开创了俄国的概率学派，他用上面这个简洁的不等式给出了大数定律的严格证明，并培养了马尔可夫、李雅普诺夫等一批学生。正是这个学派把极限定理的研究推向高峰，为后来中心极限定理的严格证明铺平了道路——你以后会学到的&amp;quot;马尔可夫链&amp;quot;，就来自他的学生。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;42-大数定律频率稳定于概率&#34;&gt;4.2 大数定律：频率稳定于概率&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;伯努利大数定律&lt;/strong&gt;：$n$ 重伯努利试验中事件 $A$ 发生的频率 $f_n(A)$，当 $n \to \infty$ 时依概率收敛到 $P(A)$。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;辛钦大数定律&lt;/strong&gt;（更常用）：设 $X_1, X_2, \dots$ 独立同分布且 $E(X_i) = \mu$，则&lt;/p&gt;
&lt;p&gt;$$\frac{1}{n}\sum_{i=1}^{n} X_i \xrightarrow{P} \mu \quad (n \to \infty)$$&lt;/p&gt;
&lt;p&gt;白话解释：大量重复之下，&lt;strong&gt;样本平均值会稳定在理论期望附近&lt;/strong&gt;。这就是为什么&amp;quot;抛硬币一万次，正面比例接近一半&amp;quot;，也是用样本均值估计总体均值的理论依据。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;历史故事 📜：第一个大数定律。&lt;/strong&gt; 雅各布·伯努利花了约二十年研究&amp;quot;重复试验中频率为何稳定&amp;quot;这个问题。他去世后，遗著《猜度术》（Ars Conjectandi）于 1713 年出版，其中给出了历史上第一个大数定律的严格证明。伯努利对这一结果极为看重，甚至专门计算过&amp;quot;要观察多少次，才能让频率以很高的把握贴近真概率&amp;quot;。这本书被公认为概率论成为独立数学分支的起点之一。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;43-中心极限定理和近似正态&#34;&gt;4.3 中心极限定理：和近似正态&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;独立同分布中心极限定理&lt;/strong&gt;（列维—林德伯格）：设 $X_1, \dots, X_n$ 独立同分布，$E(X_i) = \mu$，$D(X_i) = \sigma^2$，则当 $n$ 充分大时：&lt;/p&gt;
&lt;p&gt;$$\frac{\sum_{i=1}^{n} X_i - n\mu}{\sqrt{n}\,\sigma} \stackrel{\text{近似}}{\sim} N(0, 1)$$&lt;/p&gt;
&lt;p&gt;白话解释：&lt;strong&gt;不管原始分布长什么样&lt;/strong&gt;（均匀、指数、甚至很奇怪的分布），只要个数够多，它们的和（或平均）就近似服从正态分布。这就是为什么正态分布在自然界和考试里无处不在。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例&lt;/strong&gt;：某零件重量期望 50g、标准差 5g，随机取 100 个，总重超过 5050g 的概率约为&lt;/p&gt;
&lt;p&gt;$$P\!\left(\frac{S - 5000}{50} &amp;gt; \frac{5050 - 5000}{50}\right) \approx 1 - \Phi(1) \approx 0.1587$$&lt;/p&gt;
&lt;p&gt;其中 $S$ 为总重，$\sqrt{100}\times 5 = 50$。&lt;/p&gt;
&lt;p&gt;注意一个特例：二项分布 $B(n, p)$ 就是 $n$ 个伯努利变量之和，所以 $n$ 大时可用正态近似——这就是 2.4 节关系图里那条箭头的来历（棣莫弗—拉普拉斯中心极限定理）。&lt;/p&gt;
&lt;h3 id=&#34;44-两大定理的分工&#34;&gt;4.4 两大定理的分工&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
    S[&amp;#34;大量独立随机变量&amp;lt;br&amp;gt;X1...Xn&amp;#34;] --&amp;gt; Q{&amp;#34;关心什么?&amp;#34;}
    Q -- &amp;#34;样本均值收敛到哪&amp;#34; --&amp;gt; LLN[&amp;#34;大数定律&amp;lt;br&amp;gt;均值 → 期望 μ&amp;#34;]
    Q -- &amp;#34;和/均值的分布形状&amp;#34; --&amp;gt; CLT[&amp;#34;中心极限定理&amp;lt;br&amp;gt;标准化后 ≈ N(0,1)&amp;#34;]
    LLN --&amp;gt; App1[&amp;#34;应用: 用样本均值估计总体均值&amp;#34;]
    CLT --&amp;gt; App2[&amp;#34;应用: 计算近似概率&amp;lt;br&amp;gt;构造置信区间&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;45-应用场景两大定理在哪里用&#34;&gt;4.5 应用场景：两大定理在哪里用&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;用到的公式/概念&lt;/th&gt;
					&lt;th&gt;解决什么问题&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;抽样调查与民调&lt;/td&gt;
					&lt;td&gt;中心极限定理&lt;/td&gt;
					&lt;td&gt;保证样本均值近似正态，民调机构才敢给出&amp;quot;支持率 52%±3%&amp;ldquo;这样的误差范围&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;A/B 测试（互联网）&lt;/td&gt;
					&lt;td&gt;中心极限定理&lt;/td&gt;
					&lt;td&gt;比较两组用户转化率的差异，构造置信区间判断差异是真实存在还是随机波动&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;蒙特卡洛模拟（工程/金融）&lt;/td&gt;
					&lt;td&gt;大数定律&lt;/td&gt;
					&lt;td&gt;用计算机生成大量随机试验逼近复杂问题的答案（如期权定价），试验够多时模拟均值就收敛到真期望&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;保险定价（精算）&lt;/td&gt;
					&lt;td&gt;大数定律、期望&lt;/td&gt;
					&lt;td&gt;承保人数足够多时实际赔付率接近期望赔付率，保险公司据此定保费才不会亏损&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h2 id=&#34;第五章数理统计初步&#34;&gt;第五章：数理统计初步&lt;/h2&gt;
&lt;p&gt;前四章是&amp;quot;已知概率模型，算各种概率&amp;rdquo;；数理统计反过来——&lt;strong&gt;模型未知，只有数据，要反推模型&lt;/strong&gt;。这是概率论的&amp;quot;逆问题&amp;quot;。&lt;/p&gt;
&lt;h3 id=&#34;51-总体样本与统计量&#34;&gt;5.1 总体、样本与统计量&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;总体&lt;/strong&gt;：研究对象全体的某个数量指标，记为随机变量 $X$（如全校学生身高）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;样本&lt;/strong&gt;：从总体中独立抽取的 $n$ 个观测 $X_1, \dots, X_n$，要求独立同分布（简单随机样本）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;统计量&lt;/strong&gt;：样本的不含未知参数的函数，最常用两个：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;$$\bar{X} = \frac{1}{n}\sum_{i=1}^{n} X_i \qquad S^2 = \frac{1}{n-1}\sum_{i=1}^{n}(X_i - \bar{X})^2$$&lt;/p&gt;
&lt;p&gt;这两个公式是干什么用的：$\bar{X}$ 和 $S^2$ 是用样本数据估计总体期望 $\mu$ 与方差 $\sigma^2$ 的基本工具，后面参数估计和假设检验的所有公式都建立在它们之上。&lt;/p&gt;
&lt;p&gt;注意样本方差除以的是 $n-1$ 而不是 $n$，这样能保证 $E(S^2) = \sigma^2$（无偏性），这是新人最容易记错的地方之一。&lt;/p&gt;
&lt;h3 id=&#34;52-三大抽样分布&#34;&gt;5.2 三大抽样分布&lt;/h3&gt;
&lt;p&gt;设总体 $X \sim N(\mu, \sigma^2)$：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;分布&lt;/th&gt;
					&lt;th&gt;构造方式&lt;/th&gt;
					&lt;th&gt;什么时候用&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;$\chi^2$ 分布&lt;/td&gt;
					&lt;td&gt;$n$ 个独立标准正态的&lt;strong&gt;平方和&lt;/strong&gt;&lt;/td&gt;
					&lt;td&gt;与样本方差相关的推断&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;$t$ 分布&lt;/td&gt;
					&lt;td&gt;标准正态除以 $\sqrt{\chi^2/n}$&lt;/td&gt;
					&lt;td&gt;&lt;strong&gt;$\sigma$ 未知&lt;/strong&gt;时对 $\mu$ 的推断&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;$F$ 分布&lt;/td&gt;
					&lt;td&gt;两个 $\chi^2$ 变量各自除以自由度之比&lt;/td&gt;
					&lt;td&gt;比较两个总体的方差&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;核心结论（正态总体的抽样定理）：&lt;/p&gt;
&lt;p&gt;$$\frac{\bar{X} - \mu}{\sigma/\sqrt{n}} \sim N(0,1), \qquad \frac{(n-1)S^2}{\sigma^2} \sim \chi^2(n-1), \qquad \frac{\bar{X} - \mu}{S/\sqrt{n}} \sim t(n-1)$$&lt;/p&gt;
&lt;p&gt;什么时候用：$\sigma$ 已知用第一个（标准正态），$\sigma$ 未知用第三个（$t$ 分布）——实际中 $\sigma$ 几乎都未知，所以 $t$ 分布出场率最高。还要注意自由度是 $n-1$。&lt;/p&gt;
&lt;h3 id=&#34;53-参数估计猜总体参数&#34;&gt;5.3 参数估计：猜总体参数&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;点估计&lt;/strong&gt;两大方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;矩估计&lt;/strong&gt;：用样本矩代替总体矩。例如总体期望 $\mu$ 直接用 $\bar{X}$ 估计，依据正是大数定律。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最大似然估计&lt;/strong&gt;：选使&amp;quot;观测到当前样本&amp;quot;的概率（似然函数）最大的参数值。离散型 $L(\theta) = \prod_i P(X_i = x_i;\,\theta)$，连续型换成密度连乘。常规套路：取对数 → 求导 → 令导数为零 → 解出 $\hat{\theta}$。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;区间估计&lt;/strong&gt;（以正态总体、$\sigma$ 未知求 $\mu$ 为例）：&lt;/p&gt;
&lt;p&gt;$$\bar{X} \pm t_{\alpha/2}(n-1)\,\frac{S}{\sqrt{n}}$$&lt;/p&gt;
&lt;p&gt;白话解释：点估计只给一个数，区间估计给出一个&amp;quot;以 $1-\alpha$ 的把握罩住真参数&amp;quot;的范围。置信水平 $1-\alpha$ 越高，区间越宽——精度和可靠性是此消彼长的。&lt;/p&gt;
&lt;h3 id=&#34;54-假设检验带着怀疑看数据&#34;&gt;5.4 假设检验：带着怀疑看数据&lt;/h3&gt;
&lt;p&gt;基本思想是&lt;strong&gt;小概率原理&lt;/strong&gt;：先假设 $H_0$ 成立（如&amp;quot;这批零件均值 = 50&amp;quot;），如果在此假设下算出一个概率很小的事件居然发生了，就拒绝 $H_0$。&lt;/p&gt;
&lt;p&gt;以单正态总体、$\sigma$ 未知检验 $\mu = \mu_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 class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart TD
    H1[&amp;#34;提出 H0: μ=μ0&amp;lt;br&amp;gt;备择 H1: μ≠μ0&amp;#34;] --&amp;gt; H2[&amp;#34;选统计量&amp;lt;br&amp;gt;T = (X̄-μ0)/(S/√n) 服从 t 分布&amp;#34;]
    H2 --&amp;gt; H3[&amp;#34;定显著性水平 α&amp;lt;br&amp;gt;查临界值 t(α/2)&amp;#34;]
    H3 --&amp;gt; H4[&amp;#34;由样本算 T 的值&amp;#34;]
    H4 --&amp;gt; H5{&amp;#34;|T| ＞ t(α/2) ?&amp;#34;}
    H5 -- 是 --&amp;gt; H6[&amp;#34;拒绝 H0&amp;lt;br&amp;gt;认为 μ≠μ0&amp;#34;]
    H5 -- 否 --&amp;gt; H7[&amp;#34;不拒绝 H0&amp;lt;br&amp;gt;证据不足&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;两类错误必须分清：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;错误类型&lt;/th&gt;
					&lt;th&gt;含义&lt;/th&gt;
					&lt;th&gt;概率记号&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;第一类错误（弃真）&lt;/td&gt;
					&lt;td&gt;$H_0$ 为真却被拒绝&lt;/td&gt;
					&lt;td&gt;$\alpha$（显著性水平）&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;第二类错误（取伪）&lt;/td&gt;
					&lt;td&gt;$H_0$ 为假却没被拒绝&lt;/td&gt;
					&lt;td&gt;$\beta$&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;样本量固定时，$\alpha$ 和 $\beta$ 此消彼长；想同时降低两者，只能加大样本量。&lt;/p&gt;
&lt;h3 id=&#34;55-应用场景统计推断在哪里用&#34;&gt;5.5 应用场景：统计推断在哪里用&lt;/h3&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;场景&lt;/th&gt;
					&lt;th&gt;用到的公式/概念&lt;/th&gt;
					&lt;th&gt;解决什么问题&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;A/B 测试与临床试验&lt;/td&gt;
					&lt;td&gt;假设检验、显著性水平 $\alpha$&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;新版页面是否提升转化&amp;quot;&amp;ldquo;新药是否有效&amp;rdquo;，本质都是本章的检验流程，常说的 $p$ 值就来自这里&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;民调与市场研究&lt;/td&gt;
					&lt;td&gt;区间估计&lt;/td&gt;
					&lt;td&gt;&amp;ldquo;在 95% 置信水平下支持率为 52%±3%&amp;quot;——那个 ±3% 就是置信区间的半径&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;质量检验（制造）&lt;/td&gt;
					&lt;td&gt;$t$ 检验、$F$ 检验&lt;/td&gt;
					&lt;td&gt;从整批产品中抽样，用 $t$ 检验判断均值是否达标，用 $F$ 检验比较两条生产线的稳定性&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;56-全书应用场景全景图&#34;&gt;5.6 全书应用场景全景图&lt;/h3&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
    P[&amp;#34;概率论核心&amp;#34;] --&amp;gt; A[&amp;#34;随机事件与概率&amp;#34;]
    P --&amp;gt; B[&amp;#34;三大分布&amp;#34;]
    P --&amp;gt; C[&amp;#34;期望与方差&amp;#34;]
    P --&amp;gt; D[&amp;#34;大数定律与中心极限定理&amp;#34;]
    P --&amp;gt; E[&amp;#34;参数估计与假设检验&amp;#34;]
    A --&amp;gt; A1[&amp;#34;垃圾邮件过滤 疾病筛查 故障诊断&amp;#34;]
    B --&amp;gt; B1[&amp;#34;质量抽检 排队分析 六西格玛管理&amp;#34;]
    C --&amp;gt; C1[&amp;#34;金融风险度量 投资组合 决策分析&amp;#34;]
    D --&amp;gt; D1[&amp;#34;抽样调查 AB测试 蒙特卡洛模拟 保险定价&amp;#34;]
    E --&amp;gt; E1[&amp;#34;临床试验 民调 质量检验&amp;#34;]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;避坑技巧新人最常犯的-8-个错误&#34;&gt;避坑技巧：新人最常犯的 8 个错误&lt;/h2&gt;
&lt;h3 id=&#34;坑-1把互斥当独立&#34;&gt;坑 1：把&amp;quot;互斥&amp;quot;当&amp;quot;独立&amp;rdquo;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误说法&lt;/strong&gt;：&amp;quot;$A$、$B$ 不能同时发生，所以它们独立。&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确理解&lt;/strong&gt;：互斥是 $P(A\cap B)=0$；独立是 $P(A\cap B)=P(A)P(B)$。对两个概率都大于 0 的事件，互斥恰恰意味着&lt;strong&gt;强烈不独立&lt;/strong&gt;——$A$ 发生了，$B$ 就一定不发生。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：掷骰子，$A$=掷出 1，$B$=掷出 2。互斥，但 $P(B\mid A)=0 \neq P(B)=\frac16$。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;坑-2以为-pamid-b-和-pbmid-a-差不多&#34;&gt;坑 2：以为 $P(A\mid B)$ 和 $P(B\mid A)$ 差不多&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误说法&lt;/strong&gt;：&amp;ldquo;检测阳性，说明 99% 是患者。&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确理解&lt;/strong&gt;：这两个条件概率由贝叶斯公式联系，差别取决于先验概率 $P(A)$ 与 $P(B)$。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：1.6 节的疾病检测例，$P(\text{阳}\mid\text{病})=99\%$ 但 $P(\text{病}\mid\text{阳})\approx 9\%$。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;坑-3认为连续型变量-pxa-就是密度-fa&#34;&gt;坑 3：认为连续型变量 $P(X=a)$ 就是密度 $f(a)$&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误说法&lt;/strong&gt;：&amp;quot;$f(2)=0.1$，所以 $X$ 取 2 的概率是 0.1。&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确理解&lt;/strong&gt;：连续型变量取任何单点的概率都是 $0$；$f(x)$ 是&lt;strong&gt;密度&lt;/strong&gt;不是概率，概率要积分：$P(a\le X\le b)=\int_a^b f(x)\,dx$。密度值甚至可以大于 1。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：$X\sim N(0, 0.1^2)$ 在 0 点的密度约为 $3.99$，显然不是概率。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;坑-4方差性质里忘记平方&#34;&gt;坑 4：方差性质里忘记平方&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误说法&lt;/strong&gt;：&amp;quot;$D(2X+3)=2D(X)+3$。&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确理解&lt;/strong&gt;：$D(aX+b)=a^2D(X)$，常数平移不影响波动，系数要平方。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：$D(X)=4$，则 $D(2X+3)=4\times 4=16$，不是 $11$。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;坑-5以为-exyexey-永远成立&#34;&gt;坑 5：以为 $E(XY)=E(X)E(Y)$ 永远成立&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误说法&lt;/strong&gt;：&amp;ldquo;期望可以随便拆成乘积。&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确理解&lt;/strong&gt;：这个等式需要 $X$、$Y$ &lt;strong&gt;独立&lt;/strong&gt;（或不相关）才成立；一般情形差的那一项正是协方差。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：掷骰子 $X$=点数，$Y=X^2$。显然不独立，$E(XY)=E(X^3)\neq E(X)E(X^2)$。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;坑-6把不相关当独立&#34;&gt;坑 6：把&amp;quot;不相关&amp;quot;当&amp;quot;独立&amp;quot;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误说法&lt;/strong&gt;：&amp;quot;$\rho=0$，所以 $X$ 和 $Y$ 没关系。&amp;quot;&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;：$X\sim U(-1,1)$，$Y=X^2$。$\mathrm{Cov}(X,Y)=0$，但 $Y$ 完全被 $X$ 决定，显然不独立。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;坑-7滥用中心极限定理&#34;&gt;坑 7：滥用中心极限定理&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误说法&lt;/strong&gt;：&amp;ldquo;任何 3 个随机变量加起来都近似正态。&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确理解&lt;/strong&gt;：中心极限定理要求&lt;strong&gt;独立（或弱依赖）、同分布、方差有限，且 $n$ 足够大&lt;/strong&gt;（经验上 $n\ge 30$ 左右）。$n$ 很小或变量强相关时不能乱用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：只掷 2 次骰子，点数和的分布是三角形，离正态差得远。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;坑-8混淆统计量和参数&#34;&gt;坑 8：混淆&amp;quot;统计量&amp;quot;和&amp;quot;参数&amp;quot;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;错误说法&lt;/strong&gt;：&amp;ldquo;用样本均值估计出来的数就是总体均值。&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正确理解&lt;/strong&gt;：$\bar{X}$ 是&lt;strong&gt;随机变量&lt;/strong&gt;（每次抽样结果都不同），$\mu$ 是&lt;strong&gt;固定常数&lt;/strong&gt;；估计只是&amp;quot;接近&amp;quot;，大数定律保证的是样本量大时的趋近，不是相等。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;例子&lt;/strong&gt;：同一总体抽两次样，各得 $\bar{X}=50.2$ 和 $\bar{X}=49.8$，都真实存在，但都不是 $\mu$ 本身。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;学习建议与资源建议&#34;&gt;学习建议与资源建议&lt;/h2&gt;
&lt;h3 id=&#34;学习路线建议&#34;&gt;学习路线建议&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先修排列组合&lt;/strong&gt;：不用很深，会分 $C_n^k$ 与 $A_n^k$、会算摸球问题即可，这是第一章的门票。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每个公式配一个能背下来的例子&lt;/strong&gt;：疾病检测之于贝叶斯、抽次品之于二项分布、身高之于正态分布。考试想不起公式时，先回忆例子。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;亲手推一遍核心恒等式&lt;/strong&gt;：$D(X)=E(X^2)-[E(X)]^2$、$\mathrm{Cov}=E(XY)-E(X)E(Y)$、贝叶斯公式由条件概率定义三步推出。推过一遍才真正属于你。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;做题顺序&lt;/strong&gt;：课本例题 → 课后基础题 → 再碰综合题。概率论的难题大多是&amp;quot;读题建模&amp;quot;难，先把&amp;quot;题目在说什么试验、问的是哪个事件&amp;quot;翻译清楚。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;区分两个世界&lt;/strong&gt;：概率论（模型 → 数据）与数理统计（数据 → 模型）是方向相反的两件事，第五章做题时经常要回头调用前四章的工具。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;教材与资源&#34;&gt;教材与资源&lt;/h3&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;：《概率论基础》（李贤平）适合想打更牢数学基础的人；Sheldon Ross 的 &lt;em&gt;A First Course in Probability&lt;/em&gt; 例题非常丰富。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;公开课&lt;/strong&gt;：可汗学院的概率统计入门（可视化好，适合零基础起步）；国内 MOOC 平台上各校的《概率论与数理统计》课程与教材配套看。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具&lt;/strong&gt;：学完理论后建议用 Python（&lt;code&gt;numpy&lt;/code&gt; + &lt;code&gt;scipy.stats&lt;/code&gt; + &lt;code&gt;matplotlib&lt;/code&gt;）模拟验证——比如模拟抛十万次硬币看频率收敛、模拟各种分布的和看中心极限定理，直观感受远胜纸面推导。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;一句话总结&#34;&gt;一句话总结&lt;/h3&gt;
&lt;p&gt;概率论的主线只有一条：&lt;strong&gt;从&amp;quot;事件的概率&amp;quot;到&amp;quot;随机变量的分布&amp;quot;，再到&amp;quot;用几个数字概括分布&amp;quot;&lt;/strong&gt;，最后用样本反过来推断总体。公式忘了可以查，但&amp;quot;概率是长期频率的稳定值&amp;quot;&amp;ldquo;小概率事件在一次试验中几乎不发生&amp;quot;这两个直觉，会陪你走很远。&lt;/p&gt;
</description>
    </item>
    <item>
      <title>教你打麻将</title>
      <link>https://ftmao.com/blog/posts/beimi-chess-card-game-summary/</link>
      <pubDate>Wed, 24 Jun 2020 14:00:00 +0800</pubDate>
      <guid>https://ftmao.com/blog/posts/beimi-chess-card-game-summary/</guid>
      <description>&lt;h1 id=&#34;教你打麻将&#34;&gt;教你打麻将&lt;/h1&gt;
&lt;p&gt;文章面向&lt;strong&gt;从未接触过联网游戏开发&lt;/strong&gt;的读者，所以前半部分会把&amp;quot;联网棋牌游戏到底是怎么跑起来的&amp;quot;讲清楚，中间穿插真实代码层面的例子；后半部分专门开一章讲四川麻将的新手实战策略——毕竟做麻将游戏的人，自己先得会打麻将。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;服务端：Java + Spring Boot + Netty（netty-socketio）+ Hazelcast + MySQL&lt;/li&gt;
&lt;li&gt;客户端：Cocos Creator / JavaScript&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;一先搞明白联网棋牌游戏到底是怎么回事&#34;&gt;一、先搞明白：联网棋牌游戏到底是怎么回事&lt;/h2&gt;
&lt;h3 id=&#34;11-单机游戏和联网游戏的本质区别&#34;&gt;1.1 单机游戏和联网游戏的本质区别&lt;/h3&gt;
&lt;p&gt;单机游戏里，所有逻辑都在你自己的设备上运行，规则由你的设备说了算。联网游戏不行——四个人打麻将，&lt;strong&gt;谁摸了什么牌、谁点了炮，必须有一个&amp;quot;裁判&amp;quot;说了算&lt;/strong&gt;，否则每个人的手机都各算各的，立刻就乱套了。&lt;/p&gt;
&lt;p&gt;这个&amp;quot;裁判&amp;quot;就是&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;graph TB
    subgraph 玩家设备
        C1[玩家A的手机&amp;lt;br/&amp;gt;Cocos Creator 客户端]
        C2[玩家B的手机]
        C3[玩家C的手机]
        C4[玩家D的手机]
    end
    S[游戏服务器&amp;lt;br/&amp;gt;贝密：Spring Boot + Netty]
    DB[(MySQL&amp;lt;br/&amp;gt;账号/战绩/房卡)]
    CACHE[(内存缓存 Hazelcast&amp;lt;br/&amp;gt;房间/牌局实时状态)]

    C1 &amp;lt;--&amp;gt;|WebSocket 长连接| S
    C2 &amp;lt;--&amp;gt; S
    C3 &amp;lt;--&amp;gt; S
    C4 &amp;lt;--&amp;gt; S
    S --&amp;gt; CACHE
    S -.异步落盘.-&amp;gt; DB&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;几个关键点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;牌在服务器手里&lt;/strong&gt;。洗牌、发牌都在服务器上做，客户端只负责&amp;quot;显示&amp;quot;和&amp;quot;发指令&amp;quot;。你在手机上点&amp;quot;打出三万&amp;quot;，本质是给服务器发了一条消息：&lt;code&gt;doplaycards: &amp;quot;12&amp;quot;&lt;/code&gt;，服务器校验&amp;quot;现在确实轮到你、你手里确实有三万&amp;quot;之后，才广播给全桌人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;每个人看到的信息不同&lt;/strong&gt;。服务器把同一局牌的状态，按&amp;quot;你能看到什么&amp;quot;过滤后分别发给四个人——你只能看到自己的手牌和别人打出来的牌。这叫&lt;strong&gt;信息不对称&lt;/strong&gt;，也是棋牌游戏和射击游戏最大的不同：状态同步必须分人定制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防作弊的第一道防线就是&amp;quot;服务器权威&amp;quot;&lt;/strong&gt;。客户端想赖牌（打出一张自己没有的牌），服务器直接拒绝。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;12-为什么用-websocket-而不是-http&#34;&gt;1.2 为什么用 WebSocket 而不是 HTTP&lt;/h3&gt;
&lt;p&gt;没接触过联网游戏的人容易问：发消息不就是调接口吗，用 HTTP 不行吗？&lt;/p&gt;
&lt;p&gt;不行，因为 HTTP 是&amp;quot;问一句答一句&amp;quot;，服务器没法&lt;strong&gt;主动&lt;/strong&gt;找你。而棋牌游戏里大量事件是服务器主动推的：轮到你出牌了、有人碰了你的牌、房间人齐了……这些都需要服务器&lt;strong&gt;随时&lt;/strong&gt;推消息给客户端。WebSocket 是一条建立后一直保持的双向通道，双方随时可以说话，延迟低、开销小。贝密用的 &lt;code&gt;netty-socketio&lt;/code&gt; 就是在 Netty 上实现了 Socket.IO 协议（跑在 WebSocket 上），客户端 Cocos Creator 里直接用 socket.io 的 JS 库连。&lt;/p&gt;
&lt;h3 id=&#34;13-房卡模式一张虚拟门票&#34;&gt;1.3 房卡模式：一张&amp;quot;虚拟门票&amp;quot;&lt;/h3&gt;
&lt;p&gt;贝密 0.8.0 主打&lt;strong&gt;房卡模式&lt;/strong&gt;，这也是 2016-2018 年棋牌游戏爆发的典型商业模式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你在商城购买&amp;quot;房卡&amp;quot;（虚拟道具，存在 MySQL 里）；&lt;/li&gt;
&lt;li&gt;你想和朋友打牌，就&amp;quot;开房&amp;quot;——消耗房卡，服务器生成一个 &lt;strong&gt;6 位数字房号&lt;/strong&gt;（贝密里由 &lt;code&gt;GameEngine.creatGameRoom&lt;/code&gt; 生成）；&lt;/li&gt;
&lt;li&gt;朋友在大厅输入房号进房（客户端发 &lt;code&gt;searchroom&lt;/code&gt; 事件），人齐开局；&lt;/li&gt;
&lt;li&gt;打完约定的局数，服务器出结算单，房间销毁。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;和陌生人随机撮合的&amp;quot;大厅模式&amp;quot;相比，房卡模式本质上卖的是&amp;quot;熟人社交的场地&amp;quot;，技术上则多了一个&amp;quot;按房号精确找房&amp;quot;的入口。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;二贝密的整体架构拆解&#34;&gt;二、贝密的整体架构拆解&lt;/h2&gt;
&lt;h3 id=&#34;21-架构总览&#34;&gt;2.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;graph LR
    subgraph 客户端
        A[Cocos Creator&amp;lt;br/&amp;gt;dizhu / majiang 模块]
    end
    subgraph 服务端 com.beimi
        B[GameEventHandler&amp;lt;br/&amp;gt;Socket 事件入口]
        C[GameEngine&amp;lt;br/&amp;gt;游戏总调度]
        D[自研状态机&amp;lt;br/&amp;gt;BeiMiStateMachine]
        E[Board 牌局内存模型&amp;lt;br/&amp;gt;MaJiangBoard / DuZhuBoard]
        F[Action/Task&amp;lt;br/&amp;gt;出牌·结算·计时任务]
    end
    subgraph 存储层
        G[(Hazelcast&amp;lt;br/&amp;gt;房间/牌局/玩家/撮合队列)]
        H[(cache2k&amp;lt;br/&amp;gt;过期回调当计时器)]
        I[Disruptor RingBuffer&amp;lt;br/&amp;gt;异步事件]
        J[(MySQL JPA)]
        K[(Elasticsearch)]
    end

    A &amp;lt;--&amp;gt;|WebSocket /game namespace| B
    B --&amp;gt; C --&amp;gt; D --&amp;gt; E
    D --&amp;gt; F
    E --&amp;gt; G
    F --&amp;gt; H
    C --&amp;gt; I
    I --&amp;gt; J
    I --&amp;gt; K&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;各层职责一句话概括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GameEventHandler&lt;/strong&gt;：所有 &lt;code&gt;@OnEvent&lt;/code&gt; 端点都在这里，负责把客户端消息翻译成人话（比如把 &lt;code&gt;&amp;quot;12,13&amp;quot;&lt;/code&gt; 解析成字节数组），然后交给 GameEngine；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GameEngine&lt;/strong&gt;：总调度，加房、开局、出牌、杠碰胡、离房、解散房间都从这儿过；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自研状态机&lt;/strong&gt;：驱动&amp;quot;房间&amp;quot;这个对象的生命周期（后面细讲）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Board 内存模型&lt;/strong&gt;：一局牌的完整状态（四家的手牌、桌面牌、轮到谁、倍率），只活在 Hazelcast 内存缓存里；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;存储分层&lt;/strong&gt;：实时状态全在 Hazelcast，MySQL 只存账号/战绩/房卡流水，而且是通过 Disruptor &lt;strong&gt;异步&lt;/strong&gt;写入——牌局进行中的一秒钟都不等数据库。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;22-一次出牌的完整旅程以麻将为例&#34;&gt;2.2 一次出牌的完整旅程（以麻将为例）&lt;/h3&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;sequenceDiagram
    participant P1 as 玩家A客户端
    participant H as GameEventHandler
    participant E as GameEngine
    participant B as MaJiangBoard
    participant T as 计时器(cache2k)
    participant P2 as 其他玩家客户端

    P1-&amp;gt;&amp;gt;H: emit(&amp;#34;doplaycards&amp;#34;, &amp;#34;12&amp;#34;)
    H-&amp;gt;&amp;gt;E: takeCardsRequest(token, card)
    E-&amp;gt;&amp;gt;B: 出牌校验 + 从手牌移除
    E-&amp;gt;&amp;gt;T: remove(roomid) 取消A的出牌倒计时
    E--&amp;gt;&amp;gt;P2: 广播 &amp;#34;command&amp;#34;: takecards
    E-&amp;gt;&amp;gt;E: checkMJCard 遍历其他家&amp;lt;br/&amp;gt;查 杠/碰/吃/胡
    alt 有人能杠碰胡
        E-&amp;gt;&amp;gt;T: 挂5秒等待任务(DEAL事件)
        P2-&amp;gt;&amp;gt;H: emit(&amp;#34;selectaction&amp;#34;, &amp;#34;peng&amp;#34;)
        H-&amp;gt;&amp;gt;E: actionEventRequest 执行碰
    else 无人响应
        E-&amp;gt;&amp;gt;B: dealRequest 下家抓牌
        E--&amp;gt;&amp;gt;P2: 广播 &amp;#34;command&amp;#34;: dealcard
        E-&amp;gt;&amp;gt;T: 挂8秒出牌任务&amp;lt;br/&amp;gt;(超时自动打)
    end&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;举例说明&lt;/strong&gt;：假设你打出一张&amp;quot;五筒&amp;quot;，服务器干的事依次是——&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;校验：轮到你、你有五筒、这张牌合法；&lt;/li&gt;
&lt;li&gt;把你 8 秒的出牌倒计时从计时器缓存里删掉（你不主动出，超时会由 &lt;code&gt;CreateMJPlayCardsTask&lt;/code&gt; 强制替你出）；&lt;/li&gt;
&lt;li&gt;广播给全桌：&amp;ldquo;A 打了五筒&amp;rdquo;；&lt;/li&gt;
&lt;li&gt;挨个问另外三家：你能碰吗？能杠吗？能胡吗？（定缺了筒子的那家直接跳过——这就是四川麻将的规则在代码里的体现，&lt;code&gt;GameUtils.processMJCard&lt;/code&gt; 里定缺花色不参与判断）；&lt;/li&gt;
&lt;li&gt;如果 B 能碰，给 B 弹&amp;quot;碰/过&amp;quot;按钮，牌局挂起 5 秒等他决定；B 点了&amp;quot;碰&amp;quot;，就执行碰、轮到 B 出牌；&lt;/li&gt;
&lt;li&gt;如果三家都&amp;quot;过&amp;quot;，下家自动摸一张牌，服务器先替他检查一次&amp;quot;摸上来的牌能不能暗杠/自摸&amp;quot;，然后通知他出牌，重新挂上 8 秒倒计时。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;整个过程中，客户端只做两件事：把服务器的消息渲染成动画，把玩家的点击发给服务器。&lt;/p&gt;
&lt;h3 id=&#34;23-房间的状态机流转&#34;&gt;2.3 房间的状态机流转&lt;/h3&gt;
&lt;p&gt;房间是有生命的：创建、等人、人齐、开局、结算、销毁。贝密没有用 Spring StateMachine，而是&lt;strong&gt;自研了一个极简状态机&lt;/strong&gt;（&lt;code&gt;core/statemachine&lt;/code&gt; 包），每种游戏一个 Bean：&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;stateDiagram-v2
    [*] --&amp;gt; NONE
    NONE --&amp;gt; CRERATED: ENTER 创建房间
    CRERATED --&amp;gt; WAITTING: JOIN 玩家陆续进房
    WAITTING --&amp;gt; READY: ENOUGH 人齐
    WAITTING --&amp;gt; WAITTING: AUTO 超时补AI机器人
    READY --&amp;gt; BEGIN: RAISEHANDS 全员准备
    BEGIN --&amp;gt; LASTHANDS: 发牌完成
    LASTHANDS --&amp;gt; PLAY: 庄家打出首张
    PLAY --&amp;gt; PLAY: DEAL/PLAYCARDS&amp;lt;br/&amp;gt;摸牌出牌循环
    PLAY --&amp;gt; END: ALLCARDS 有人胡牌/牌摸完
    END --&amp;gt; [*]: 结算发战报&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;状态机里每个&amp;quot;事件&amp;quot;对应一串 Action（比如麻将的链路是 &lt;code&gt;EnterAction → JoinAction → EnoughAction → SelectAction(定缺) → MJRaiseHandsAction → DealMJCardAction → PlayMJCardsAction → AllCardsAction&lt;/code&gt;），业务代码只需要一句 &lt;code&gt;game.change(room, event, intervalSeconds)&lt;/code&gt;，状态机负责找到对应 Action 执行，并由 Action 顺手创建下一个延时任务，形成闭环。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;三断线重连联网游戏逃不掉的工程问题&#34;&gt;三、断线重连：联网游戏逃不掉的工程问题&lt;/h2&gt;
&lt;p&gt;新手最容易低估的就是这块。手机上打牌，来个电话、进个电梯，连接说断就断。贝密的处理方式是&amp;quot;托管 + 快照恢复&amp;quot;：&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{服务器收到&amp;lt;br/&amp;gt;OnDisconnect}
    B --&amp;gt;|玩家正在对局中| C[标记 OFFLINE&amp;lt;br/&amp;gt;进入托管状态]
    C --&amp;gt; D[计时器超时后&amp;lt;br/&amp;gt;auto=true 自动出牌]
    D --&amp;gt; E{玩家重连?}
    E --&amp;gt;|emit recovery| F[GameEngine 查缓存&amp;lt;br/&amp;gt;发现该房间有进行中的 Board]
    F --&amp;gt; G[下发 RecoveryData 全量快照:&amp;lt;br/&amp;gt;自己的手牌/桌面牌/轮到谁/剩余倒计时25s]
    G --&amp;gt; H[客户端按快照重建牌桌画面]
    E --&amp;gt;|一直没回来| I[AI托管打到本局结束]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;&lt;strong&gt;举例&lt;/strong&gt;：你出牌出了半局断网了，服务器不会暂停牌局等你（其他三个人不答应），而是把你标记为 OFFLINE，由超时任务替你&amp;quot;摸什么打什么&amp;quot;。30 秒后你连回来了，客户端发 &lt;code&gt;recovery&lt;/code&gt;，服务器把当前牌局的完整快照发给你，你的手机根据快照把桌面重新画出来，无缝接上。注意重连期间你是被托管的——所以掉线久了回来，往往牌已经很难看了，这是规则的一部分。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;四四川麻将新手致胜策略一个结构化的决策框架&#34;&gt;四、四川麻将新手致胜策略：一个结构化的决策框架&lt;/h2&gt;
&lt;p&gt;做了这么久的麻将游戏，经常被问&amp;quot;新手怎么提高胜率&amp;quot;。零散的口诀（&amp;ldquo;记牌&amp;quot;&amp;ldquo;防点炮&amp;rdquo;）新手记不住也用不上，所以这一章我把四川麻将的策略整理成一个&lt;strong&gt;结构化框架&lt;/strong&gt;：先确立唯一的目标函数，再按&amp;quot;战略层 → 信息层 → 战术层 → 概率层&amp;quot;四个层级组织所有决策，最后给出血战到底的特有推论和新手错误清单。逻辑主线只有一句话：&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;40-规则即策略先立规则再推结论&#34;&gt;4.0 规则即策略：先立规则，再推结论&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定缺&lt;/strong&gt;：开局后每人必须选一门花色（万/筒/条）作为&amp;quot;缺门&amp;rdquo;，胡牌时手里不能有这门牌，摸到缺门的牌必须打掉。牌墙只有 108 张（三门花色，无风牌）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;血战到底&lt;/strong&gt;：一家胡牌不结束牌局，剩下的人继续打，直到牌摸完或只剩一家没胡。点炮只有点炮者付分，最后没胡的人还要给已听牌的人&amp;quot;查叫&amp;quot;赔分。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;从这两条规则可以直接推出三条战略推论，整章都是它们的展开：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;信息压缩&lt;/strong&gt;：定缺把每家的&amp;quot;有效牌域&amp;quot;从三门砍到两门，而且是&lt;strong&gt;公开信息&lt;/strong&gt;。读牌成本比别的麻将低一个量级——新手也能读。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间价值&lt;/strong&gt;：牌局不因一人胡牌而结束，每张牌的价值随牌墙减少而衰减。&lt;strong&gt;&amp;ldquo;还剩几巡&amp;quot;是所有决策的隐含变量&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;止损优先&lt;/strong&gt;：点炮只由点炮者一人付分、没胡要赔查叫——&lt;strong&gt;落后的代价是确定的，追上的收益是概率性的&lt;/strong&gt;。这决定了&amp;quot;不跟随到最后&amp;quot;在数学上往往是对的。&lt;/li&gt;
&lt;/ol&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
    R1[规则一: 定缺&amp;lt;br/&amp;gt;缺门公开] --&amp;gt; C1[推论一: 信息压缩&amp;lt;br/&amp;gt;读牌成本低]
    R2[规则二: 血战到底&amp;lt;br/&amp;gt;胡牌不终局] --&amp;gt; C2[推论二: 时间价值&amp;lt;br/&amp;gt;剩几巡是隐含变量]
    R2 --&amp;gt; C3[推论三: 止损优先&amp;lt;br/&amp;gt;点炮独赔+查叫保底]
    C1 --&amp;gt; S[决定 4.2 信息层怎么读]
    C2 --&amp;gt; S2[决定 4.4 何时切换路线]
    C3 --&amp;gt; S3[决定 4.5 防守与保底策略]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;41-战略层起手评估与路线选择&#34;&gt;4.1 战略层：起手评估与路线选择&lt;/h3&gt;
&lt;p&gt;拿到起手牌、定缺之前，先给牌打分。不需要精确，三个数就够：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;向听数&lt;/strong&gt;：还差几张牌能听牌。数一下你手里有几个成型搭子/刻子/对子，13 张牌需要 4 副 + 1 将，差几副就是几向听。新手只要会区分&amp;quot;两向听以内（好牌）&amp;ldquo;和&amp;quot;三向听以上（差牌）&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;对子数&lt;/strong&gt;：4 对以上 → 七对/大对子路线候选；0~1 对 → 别惦记对子路线。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同花色集中度&lt;/strong&gt;：9 张以上同花色 → 清一色路线候选。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;定缺选择&lt;/strong&gt;是第一个战略决策，原则按优先级排：&lt;/p&gt;
&lt;ol&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;（1、9 多），因为端张成搭能力弱。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;举例&lt;/strong&gt;：起手万子 2 张（三万、八万，无关联）、筒子 5 张（两个搭子）、条子 6 张（一个刻子一个边搭）。毫无疑问题缺万——但如果万子是 2 张而筒子是 3 张但全是散牌，就该缺筒子：定缺看的是&amp;quot;废牌数量&amp;rdquo;，不是&amp;quot;张数&amp;rdquo;。&lt;/p&gt;
&lt;p&gt;定缺公布后立即做第二步战略判断：&lt;strong&gt;看三家的缺门，决定做大还是快跑&lt;/strong&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;/ul&gt;
&lt;p&gt;至此，三条路线已经清晰：&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;路线&lt;/th&gt;
					&lt;th&gt;触发条件&lt;/th&gt;
					&lt;th&gt;目标&lt;/th&gt;
					&lt;th&gt;核心动作&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;快跑&lt;/td&gt;
					&lt;td&gt;牌型一般、向听小、花色被抢&lt;/td&gt;
					&lt;td&gt;最速听牌、先胡锁定收益&lt;/td&gt;
					&lt;td&gt;牌效优先，不留废搭&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;做大&lt;/td&gt;
					&lt;td&gt;起手 9 张+同花色/4 对+，且无竞争&lt;/td&gt;
					&lt;td&gt;清一色/大对子/七对&lt;/td&gt;
					&lt;td&gt;忍受慢听牌，屯关键张&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;防守&lt;/td&gt;
					&lt;td&gt;有人已听牌且自己手牌差&lt;/td&gt;
					&lt;td&gt;不点炮、保查叫底线&lt;/td&gt;
					&lt;td&gt;只打熟张，听牌优先于胡牌&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&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[拿到13张起手牌] --&amp;gt; B[三个数打分:&amp;lt;br/&amp;gt;向听数 / 对子数 / 同花色集中度]
    B --&amp;gt; C{定缺: 缺哪门?}
    C --&amp;gt;|第一优先| C1[缺张数最少的门]
    C --&amp;gt;|张数相近| C2[缺结构最差的门&amp;lt;br/&amp;gt;孤张多没搭子]
    C --&amp;gt;|还纠结| C3[缺端张多的门&amp;lt;br/&amp;gt;1和9成搭弱]
    C1 &amp;amp; C2 &amp;amp; C3 --&amp;gt; D[公布定缺&amp;lt;br/&amp;gt;观察三家缺门]
    D --&amp;gt; E{有人抢我要做的花色?}
    E --&amp;gt;|两家以上缺我这门&amp;lt;br/&amp;gt;绿灯| F{起手支持做大?&amp;lt;br/&amp;gt;9张+同花色 或 4对+}
    F --&amp;gt;|是| G[做大路线&amp;lt;br/&amp;gt;清一色/大对子/七对]
    F --&amp;gt;|否| H[快跑路线&amp;lt;br/&amp;gt;最速听牌]
    E --&amp;gt;|三家都抢我这门| H
    E --&amp;gt;|牌型差 三向听以上| I[保守推进&amp;lt;br/&amp;gt;随时准备转防守]
    style G fill:#ffe6cc
    style H fill:#d4edda
    style I fill:#f8d7da&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;路线不是选定就不变——&lt;strong&gt;每一巡都可以用新信息重估&lt;/strong&gt;，4.4 会给出切换的量化标准。&lt;/p&gt;
&lt;h3 id=&#34;42-信息层记牌与读牌&#34;&gt;4.2 信息层：记牌与读牌&lt;/h3&gt;
&lt;p&gt;信息层回答&amp;quot;我知道什么&amp;quot;。它分两半：&lt;strong&gt;记牌&lt;/strong&gt;是对已发生事实的压缩存储，&lt;strong&gt;读牌&lt;/strong&gt;是从事实反推未知信息。&lt;/p&gt;
&lt;h4 id=&#34;421-记牌分层记忆法&#34;&gt;4.2.1 记牌：分层记忆法&lt;/h4&gt;
&lt;p&gt;让新手背下三家打过的每张牌不现实。按重要性只记三类：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一层：记&amp;quot;张数&amp;quot;不记&amp;quot;顺序&amp;quot;。&lt;/strong&gt; 每门花色每张牌只有 4 张。你不需要记住&amp;quot;上家第 3 巡打了七万&amp;quot;，只需在脑子里维护计数：&amp;ldquo;七万已见 3 张&amp;rdquo;。重点盯的是&lt;strong&gt;你自己将牌和搭子两端的关键牌&lt;/strong&gt;——你手里 6、8 万等卡 7 万，&amp;ldquo;7 万见了几张&amp;quot;直接决定这个搭子的死活：见 3 张以上，搭子基本死了，趁早拆。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二层：记&amp;quot;缺门&amp;quot;和&amp;quot;花色倾向&amp;rdquo;。&lt;/strong&gt; 定缺后，对手打出的&lt;strong&gt;非缺门&lt;/strong&gt;花色才是有效信息。下家缺条，从第 2 巡起一直打筒子、摸到万子全留——一句话记住&amp;quot;下家只留万&amp;quot;即可，不用记他打的每一张。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三层：记&amp;quot;序盘的反常中张&amp;quot;。&lt;/strong&gt; 序盘（前 4~5 巡）正常人先打孤张边张（1、9）。有人序盘就打 4、5、6 中张，说明这门要么极好（搭子齐了中张多余）要么整门不要，结合缺门大概率能分辨。&lt;/p&gt;
&lt;p&gt;口诀：&lt;strong&gt;数自己的关键张，记别人的花色倾向，盯序盘的反常中张。&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 class=&#34;language-mermaid&#34; data-lang=&#34;mermaid&#34;&gt;flowchart BT
    L1[第三层: 序盘反常中张&amp;lt;br/&amp;gt;一两个反常信号即可&amp;lt;br/&amp;gt;精力占比 ~10%] --&amp;gt; L2[第二层: 缺门与花色倾向&amp;lt;br/&amp;gt;每家一句话: 他只留X&amp;lt;br/&amp;gt;精力占比 ~30%]
    L2 --&amp;gt; L3[第一层: 关键张计数&amp;lt;br/&amp;gt;自己搭子两端的牌各见几张&amp;lt;br/&amp;gt;精力占比 ~60%]
    L3 --&amp;gt; R[收益: 搭子死活判断&amp;lt;br/&amp;gt;直接决定拆不拆]
    L2 --&amp;gt; R2[收益: 知道谁在收哪门&amp;lt;br/&amp;gt;直接决定防什么]
    L1 --&amp;gt; R3[收益: 序盘读出牌型方向]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h4 id=&#34;422-读牌他要什么不要什么打什么危险&#34;&gt;4.2.2 读牌：他要什么、不要什么、打什么危险&lt;/h4&gt;
&lt;p&gt;读牌的本质是&lt;strong&gt;用别人的&amp;quot;打出&amp;quot;反推他的&amp;quot;留下&amp;quot;&lt;/strong&gt;——人留下什么牌，才会打出什么牌。按牌局阶段读不同的东西：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;序盘读&amp;quot;结构&amp;quot;&lt;/strong&gt;：缺门 + 反常中张 + 第一碰，拼出每家的大致牌型方向。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;中盘读&amp;quot;进度&amp;quot;&lt;/strong&gt;：看连续动作。上家碰了&amp;quot;二筒&amp;quot;后摸打筒子以外的牌，说明他筒子上还有货；碰完后打的那张牌的&lt;strong&gt;邻张&lt;/strong&gt;往往是他不需要的（碰二筒后打五万，他大概率没有 3-4 万、4-6 万的搭子）；碰了二筒后打的还是筒子，几乎可断定他在做筒子清一色或已听牌。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;尾盘读&amp;quot;节奏&amp;quot;&lt;/strong&gt;：一个人&lt;strong&gt;连续摸牌就打（摸打）&lt;/strong&gt;，说明手牌已成型，打出的就是刚摸的；反过来&lt;strong&gt;想了很久才打出一张&lt;/strong&gt;，说明这张是从手里&amp;quot;拆&amp;quot;出来的，他在这张牌附近有搭子变动，其邻张不再安全。&lt;/p&gt;
&lt;p&gt;由此得到防点炮 checklist，中后盘（牌墙剩 1/3 以内）每打一张前过一遍：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;这张牌见过几张？&lt;/strong&gt; 见 2~3 张的熟张相对安全；一张没见的生张风险最高。&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;/ol&gt;
&lt;p&gt;&lt;strong&gt;完整例子&lt;/strong&gt;：对家定缺条子，碰了&amp;quot;三筒&amp;quot;，摸打两巡后思考良久切出&amp;quot;八万&amp;quot;。推断：他在做筒子（碰三筒+留筒），八万是万子里的多余搭子；&lt;strong&gt;你手里五、六、七万从此相对安全&lt;/strong&gt;（他不要万子），但&lt;strong&gt;任何生张筒子都是高危&lt;/strong&gt;，尤其一、二、四筒（三筒邻张）。&lt;/p&gt;
&lt;p&gt;读牌的推理链条固定是&amp;quot;观察 → 反推 → 行动&amp;quot;三段，常见信号对照如下：&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 观察[他打出/做了什么]
        O1[缺门公布后&amp;lt;br/&amp;gt;一直打筒留万]
        O2[碰二筒后&amp;lt;br/&amp;gt;又打出筒子]
        O3[碰二筒后&amp;lt;br/&amp;gt;打出五万]
        O4[连续摸打]
        O5[长考后拆出八万]
    end
    subgraph 反推[他留下/在想什么]
        I1[在做万子清一色]
        I2[筒子听牌或做筒]
        I3[万子3-4/4-6搭子不存在&amp;lt;br/&amp;gt;→ 万字邻张变安全]
        I4[手牌已成型&amp;lt;br/&amp;gt;打的就是刚摸的]
        I5[八万附近有搭子变动&amp;lt;br/&amp;gt;→ 邻张不安全]
    end
    subgraph 行动[我该怎么办]
        A1[生张万子列为高危]
        A2[生张筒子绝不打]
        A3[手里4万6万可放心打]
        A4[按他已听牌对待&amp;lt;br/&amp;gt;进入防守]
        A5[七万九万扣住观察]
    end
    O1 --&amp;gt; I1 --&amp;gt; A1
    O2 --&amp;gt; I2 --&amp;gt; A2
    O3 --&amp;gt; I3 --&amp;gt; A3
    O4 --&amp;gt; I4 --&amp;gt; A4
    O5 --&amp;gt; I5 --&amp;gt; A5&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;43-战术层牌效这一巡到底打哪张&#34;&gt;4.3 战术层：牌效——这一巡到底打哪张&lt;/h3&gt;
&lt;p&gt;战术层是执行：在路线已定、信息已有的前提下，每张出牌都按同一套优先级评估。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;出牌优先级（无安全压力时）&lt;/strong&gt;：缺门牌（必打）→ 孤立端张（无邻张的 1、9）→ 孤立中张 → 多余搭子中进张最少的那张 → 拆搭子。&lt;strong&gt;核心原则是&amp;quot;每一巡都最大化有效进张总数&amp;quot;&lt;/strong&gt;：假设搭子 A（4-5 万）有 8 张潜在进张、搭子 B（1-2 筒）只有 3 张潜在进张，要拆就先拆 B——哪怕 B 看起来更&amp;quot;连得顺&amp;quot;。注意&amp;quot;潜在进张&amp;quot;还要减去已见张数，见 3 张的两面搭子不如没见过的卡张。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;碰/杠决策&lt;/strong&gt;是新手最容易犯错的地方，默认答案是&amp;quot;&lt;strong&gt;不碰&lt;/strong&gt;&amp;quot;，除非满足以下至少一条：&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;/ul&gt;
&lt;p&gt;因为碰有隐性成本：&lt;strong&gt;暴露信息&lt;/strong&gt;（全桌知道你在收这门）、&lt;strong&gt;破坏门清弹性&lt;/strong&gt;（碰完之后手牌变窄，改路线更难）、&lt;strong&gt;改变摸牌顺序&lt;/strong&gt;（可能把本该你摸的关键张让给下家）。杠同理：明杠多摸一张且血战里&amp;quot;杠上花&amp;quot;有额外收益，但同样暴露信息，尾盘还可能给别人开&amp;quot;杠上炮&amp;quot;。&lt;strong&gt;起手做大时积极碰杠，快跑路线时能不碰就不碰。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;听口选择&lt;/strong&gt;遵循两个数字：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;听口宽度&lt;/strong&gt;：两面听（8 张潜在）&amp;gt; 卡张/边张（4 张）&amp;gt; 对倒/单钓（2~4 张）。能选宽不选窄；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;剩余张数&lt;/strong&gt;：减去已见的。听见过 2 张的两面（剩 4~6 张），通常不如听没见过的卡张（剩 4 张但还有别人扣牌的空间）。尾盘再加一条修正：&lt;strong&gt;听熟张&lt;/strong&gt;——别人敢打的牌，你才能吃到点炮；听生张只能指望自摸。&lt;/li&gt;
&lt;/ol&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[打缺门牌]
    B --&amp;gt;|没有| D{有孤立端张?&amp;lt;br/&amp;gt;无邻张的1/9}
    D --&amp;gt;|有| E[打孤立端张]
    D --&amp;gt;|没有| F{有孤立中张?}
    F --&amp;gt;|有| G[打孤立中张]
    F --&amp;gt;|没有| H{搭子进张数比较}
    H --&amp;gt;|拆进张最少的搭子| I[打出该搭子中&amp;lt;br/&amp;gt;价值更低的一张]
    C &amp;amp; E &amp;amp; G &amp;amp; I --&amp;gt; J[打完前最后过一遍&amp;lt;br/&amp;gt;4.2.2 防点炮checklist]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&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
    P[别人打出一张牌&amp;lt;br/&amp;gt;我可以碰/杠] --&amp;gt; Q{碰了立刻听牌&amp;lt;br/&amp;gt;或是对子路线?}
    Q --&amp;gt;|是| R[碰]
    Q --&amp;gt;|否| S{我在做大&amp;lt;br/&amp;gt;且碰能加速成型?}
    S --&amp;gt;|是| R
    S --&amp;gt;|否| T{不碰就永远&amp;lt;br/&amp;gt;等不到这张?}
    T --&amp;gt;|是| R
    T --&amp;gt;|否| U[不碰, 默认答案]
    U -.成本.-&amp;gt; V1[暴露信息: 全桌知道你收这门]
    U -.成本.-&amp;gt; V2[破坏门清弹性: 手牌变窄]
    U -.成本.-&amp;gt; V3[改变摸牌顺序: 可能放走关键张]
    style U fill:#d4edda
    style R fill:#fff3cd&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;h3 id=&#34;44-概率层期望值决策做大快跑防守的切换点&#34;&gt;4.4 概率层：期望值决策——做大、快跑、防守的切换点&lt;/h3&gt;
&lt;p&gt;这是整个框架的&amp;quot;调度器&amp;quot;，回答&amp;quot;什么时候换路线&amp;quot;。先把 4.3 的直觉量化成一个可心算的模型。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;基本概率感觉&lt;/strong&gt;：任一时刻，你某方向的&amp;quot;期望进展&amp;quot; ≈ 剩余进张数 × 剩余可摸次数。你手里 4-5 万等 3/6 万，若都少见，剩余进张约 6-8 张；牌墙剩 40 张、四家轮流摸，你大约还能摸 8-10 次，摸中概率相当可观。但如果 3/6 万已见 3 张，进张只剩 1~2 张，期望直接砍到四分之一以下——&lt;strong&gt;搭子的价值不看牌面，看剩余进张数&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;切换到&amp;quot;做大&amp;quot;的条件&lt;/strong&gt;（需同时满足）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;起手结构支持：9 张以上同花色，或 4 对以上；&lt;/li&gt;
&lt;li&gt;进张供给充足：三家缺门不与你抢这门（4.1 的绿灯）；&lt;/li&gt;
&lt;li&gt;时间充足：牌墙过半之前。做牌是&amp;quot;用听牌速度换番数&amp;quot;，起手离目标越近、剩余巡数越多，换得越划算；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;血战规则加成&lt;/strong&gt;：一家胡牌不结束牌局，早胡者只是先锁定小收益，晚胡的大牌仍能兑现——大牌的&amp;quot;被截胡损失&amp;quot;比推倒胡小得多，所以四川麻将天然鼓励做牌。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;切换到&amp;quot;快跑/止损&amp;quot;的条件&lt;/strong&gt;（满足任一即执行）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;进张枯竭&lt;/strong&gt;：关键牌期望进张 &amp;lt; 2，每一巡等待都是负期望——马上换听、拆死搭子；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有人已听牌且你生张密集&lt;/strong&gt;：此时你的期望收益为负（点炮赔分 + 被查叫），最优解不是&amp;quot;我也赶紧听&amp;quot;，而是&lt;strong&gt;只打熟张把点炮概率压到最低&lt;/strong&gt;，保住查叫底线。这就是&amp;quot;不跟随到最后&amp;quot;——追不上就不再投入，及时止损；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;牌墙见底（剩 15 张以内）还没听牌&lt;/strong&gt;：做牌的时间价值归零，唯一目标是&lt;strong&gt;听牌防查叫&lt;/strong&gt;——往剩余张数最多的熟张方向听，只听一张也比&amp;quot;做了一半的大牌&amp;quot;值钱。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;一个简化的期望算账例子&lt;/strong&gt;（假设平胡 1 番 = 2 分，清一色 4 番 = 16 分）：你听牌了，可以选听口 A——平胡两面听，剩余进张 6 张；或改听口 B——清一色单钓，剩余进张 2 张。若剩余可摸次数约 6 次、点炮胡与自摸混合，A 的期望收益约是正 6~8 分；B 做成的概率约一半不到，做成了 16 分、做不成还要承担被查叫赔 2 分——期望约 6 分，且方差巨大。&lt;strong&gt;结论：番数翻倍抵不过进张减半，除非时间足够早或你已经落后必须搏。&lt;/strong&gt; 新手默认选宽听口，永远是长期正期望。&lt;/p&gt;
&lt;p&gt;把&amp;quot;什么时候切换路线&amp;quot;画成一张象限图——横轴是你的剩余进张，纵轴是牌局剩余时间，每巡定位一次自己落在哪个象限：&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 TB
    UP[纵轴 ↑ 剩余时间多] --- TOP
    subgraph TOP[ ]
        direction LR
        LEFT2[进张少] ~~~ A[换听调整&amp;lt;br/&amp;gt;时间够但方向死了&amp;lt;br/&amp;gt;例: 卡七万已见三张]
        A ~~~ B[做大&amp;lt;br/&amp;gt;时间够且进张足&amp;lt;br/&amp;gt;例: 起手清一色九张]
        B ~~~ RIGHT2[进张多]
    end
    TOP --- BOT
    subgraph BOT[ ]
        direction LR
        LEFT[进张少] ~~~ C[防守保底&amp;lt;br/&amp;gt;先听牌防查叫&amp;lt;br/&amp;gt;例: 剩十二张没听牌]
        C ~~~ D[快跑&amp;lt;br/&amp;gt;进张还在抢时间&amp;lt;br/&amp;gt;例: 两面听六张剩半局]
        D ~~~ RIGHT[进张多]
    end
    BOT --- DOWN[纵轴 ↓ 剩余时间少]
    style A fill:#fff3cd
    style B fill:#ffe6cc
    style C fill:#f8d7da
    style D fill:#d4edda&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;两条边界记死：&lt;strong&gt;进张 &amp;lt; 2 立刻换方向（左半区行动），剩 15 张只保听牌（下半区行动）&lt;/strong&gt;。右下象限是血战到底最常见的好局面——进张还在但时间不多，别犹豫，最快胡法锁收益。&lt;/p&gt;
&lt;h3 id=&#34;45-血战到底的三条特有推论&#34;&gt;4.5 血战到底的三条特有推论&lt;/h3&gt;
&lt;p&gt;规则特殊，策略就有别处用不上的推论：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先胡是&amp;quot;锁仓&amp;quot;，不是&amp;quot;胜利&amp;quot;&lt;/strong&gt;。你第一个平胡跑了，只是锁定 2 分；剩下三人继续打，大牌仍在你走后兑现。所以领先时&lt;strong&gt;快跑锁收益&lt;/strong&gt;，落后时反而要&lt;strong&gt;做大搏翻盘&lt;/strong&gt;——这和推倒胡&amp;quot;先胡为王&amp;quot;的直觉相反。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;查叫把尾盘变成了保底竞赛&lt;/strong&gt;。没胡的人要给听牌者赔分，所以尾盘的及格线是&amp;quot;听牌&amp;quot;而不是&amp;quot;胡牌&amp;quot;。最后 15 张，一切决策让位于&amp;quot;听上&amp;quot;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;点炮一人付，防守成本低&lt;/strong&gt;。别人自摸三家分摊、你点炮你独赔——你打熟张&amp;quot;放生&amp;quot;别人自摸，损失远小于你点炮。所以防守期打熟张不仅是避险，还是&lt;strong&gt;把损失转移给全桌分摊&lt;/strong&gt;的理性选择。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;三种结算方式的赔付流向对比，一看就懂为什么&amp;quot;防守打熟张&amp;quot;是理性选择：&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 点炮[你点炮: 你独赔]
        Y1[你 -8分] --&amp;gt; H1[胡牌者 +8分]
        O1[另两家 0分]
    end
    subgraph 自摸[对手自摸: 三家分摊]
        Y2[你 -3分] --&amp;gt; H2[胡牌者 +9分]
        O2[另两家各 -3分] --&amp;gt; H2
    end
    subgraph 查叫[流局查叫: 没听赔听牌]
        Y3[你没听 -2分] --&amp;gt; H3[听牌者 +2分]
    end
    style Y1 fill:#f8d7da
    style Y2 fill:#fff3cd
    style Y3 fill:#d4edda&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;同样是对手胡牌，你点炮亏 8 分、放生他自摸只亏 3 分——&lt;strong&gt;防守期每打一张熟张，赚的就是这个差价。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&#34;46-新手常见错误清单&#34;&gt;4.6 新手常见错误清单&lt;/h3&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;——7 万已见 3 张还抱着 6、8 万不拆，每巡都在付租金；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;做大不看缺门&lt;/strong&gt;——三家都抢你这门还硬做清一色，供给断了；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;尾盘还想着翻盘&lt;/strong&gt;——剩 15 张没听牌，唯一 KPI 是听牌防查叫；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不跟随到最后反着用&lt;/strong&gt;——该止损时硬追生张点炮，该搏的时候（落后、时间早）却提前保守。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;47-一页纸决策框架&#34;&gt;4.7 一页纸决策框架&lt;/h3&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{信息更新:&amp;lt;br/&amp;gt;关键张已见数/&amp;lt;br/&amp;gt;三家缺门/谁听牌了}
    B --&amp;gt; C{阶段判断}
    C --&amp;gt;|序盘: 定缺+定路线| D{起手支持做大?&amp;lt;br/&amp;gt;9张+同花色/4对+&amp;lt;br/&amp;gt;且三家不抢这门}
    D --&amp;gt;|是| E[做大路线:&amp;lt;br/&amp;gt;积极碰杠, 屯关键张]
    D --&amp;gt;|否| F[快跑路线:&amp;lt;br/&amp;gt;牌效优先, 能不碰不碰]
    C --&amp;gt;|中盘| G{有人已听牌&amp;lt;br/&amp;gt;且我生张密集?}
    G --&amp;gt;|是| H[防守: 只打熟张&amp;lt;br/&amp;gt;放生自摸, 不点炮]
    G --&amp;gt;|否| I{我的关键进张&amp;lt;br/&amp;gt;剩余&amp;gt;=4?}
    I --&amp;gt;|是| J[继续推进&amp;lt;br/&amp;gt;选进张最多的打]
    I --&amp;gt;|否| K[拆死搭子&amp;lt;br/&amp;gt;换听熟张方向]
    C --&amp;gt;|尾盘: 剩15张内| L{已听牌?}
    L --&amp;gt;|否| M[唯一目标: 听牌防查叫&amp;lt;br/&amp;gt;听剩张最多的熟张]
    L --&amp;gt;|是| N[宽听口优先&amp;lt;br/&amp;gt;不为一番改窄]&lt;/code&gt;&lt;/pre&gt;
  &lt;/div&gt;&lt;p&gt;四个层级的关系：&lt;strong&gt;战略层定方向，信息层供弹药，战术层管执行，概率层负责喊停。&lt;/strong&gt; 新手先把战术层的&amp;quot;进张最大化&amp;quot;练成肌肉记忆，再逐步叠加记牌和读牌，最后学会用期望值喊停——这条学习路径本身也是按依赖关系排的。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;五贝密的技术亮点&#34;&gt;五、贝密的技术亮点&lt;/h2&gt;
&lt;p&gt;最后回到工程，挑几个我认为值得讲的点。&lt;/p&gt;
&lt;h3 id=&#34;51-用-byte-编码整副牌一副麻将只要几十个字节&#34;&gt;5.1 用 byte 编码整副牌：一副麻将只要几十个字节&lt;/h3&gt;
&lt;p&gt;贝密把每张麻将牌编码成一个 &lt;code&gt;byte&lt;/code&gt;：万/筒/条各占 0~107（每门 36 个编号 = 9 个面值 × 4 张），牌面值 = &lt;code&gt;(card % 36) / 4&lt;/code&gt;，花色 = &lt;code&gt;card / 36&lt;/code&gt;；风牌用负数。这样 108 张牌的牌墙就是一个 &lt;code&gt;byte[108]&lt;/code&gt;，序列化后不到 80 字节。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;举例&lt;/strong&gt;：编号 12 这张牌，&lt;code&gt;12 / 36 = 0&lt;/code&gt;（万子），&lt;code&gt;(12 % 36) / 4 = 3&lt;/code&gt;（第 4 个面值）——就是&amp;quot;四万&amp;quot;。一个除法一个取模就解出了花色和面值，不用查表、不用对象，广播出牌消息时网络上跑的就是 &lt;code&gt;&amp;quot;12,13&amp;quot;&lt;/code&gt; 这样的字符串。&lt;/p&gt;
&lt;h3 id=&#34;52-胡牌判断不用-3n2-递归用分堆--贪心摘顺子&#34;&gt;5.2 胡牌判断：不用 3N+2 递归，用&amp;quot;分堆 + 贪心摘顺子&amp;quot;&lt;/h3&gt;
&lt;p&gt;经典麻将胡牌算法是 3N+2 递归枚举。贝密的 &lt;code&gt;GameUtils.processMJCard&lt;/code&gt; 走了一条不同的路：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;把 14 张手牌按 &lt;code&gt;key = 面值 + 9 × 花色&lt;/code&gt; 放进字典计数，&lt;strong&gt;先查定缺&lt;/strong&gt;——缺门花色还在手里，直接不能胡（四川规则前置拦截）；&lt;/li&gt;
&lt;li&gt;按计数把牌分成三堆：&lt;code&gt;others&lt;/code&gt;（单张）、&lt;code&gt;pairs&lt;/code&gt;（对子）、&lt;code&gt;kezi&lt;/code&gt;（刻子）；&lt;/li&gt;
&lt;li&gt;对单张堆排序后&lt;strong&gt;贪心摘顺子&lt;/strong&gt;：同花色且 key 连续的 k/k+1/k+2 三张直接移除；&lt;/li&gt;
&lt;li&gt;终止条件：单张摘空且恰好剩 1 对将（或 7 对——七对牌型天然被&amp;quot;pairs 堆 = 14 张&amp;quot;覆盖）；&lt;/li&gt;
&lt;li&gt;对子多于 1 对时，把多余对子拆开当顺子候选再摘；全无刻子时枚举刻子拆开试。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;源码 &lt;code&gt;main()&lt;/code&gt; 里作者还放了性能测试：&lt;strong&gt;500 万次胡牌判断&lt;/strong&gt;直接计时。要说明的是，这是个简化实现——作者自己在注释里承认某些&amp;quot;三连对&amp;quot;式的特殊牌型没完整处理。对在线棋牌的实际负载来说，这种&amp;quot;足够快、覆盖主流牌型&amp;quot;的取舍是合理的。&lt;/p&gt;
&lt;h3 id=&#34;53-斗地主牌型识别频次直方图一把梭&#34;&gt;5.3 斗地主牌型识别：频次直方图一把梭&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ActionTaskUtils.identification(byte[])&lt;/code&gt; 的做法很干净：先统计同点数张数的分布（几个单张、几个对子、几个三张、几个炸弹），再用 &lt;code&gt;switch(种类数, 最大点数)&lt;/code&gt; 一把识别全部牌型——单张、对子、三带一/二、顺子、连对、飞机带翅、四带二、炸弹、王炸。比较两手牌大小的 &lt;code&gt;allow()&lt;/code&gt; 则只有三条规则：王炸最大、炸弹管一切非炸弹、同牌型比最大点数。AI 托管出牌也复用这套识别，找&amp;quot;能压住上家的最小牌&amp;quot;。&lt;/p&gt;
&lt;h3 id=&#34;54-自研极简状态机统一驱动两种游戏&#34;&gt;5.4 自研极简状态机统一驱动两种游戏&lt;/h3&gt;
&lt;p&gt;斗地主和麻将的流程差异巨大（抢地主 vs 定缺、出牌规则完全不同），但贝密用一个抽象统一了：&lt;code&gt;BeiMiStateMachine&lt;/code&gt; + 按事件名查 transition 表 + Action 链。新增一种游戏 = 写一组 Action + 一份状态配置，调度、计时、广播的基础设施全部复用。&lt;/p&gt;
&lt;h3 id=&#34;55-把缓存过期回调当游戏计时器用&#34;&gt;5.5 把缓存过期回调当游戏计时器用&lt;/h3&gt;
&lt;p&gt;这是我觉得最&amp;quot;巧&amp;quot;的设计。棋牌游戏里到处是倒计时：出牌 8 秒、杠碰胡决策 5 秒、抢地主超时自动放弃、房间超时补机器人。贝密没用 Quartz、没开线程池，而是用一个 &lt;code&gt;sharpExpiry&lt;/code&gt; 的 &lt;strong&gt;cache2k 缓存&lt;/strong&gt;当计时器：key 是 roomid，value 是任务对象，&lt;strong&gt;到期自动触发过期监听器执行任务&lt;/strong&gt;。玩家主动操作了？&lt;code&gt;remove(roomid)&lt;/code&gt; 就把倒计时取消了；要重置？put 一个新任务进去。零额外线程，语义严丝合缝。&lt;/p&gt;
&lt;h3 id=&#34;56-实时状态与持久化彻底解耦&#34;&gt;5.6 实时状态与持久化彻底解耦&lt;/h3&gt;
&lt;p&gt;牌局进行中的所有状态（房间、Board、玩家手牌、撮合队列）全在 &lt;strong&gt;Hazelcast&lt;/strong&gt; 分布式内存里，MySQL 只在结算时被&lt;strong&gt;异步&lt;/strong&gt;写入——通过 &lt;strong&gt;Disruptor&lt;/strong&gt; 的 RingBuffer 把变更事件丢给消费者，JPA 和 Elasticsearch 双写（ES 用于运营后台的战绩检索）。注释里还有一条重要的工程纪律：&amp;ldquo;只有一个地方对 GameRoom 二次写入，避免分布式锁&amp;rdquo;——用设计约束换掉了锁的开销。另外，房卡模式建房时的局数等规则赋值用了 &lt;strong&gt;Drools&lt;/strong&gt; 规则引擎，规则写在 &lt;code&gt;.drl&lt;/code&gt; 文件里，运营改规则不用改代码。&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;。理解了&amp;quot;客户端只是显示器和遥控器&amp;quot;，就看懂了所有联网游戏的骨架。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;棋牌游戏的复杂度不在算法，在工程&lt;/strong&gt;。胡牌判断几百行就写完了，真正难的是断线重连、超时托管、并发房间这些&amp;quot;无聊&amp;quot;的部分——它们决定了玩家半夜打牌掉线时骂不骂人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;做游戏的人必须会玩游戏&lt;/strong&gt;。第四章的四川麻将策略——分层记牌、由&amp;quot;打出&amp;quot;反推&amp;quot;留下&amp;quot;、用剩余进张 × 剩余巡数做期望决策——不只是给玩家的攻略，也是当初我们校验 AI 托管和出牌提示是否合理的标尺。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;当然也有粗糙之处，如实记录：README 宣称的德州扑克在 0.8.0 里只有枚举占位并未实现；胡牌算法是简化版；源码里散落的 &lt;code&gt;System.out.println&lt;/code&gt; 和作者自注的 bug 注释（比如多人同时可碰时先碰者胜出的竞态问题）都还在。但作为一个学习联网游戏开发的开源样本，它把一个房卡棋牌系统该有的零件——长连接、房间状态机、计时器、托管、异步落盘——都真实地摆在了那里，这比完美更有价值。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
