Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第三十四 概率论(Probability)

概率论是研究随机现象规律性的数学分支。在数据科学和机器学习的背景下,概率论为理解数据行为、指导模型选择和评估结果提供了数学基础。它将杂乱、嘈杂的数据集转化为可操作的情报。


一、基本概念

1.1 随机事件

随机试验:结果不确定,但所有可能结果已知。

样本空间 $\Omega$:所有可能结果的集合。

随机事件:样本空间的子集。

事件类型定义
必然事件一定会发生,$\Omega$
不可能事件一定不发生,$\emptyset$
互斥事件不能同时发生,$A \cap B = \emptyset$
对立事件$A$ 不发生即 $B$ 发生,$B = \bar{A}$

1.2 概率的基本性质

  • $0 \le P(A) \le 1$
  • $P(\Omega) = 1$
  • $P(\emptyset) = 0$
  • $P(\bar{A}) = 1 - P(A)$
  • 若 $A \subset B$,则 $P(A) \le P(B)$

二、排列与组合

2.1 排列

从 $n$ 个不同元素中取 $m$ 个,按顺序排列:

$$A(n,m) = P(n,m) = \frac{n!}{(n-m)!}$$

2.2 组合

从 $n$ 个不同元素中取 $m$ 个,不区分顺序:

$$C(n,m) = \binom{n}{m} = \frac{n!}{m!(n-m)!}$$

组合的性质:

  • 对称性:$C(n,m) = C(n,n-m)$
  • 递推关系:$C(n,m) = C(n-1,m-1) + C(n-1,m)$
  • 求和公式:$\sum_{k=0}^{n} C(n,k) = 2^n$
fn factorial(n: u64) -> u64 {
    (1..=n).product()
}

fn permutation(n: u64, m: u64) -> u64 {
    factorial(n) / factorial(n - m)
}

fn combination(n: u64, m: u64) -> u64 {
    if m > n { return 0; }
    if m > n - m { return combination(n, n - m); }
    let mut result = 1u64;
    for i in 0..m {
        result = result * (n - i) / (i + 1);
    }
    result
}

fn main() {
    println!("P(5,3) = {}", permutation(5, 3));  // 60
    println!("C(5,3) = {}", combination(5, 3));  // 10
    println!("C(52,3) = {}", combination(52, 3)); // 22100
}

三、条件概率与独立性

3.1 条件概率

在事件 $B$ 已经发生的条件下,事件 $A$ 发生的概率:

$$P(A|B) = \frac{P(A \cap B)}{P(B)}$$

3.2 乘法公式

$$P(A \cap B) = P(A) \cdot P(B|A) = P(B) \cdot P(A|B)$$

3.3 独立性

若 $A$ 与 $B$ 相互独立,则:

$$P(A \cap B) = P(A) \cdot P(B)$$

$$P(A|B) = P(A)$$

注意: 独立与互斥是不同的概念。互斥事件通常不独立(除非其中一个概率为 0)。

fn main() {
    // 甲击中概率 0.8,乙击中概率 0.7,目标被击中的概率?
    let p_a = 0.8;
    let p_b = 0.7;

    // P(击中) = P(A) + P(B) - P(A∩B) = 0.8 + 0.7 - 0.8*0.7
    let p_hit = p_a + p_b - p_a * p_b;
    println!("目标被击中的概率: {:.2}", p_hit);  // 0.94
}

四、全概率公式与贝叶斯公式

4.1 全概率公式

若 $B_1, B_2, \ldots, B_n$ 构成样本空间的一个划分(两两互斥且并集为 $\Omega$),则:

$$P(A) = \sum_{i=1}^{n} P(A|B_i) \cdot P(B_i)$$

4.2 贝叶斯公式

$$P(B_i|A) = \frac{P(A|B_i) \cdot P(B_i)}{P(A)} = \frac{P(A|B_i) \cdot P(B_i)}{\sum_{j=1}^{n} P(A|B_j) \cdot P(B_j)}$$

概念含义
$P(B_i)$先验概率(在看到证据之前)
$P(AB_i)$
$P(B_iA)$

贝叶斯公式的直觉理解: 先验信念 + 新证据 → 更新后的信念。这是机器学习中贝叶斯推断的基础。

fn main() {
    // 医学检测问题
    // 某疾病发病率 1%,检测准确率 99%(真阳性率 99%,假阳性率 1%)
    // 问:检测为阳性,实际患病的概率是多少?

    let p_disease = 0.01;       // P(患病)
    let p_no_disease = 0.99;    // P(不患病)
    let p_positive_given_disease = 0.99;    // P(阳性|患病)
    let p_positive_given_no = 0.01;         // P(阳性|不患病)

    // 全概率公式:P(阳性)
    let p_positive = p_positive_given_disease * p_disease
                  + p_positive_given_no * p_no_disease;

    // 贝叶斯公式:P(患病|阳性)
    let p_disease_given_positive = p_positive_given_disease * p_disease / p_positive;

    println!("检测阳性时实际患病概率: {:.4}", p_disease_given_positive);
    // 0.5025 — 即使检测准确率高达 99%,阳性结果也只有约 50% 概率是真的!
}

五、随机变量

5.1 离散型随机变量

取值为有限个或可列个的随机变量。用分布律描述:

$$P(X = x_k) = p_k \quad k = 1, 2, 3, \ldots$$

满足:$p_k \ge 0$,$\sum p_k = 1$。

5.2 连续型随机变量

取值充满某个区间的随机变量。用概率密度函数 $f(x)$ 描述:

$$P(a \le X \le b) = \int_a^b f(x) dx$$

满足:$f(x) \ge 0$,$\int_{-\infty}^{+\infty} f(x) dx = 1$。


六、期望与方差

6.1 期望(数学期望)

期望是随机变量的“平均值“。

离散型:

$$E[X] = \sum_{k} x_k \cdot p_k$$

连续型:

$$E[X] = \int_{-\infty}^{+\infty} x \cdot f(x) dx$$

期望的性质:

  • $E[aX + b] = aE[X] + b$
  • $E[X + Y] = E[X] + E[Y]$
  • 若 $X, Y$ 独立:$E[XY] = E[X] \cdot E[Y]$

6.2 方差

方差衡量数据的离散程度。

$$\text{Var}(X) = E[(X - \mu)^2] = E[X^2] - (E[X])^2$$

其中 $\mu = E[X]$。

标准差: $\sigma = \sqrt{\text{Var}(X)}$

方差的性质:

  • $\text{Var}(aX + b) = a^2 \text{Var}(X)$
  • 若 $X, Y$ 独立:$\text{Var}(X + Y) = \text{Var}(X) + \text{Var}(Y)$
fn mean(data: &[f64]) -> f64 {
    data.iter().sum::<f64>() / data.len() as f64
}

fn variance(data: &[f64]) -> f64 {
    let m = mean(data);
    data.iter().map(|x| (x - m).powi(2)).sum::<f64>() / data.len() as f64
}

fn std_dev(data: &[f64]) -> f64 {
    variance(data).sqrt()
}

fn main() {
    let data = [6.0, 5.0, 4.0, 8.0, 12.0];
    println!("平均值: {}", mean(&data));       // 7.0
    println!("方差:   {}", variance(&data));    // 8.0
    println!("标准差: {}", std_dev(&data));       // 2.8284
}

七、常见离散分布

7.1 二项分布

$n$ 次独立试验中,每次成功概率为 $p$,恰好成功 $x$ 次的概率:

$$f(x) = \binom{n}{x} \cdot p^x \cdot (1-p)^{n-x}$$

期望: $E[X] = np$

方差: $\text{Var}(X) = np(1-p)$

fn binomial_pmf(x: u32, n: u32, p: f64) -> f64 {
    combination(n as u64, x as u64) as f64 * p.powi(x as i32) * (1.0 - p).powi(n as i32 - x as i32)
}

fn main() {
    // 三发导弹,命中率 70%
    let n = 3;
    let p = 0.7;

    println!("三发全中:     {:.4}", binomial_pmf(3, n, p));  // 0.343
    println!("命中两发:     {:.4}", binomial_pmf(2, n, p));  // 0.441
    println!("命中一发:     {:.4}", binomial_pmf(1, n, p));  // 0.189
    println!("全不命中:     {:.4}", binomial_pmf(0, n, p));  // 0.027
}

7.2 泊松分布

描述单位时间/空间内随机独立事件发生次数的概率分布:

$$f(x) = \frac{\lambda^x e^{-\lambda}}{x!}$$

期望 = 方差 = $\lambda$

适用场景: 电话呼叫次数、交通事故数、错别字数、服务器请求量等“稀有事件“。

fn poisson_pmf(x: u32, lambda: f64) -> f64 {
    lambda.powi(x as i32) * (-lambda).exp() / factorial(x as u64) as f64
}

fn main() {
    // 某网站平均每小时 5 次访问
    let lambda = 5.0;
    for x in 0..=10 {
        println!("P(X={}) = {:.6}", x, poisson_pmf(x, lambda));
    }
}

八、常见连续分布

8.1 正态分布(高斯分布)

概率密度函数:

$$f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \cdot e^{-\frac{(x-\mu)^2}{2\sigma^2}}$$

参数: $\mu$ 为均值,$\sigma$ 为标准差。

标准正态分布: $Z = \frac{X - \mu}{\sigma} \sim N(0, 1)$

正态分布的固定概率:

区间概率
$\mu \pm \sigma$≈ 68.27%
$\mu \pm 2\sigma$≈ 95.45%
$\mu \pm 3\sigma$≈ 99.73%
fn normal_pdf(x: f64, mu: f64, sigma: f64) -> f64 {
    let coeff = 1.0 / (sigma * (2.0 * std::f64::consts::PI).sqrt());
    coeff * (-(x - mu).powi(2) / (2.0 * sigma * sigma)).exp()
}

fn main() {
    // 标准正态分布在几个关键点的概率密度
    for &x in &[-3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0] {
        println!("f({:+.0}) = {:.6}", x, normal_pdf(x, 0.0, 1.0));
    }
    // f(0) = 0.398942(最大值)
}

8.2 均匀分布

$$f(x) = \frac{1}{b-a} \quad (a \le x \le b)$$

期望: $E[X] = \frac{a+b}{2}$

方差: $\text{Var}(X) = \frac{(b-a)^2}{12}$


九、大数定律与中心极限定理

9.1 大数定律

$$\lim_{n \to \infty} \frac{1}{n} \sum_{i=1}^{n} X_i = E[X]$$

直觉理解: 试验次数足够多时,频率趋近于概率。

9.2 切比雪夫不等式

$$P(|X - \mu| \ge k\sigma) \le \frac{1}{k^2}$$

无论随机变量服从什么分布,只要方差有限,数据偏离均值 $k$ 个标准差以上的概率不超过 $\frac{1}{k^2}$。

9.3 中心极限定理

无论 $X_1, X_2, \ldots, X_n$ 服从什么分布,只要它们独立同分布且期望方差有限,当 $n$ 足够大时:

$$\frac{\sum X_i - n\mu}{\sigma\sqrt{n}} \xrightarrow{d} N(0, 1)$$

直觉理解: 大量独立随机变量之和趋向于正态分布。这就是为什么正态分布在自然界中如此常见。


十、信息熵

信息熵描述了随机变量的不确定性:

$$H(X) = -\sum_{x} P(x) \cdot \log_2 P(x)$$

熵值含义
最大均匀分布(最不确定)
最小(为 0)确定性事件(完全确定)
fn entropy(probabilities: &[f64]) -> f64 {
    probabilities
        .iter()
        .filter(|&&p| p > 0.0)
        .map(|&p| -p * p.log2())
        .sum()
}

fn main() {
    // 公平硬币
    println!("公平硬币熵: {:.4}", entropy(&[0.5, 0.5]));  // 1.0

    // 不公平硬币
    println!("偏心硬币熵: {:.4}", entropy(&[0.9, 0.1]));  // 0.4690

    // 六面骰子
    println!("公平骰子熵: {:.4}", entropy(&[1.0/6.0; 6]));  // 2.5850
}

应用: 信息熵是决策树算法(ID3、C4.5)的核心指标,用于选择最优的分裂特征。


十一、假设检验

11.1 基本思想

  • 原假设 $H_0$:默认成立的假设(如“没有差异“)
  • 备择假设 $H_1$:与原假设对立的假设
  • P 值:在 $H_0$ 成立的条件下,观察到当前或更极端结果的概率
  • 显著性水平 $\alpha$:通常取 0.05
P 值结论
$P < 0.05$拒绝 $H_0$,差异显著
$P \ge 0.05$不能拒绝 $H_0$,差异不显著

11.2 Z 检验

$$z = \frac{\bar{x} - \mu}{\sigma / \sqrt{n}}$$

适用于大样本($n \ge 30$)且总体标准差 $\sigma$ 已知。

11.3 T 检验

$$t = \frac{\bar{x} - \mu}{s / \sqrt{n}}$$

适用于小样本($n < 30$)且总体标准差未知。

11.4 卡方检验

$$\chi^2 = \sum_{i=1}^{k} \frac{(O_i - E_i)^2}{E_i}$$

其中 $O_i$ 为观察频数,$E_i$ 为期望频数。用于检验分类变量之间是否独立。


十二、经典题目

题目1:生日悖论

一个班有 100 人,至少两人生日相同的概率是多少?

fn birthday_probability(n: u32) -> f64 {
    let mut p_no_match = 1.0;
    for i in 0..n {
        p_no_match *= (365.0 - i as f64) / 365.0;
    }
    1.0 - p_no_match
}

fn main() {
    for &n in &[23, 30, 50, 70, 100] {
        println!("{} 人中至少两人生日相同: {:.4}", n, birthday_probability(n));
    }
    // 23 人: 0.5073(超过 50%!)
    // 100 人: 0.9999997(几乎必然)
}

题目2:炸金花概率

52 张牌中抽 3 张,求同花顺和豹子的概率。

fn main() {
    let total = combination(52, 3) as f64;  // 22100

    // 同花顺:4种花色 × 12种序列(A23, 234, ..., QKA)
    let straight_flush = 4.0 * 12.0;
    println!("同花顺概率: {:.6} ({:.4}%)", straight_flush / total, straight_flush / total * 100.0);

    // 豹子:13种点数 × 4种花色取3种
    let three_of_kind = 13.0 * combination(4, 3) as f64;
    println!("豹子概率:   {:.6} ({:.4}%)", three_of_kind / total, three_of_kind / total * 100.0);
}

十三、总结

概念要点
排列$A(n,m) = n!/(n-m)!$
组合$C(n,m) = n!/[m!(n-m)!]$
条件概率$P(A
贝叶斯公式后验 = 似然 × 先验 / 证据
期望$E[X]$,随机变量的平均值
方差$\text{Var}(X)$,数据的离散程度
二项分布$n$ 次试验中成功 $x$ 次的概率
泊松分布稀有事件发生次数
正态分布钟形曲线,$\mu \pm 3\sigma$ 覆盖 99.73%
中心极限定理大量独立变量之和趋向正态分布
信息熵$H(X) = -\sum P(x)\log_2 P(x)$

概率论是理解不确定性的数学工具。从日常的天气预报到机器学习的模型评估,概率论的思想无处不在。

练习建议:

  1. 用贝叶斯公式解决实际问题(如垃圾邮件分类)
  2. 模拟大数定律和中心极限定理
  3. 用蒙特卡洛方法估计概率