Skip to content

概率概念

概率理论形式化了不确定性,并提供了在其中进行推理的规则。本文件涵盖样本空间、事件、概率公理、条件概率、独立性、贝叶斯定理以及频率论与贝叶斯解释——这是机器学习中每个生成模型和判别模型背后的数学框架。

  • 概率为事件分配一个介于0和1之间的数字,衡量其发生的可能性。

  • 概率为0表示不可能,1表示确定,0.5表示抛硬币。

  • 主要有两种解释。频率论观点认为概率是长期相对频率:抛一枚公平硬币10,000次,正面出现的比例大约为50%。

  • 贝叶斯观点认为概率是信念程度:你可能会说明天下雨的概率是70%,尽管明天只发生一次。

  • 两种解释使用相同的数学规则。区别在于哲学层面,但在机器学习中很重要。频率论方法给出点估计。贝叶斯方法给出参数上的完整分布。

  • 样本空间 \(S\) 是一次实验所有可能结果的集合。抛硬币:\(S = \{H, T\}\)。掷骰子:\(S = \{1, 2, 3, 4, 5, 6\}\)

  • 事件是样本空间的任何子集。“掷出偶数”是事件 \(A = \{2, 4, 6\}\),它是 \(S\) 的子集。

  • 当所有结果等可能时,事件的概率就简单地是计数(来自文件01):

\[P(A) = \frac{|A|}{|S|} = \frac{\text{有利结果数}}{\text{总结果数}}\]
  • 对于偶数示例:\(P(\text{偶数}) = \frac{3}{6} = 0.5\)

维恩图显示了样本空间 S 内的事件 A 和 B,以及交集和补集

  • 事件 \(A\)补集,写作 \(A'\)\(A^c\),是 \(S\) 中所有不在 \(A\) 中的元素。由于每个结果要么在 \(A\) 中要么不在:
\[P(A') = 1 - P(A)\]
  • 补集往往是更简单的路径。与其统计5次抛硬币中至少得到一个正面的所有方式,不如统计没有得到正面的唯一方式然后相减:\(P(\text{至少一个正面}) = 1 - P(\text{全是反面}) = 1 - (0.5)^5 = 0.969\)

  • 如果两个事件不能同时发生,则它们互斥(不相交):\(A \cap B = \emptyset\)。掷一次骰子,掷出2和掷出5是互斥的。

  • 互斥事件的加法规则很简单:

\[P(A \cup B) = P(A) + P(B) \quad \text{(如果 } A \cap B = \emptyset\text{)}\]
  • 当事件可能重叠时,你需要一般加法规则以避免重复计算交集:
\[P(A \cup B) = P(A) + P(B) - P(A \cap B)\]
  • 这对应于计数中的容斥原理。上面的维恩图解释了原因:紫色区域(交集)在 \(P(A)\) 中被计一次,又在 \(P(B)\) 中被计一次,所以我们需要减去一次。

  • 联合概率 \(P(A \cap B)\)\(A\)\(B\) 都发生的概率。在一副扑克牌中,\(P(\text{红色} \cap \text{K}) = \frac{2}{52}\),因为有两张红色K。

  • 边缘概率是单个事件发生的概率,不考虑其他事件。\(P(\text{红色}) = \frac{26}{52} = 0.5\) 就是一个边缘概率。如果你有两个变量的联合分布,边缘概率通过对另一个变量求和(或积分)得到。

  • 条件概率回答:给定 \(B\) 已经发生,\(A\) 的概率是多少?我们将样本空间从 \(S\) 缩小到 \(B\),并问 \(B\) 中有多少比例也属于 \(A\)

\[P(A | B) = \frac{P(A \cap B)}{P(B)}, \quad P(B) > 0\]

条件概率:将样本空间从 S 缩小到 B

  • 示例:你抽一张牌,有人告诉你它是红色。它是K的概率是多少?有26张红色牌,其中2张是K,所以 \(P(\text{K} | \text{红色}) = \frac{2}{26} = \frac{1}{13}\)。使用公式:\(P(\text{K} \cap \text{红色}) / P(\text{红色}) = \frac{2/52}{26/52} = \frac{1}{13}\)

  • 如果知道一个事件发生不会告诉你任何关于另一个事件的信息,则两个事件独立。形式化:

\[P(A \cap B) = P(A) \cdot P(B)\]
  • 等价地,\(P(A | B) = P(A)\)。抛两枚独立的硬币是独立事件。无放回地抽两张牌不是独立的(第一次抽取改变了剩余牌)。

  • 独立性是一个巨大的简化器。对于独立事件,联合概率可以分解为乘积,这使得计算变得可行。许多机器学习模型(例如朴素贝叶斯)正是基于这种简化而假设特征之间相互独立。

  • 任意两个事件的乘法规则重新排列条件概率公式:

\[P(A \cap B) = P(A | B) \cdot P(B) = P(B | A) \cdot P(A)\]
  • 对于独立事件,由于条件概率等于边缘概率,这简化为 \(P(A \cap B) = P(A) \cdot P(B)\)

  • 贝叶斯定理是概率中最重要的结果之一,也是贝叶斯机器学习的基石。它允许你反转条件概率的方向:

\[P(A | B) = \frac{P(B | A) \cdot P(A)}{P(B)}\]
  • 该定理直接来自于将 \(P(A \cap B)\) 写成两种形式:\(P(B|A) \cdot P(A) = P(A|B) \cdot P(B)\),然后解出 \(P(A|B)\)

贝叶斯定理的组成部分:后验、似然、先验和证据

  • 每个组成部分都有名称:

    • 先验 \(P(A)\):你在看到证据之前的初始信念
    • 似然 \(P(B|A)\):假设 \(A\) 为真,证据出现的概率
    • 证据 \(P(B)\):看到证据的总概率,起到归一化作用
    • 后验 \(P(A|B)\):看到证据之后更新的信念
  • 让我们通过经典的医学诊断示例来理解。假设一种疾病影响1%的人口。一种检测该疾病的测试准确率为95%:它正确识别95%的患病者(灵敏度),并正确识别90%的健康者(特异度)。

  • 你检测为阳性。你实际患病的概率是多少?

  • \(D\) = 患病,\(+\) = 检测阳性。

    • 先验:\(P(D) = 0.01\)
    • 似然:\(P(+ | D) = 0.95\)
    • 假阳性率:\(P(+ | D') = 0.10\)
  • 我们需要 \(P(+)\)。根据全概率公式:

\[P(+) = P(+ | D) \cdot P(D) + P(+ | D') \cdot P(D')$$ $$= 0.95 \times 0.01 + 0.10 \times 0.99 = 0.0095 + 0.099 = 0.1085\]
  • 现在应用贝叶斯定理:
\[P(D | +) = \frac{P(+ | D) \cdot P(D)}{P(+)} = \frac{0.95 \times 0.01}{0.1085} \approx 0.088\]
  • 尽管测试“准确率95%”,但阳性结果仅给你大约8.8%的患病概率。先验非常重要。由于疾病罕见,大多数阳性结果都是假阳性。这对于机器学习中的任何分类问题都是一个关键见解:当类别不平衡时,仅凭准确率会产生误导。

  • 全概率公式将样本空间划分为互斥且完备的事件 \(B_1, B_2, \ldots, B_n\),并将任意事件 \(A\) 表示为:

\[P(A) = \sum_{i=1}^{n} P(A | B_i) \cdot P(B_i)\]
  • 这正是我们在医学示例中用来计算 \(P(+)\) 的方法:我们将人群划分为“患病”和“未患病”。

  • 概率的链式法则将乘法规则推广到任意多个事件:

\[P(A_1 \cap A_2 \cap \cdots \cap A_n) = P(A_1) \cdot P(A_2 | A_1) \cdot P(A_3 | A_1 \cap A_2) \cdots P(A_n | A_1 \cap \cdots \cap A_{n-1})\]
  • 每个因子都基于之前的所有事件。这是自回归语言模型的支柱:一个句子的概率是每个单词在给定前面所有单词条件下的概率的乘积。

  • 条件独立性意味着两个事件在给定第三个事件时是独立的。若 \(A\)\(B\) 在给定 \(C\) 时条件独立,则:

\[P(A \cap B | C) = P(A | C) \cdot P(B | C)\]
  • 事件可能边缘相关但条件独立,或者相反。例如,两个学生的考试成绩可能相关(都依赖于考试难度),但给定考试难度后,他们的成绩是独立的。

  • 条件独立性是图模型(如贝叶斯网络)背后的关键假设。它允许你将复杂的联合分布分解为可管理的部分,使推理计算上可行。

编程任务(使用 CoLab 或 notebook)

  1. 模拟医学诊断问题。生成一个10万人的群体,应用疾病患病率和测试准确率,并验证贝叶斯定理给出的后验概率是正确的。

    import jax
    import jax.numpy as jnp
    
    key = jax.random.PRNGKey(42)
    n = 100_000
    
    # 生成人群
    k1, k2 = jax.random.split(key)
    has_disease = jax.random.bernoulli(k1, p=0.01, shape=(n,))
    
    # 生成测试结果
    k3, k4 = jax.random.split(k2)
    # 灵敏度:P(+|D) = 0.95,特异度:P(-|D') = 0.90
    test_positive = jnp.where(
        has_disease,
        jax.random.bernoulli(k3, p=0.95, shape=(n,)),
        jax.random.bernoulli(k4, p=0.10, shape=(n,))
    )
    
    # 在检测为阳性的人中,实际患病的比例是多少?
    positives = test_positive.astype(bool)
    true_positives = (has_disease & positives).sum()
    total_positives = positives.sum()
    
    print(f"总阳性检测数:{total_positives}")
    print(f"真阳性数:{true_positives}")
    print(f"P(患病 | 阳性) = {true_positives / total_positives:.4f}")
    print(f"贝叶斯公式计算结果:         {0.95 * 0.01 / 0.1085:.4f}")
    

  2. 通过模拟验证加法规则。生成具有已知概率和重叠的随机事件 A 和 B,然后验证 \(P(A \cup B) = P(A) + P(B) - P(A \cap B)\)

    import jax
    import jax.numpy as jnp
    
    key = jax.random.PRNGKey(0)
    n = 200_000
    k1, k2 = jax.random.split(key)
    
    # 事件:A = 数值 < 0.4,B = 数值 < 0.6(重叠部分 < 0.4)
    vals_a = jax.random.uniform(k1, shape=(n,))
    vals_b = jax.random.uniform(k2, shape=(n,))
    
    A = vals_a < 0.4
    B = vals_b < 0.6
    
    p_a = A.mean()
    p_b = B.mean()
    p_a_and_b = (A & B).mean()
    p_a_or_b = (A | B).mean()
    
    print(f"P(A) = {p_a:.4f}")
    print(f"P(B) = {p_b:.4f}")
    print(f"P(A ∩ B) = {p_a_and_b:.4f}")
    print(f"模拟的 P(A ∪ B) = {p_a_or_b:.4f}")
    print(f"P(A) + P(B) - P(A∩B) = {p_a + p_b - p_a_and_b:.4f}")
    

  3. 演示条件概率随证据变化。模拟掷两个骰子,计算 \(P(\text{和为} 7)\),然后计算 \(P(\text{和为} 7 | \text{第一个骰子}=3)\)

    import jax
    import jax.numpy as jnp
    
    key = jax.random.PRNGKey(1)
    n = 500_000
    k1, k2 = jax.random.split(key)
    
    d1 = jax.random.randint(k1, shape=(n,), minval=1, maxval=7)
    d2 = jax.random.randint(k2, shape=(n,), minval=1, maxval=7)
    total = d1 + d2
    
    # 无条件
    p_sum7 = (total == 7).mean()
    print(f"P(和=7) = {p_sum7:.4f}(精确值:{6/36:.4f})")
    
    # 在第一个骰子=3的条件下
    mask = d1 == 3
    p_sum7_given_d1_3 = (total[mask] == 7).mean()
    print(f"P(和=7 | d1=3) = {p_sum7_given_d1_3:.4f}(精确值:{1/6:.4f})")
    

  4. 将贝叶斯定理实现为一个函数,并用它来迭代更新信念。从一个关于硬币偏倚的均匀先验开始,在观察到每次抛掷后更新。

    import jax.numpy as jnp
    import matplotlib.pyplot as plt
    
    def bayes_update(prior, likelihood):
        """先验乘以似然并归一化。"""
        posterior = prior * likelihood
        return posterior / posterior.sum()
    
    # 离散化可能的偏倚值
    theta = jnp.linspace(0, 1, 200)
    prior = jnp.ones_like(theta)  # 均匀先验
    prior = prior / prior.sum()
    
    # 观测到的抛掷结果:1=正面,0=反面
    flips = [1, 1, 0, 1, 1, 1, 0, 1, 0, 1]
    
    plt.figure(figsize=(10, 5))
    plt.plot(theta, prior, "--", color="#999", label="先验")
    
    for i, flip in enumerate(flips):
        likelihood = theta if flip == 1 else (1 - theta)
        prior = bayes_update(prior, likelihood)
        if i in [0, 2, 4, 9]:
            plt.plot(theta, prior, label=f"{i+1}次抛掷后", linewidth=2)
    
    plt.xlabel("硬币偏倚 θ")
    plt.ylabel("信念(归一化)")
    plt.title("贝叶斯更新:关于硬币偏倚的信念")
    plt.legend()
    plt.grid(alpha=0.3)
    plt.show()