第三十四 概率论(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(A | B_i)$ |
| $P(B_i | A)$ |
贝叶斯公式的直觉理解: 先验信念 + 新证据 → 更新后的信念。这是机器学习中贝叶斯推断的基础。
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)$ |
概率论是理解不确定性的数学工具。从日常的天气预报到机器学习的模型评估,概率论的思想无处不在。
练习建议:
- 用贝叶斯公式解决实际问题(如垃圾邮件分类)
- 模拟大数定律和中心极限定理
- 用蒙特卡洛方法估计概率