本章深入探讨了概率的基本概念,涵盖三种定义:古典定义适用于结果等可能且有限的情况;频率定义用于可重复实验,通过大量实验的频率逼近概率;主观定义基于已有信息和个人判断,适用于一次性事件。读者将学习到概率的三个公理:非负性、归一性和可加性,以及如何区分概率与赔率。此外,本章还介绍了加法原理和乘法原理,包括互斥事件、独立事件和条件概率的处理方法。读者将掌握四种计数法则:乘法计数法则、阶乘、排列和组合,并了解如何根据问题情境选择合适的计数方法。通过蒙特卡洛模拟的实际案例,读者将学会如何用代码验证概率直觉,并理解概率在机器学习中的应用,如朴素贝叶斯分类器、逻辑回归、交叉熵损失等。学完本章后,读者能够准确理解和应用不同场景下的概率定义,掌握概率计算的基本原理,并能够运用编程工具进行概率模拟和分析。
概率的基本概念
本章问题: 天气预报说"明天下雨概率 70%", 是什么意思? 是说 100 天里会下 70 天吗? 是说这朵云 70% 会下雨? 还是说你带伞出门被淋的概率是 70%? 概率有 3 种理解方式, 各有适用场景。
1. 概率的 3 种定义
1.1 古典定义 (Classical)
适用于: 结果等可能且有限 (如掷骰子、抽扑克)。
例: 掷一个公平骰子, 出现偶数的概率 = 3/6 = 0.5。
1.2 频率定义 (Frequentist)
适用于: 实验可重复, 用大量实验的频率逼近概率。
例: 抛 100 万次硬币, 正面出现次数 ≈ 50 万, 频率 ≈ 0.5。
1.3 主观定义 (Subjective / Bayesian)
适用于: 一次性事件 (如"明天下雨"、"这家公司会成功")。
基于已有信息 + 个人判断给出概率。贝叶斯学派的核心。
| 定义 | 哲学 | 适用 |
|---|---|---|
| 古典 | 客观、确定 | 离散等可能事件 |
| 频率 | 客观、长期 | 可重复实验 |
| 主观 | 主观、个人 | 一次性事件 |
2. 概率的 3 个公理 (Kolmogorov)
任何合理的概率都必须满足:
- 非负性: P(A) ≥ 0
- 归一性: P(整个样本空间) = 1
- 可加性: 互斥事件 P(A ∪ B) = P(A) + P(B)
# 验证: 抛硬币 1000 次
import numpy as np
np.random.seed(42)
flips = np.random.choice(["H", "T"], 1000)
p_head = (flips == "H").mean()
print(f"1000 次抛硬币: 正面频率 = {p_head:.3f} (理论 0.500)")
# 10000 次: 更接近 0.5
flips_10k = np.random.choice(["H", "T"], 10000)
print(f"10000 次: 正面频率 = {(flips_10k == 'H').mean():.4f}")
3. 概率与赔率 (Odds)
概率 和 赔率 是两套语言, 经常被搞混:
| 概率 | 赔率 ("对 A") |
|---|---|
| 0.5 | 1:1 |
| 0.75 | 3:1 |
| 0.90 | 9:1 |
| 0.99 | 99:1 |
💡 ML 中的赔率: 逻辑回归输出的是 log-odds (对数几率), 不是概率。
predict_proba内部把 log-odds 转换为概率。coef_直接对应"特征每变 1 单位, log-odds 变多少"。
4. 加法原理 (Addition Rule)
互斥事件 (Mutually Exclusive)
事件 A 和 B 不可能同时发生 (如掷骰子 1 和 6):
一般情况 (Inclusion-Exclusion)
⚠️ 常见错误: 不减交集就加 — 会重复计算"既属于 A 又属于 B"的事件。
互补事件 (Complement)
技巧: 算"至少一个"的概率, 通常用补集"一个都没有"更简单。
# 例: 10 个灯泡, 3 个坏的, 抽 2 个 (不放回), 至少 1 个坏的概率
from math import comb
n_total = comb(10, 2) # 总抽法 C(10,2) = 45
n_no_bad = comb(7, 2) # 都没坏 C(7,2) = 21
p_at_least_one_bad = 1 - n_no_bad / n_total
print(f"P(至少 1 坏) = 1 - 21/45 = {p_at_least_one_bad:.3f}")
5. 乘法原理 (Multiplication Rule)
独立事件 (Independent)
事件 A 和 B 互不影响 (如两次掷骰子):
一般情况 (Dependent)
P(B|A) 是"在 A 发生的条件下 B 发生的概率" (条件概率, 下章讲)。
# 例: 抽 5 张扑克, 都是红桃的概率 (不放回)
p_heart = 13/52
# 第 1 张: 13/52, 第 2 张: 12/51, ...
p_all_hearts = 1
for i in range(5):
p_all_hearts *= (13 - i) / (52 - i)
print(f"P(5 张都红桃) = {p_all_hearts:.6f}") # ≈ 0.0005
6. 计数法则:从"原理"到"算概率"
加法/乘法是"原则", 要落地算具体数字, 还需要怎么数。4 个计数法则:
6.1 乘法计数法则 (基础)
n 步骤, 每步 k_i 种选择 → 总数 = k_1 × k_2 × ... × k_n
6.2 阶乘 (Factorial)
n 个不同元素的排列数 = n!
from math import factorial
# 5! = 120
print(factorial(5))
6.3 排列 (Permutation)
n 个里选 r 个有序排列:
from math import perm
# 5 个里选 3 个排列: P(5,3) = 60
print(perm(5, 3))
6.4 组合 (Combination)
n 个里选 r 个无序:
from math import comb
# 5 个里选 3 个组合: C(5,3) = 10
print(comb(5, 3))
💡 怎么选?
- 题目说"中奖号码" → 排列 (顺序重要)
- 题目说"选 3 个人" → 组合 (顺序无关)
- 题目说"密码" → 排列
- 题目说"手牌" → 组合
7. Python 实战:蒙特卡洛模拟
概率难理解时, 写代码模拟 比公式更直观。
例: 三门问题 (Monty Hall) — 直觉与概率冲突
3 扇门, 1 扇后面有车, 2 扇后面是羊。你选 1 扇, 主持人 (知道答案) 打开 1 扇剩下的羊门。问你换还是不换?
直觉: 剩 2 扇, 各 1/2, 换不换一样。 事实: 换门获胜概率 2/3, 不换 1/3。
import numpy as np
def monty_hall(n_trials=100_000, switch=True):
"""模拟 Monty Hall 游戏"""
wins = 0
for _ in range(n_trials):
# 随机放车
car = np.random.randint(0, 3) # 0, 1, 2
# 你随机选
choice = np.random.randint(0, 3)
# 主持人开 1 扇 (不是你选的, 且不是车)
available = [d for d in range(3) if d != choice and d != car]
host_opens = np.random.choice(available)
# 如果换, 你选剩下那扇
if switch:
choice = [d for d in range(3) if d not in (choice, host_opens)][0]
if choice == car:
wins += 1
return wins / n_trials
print(f"不换: 胜率 = {monty_hall(switch=False):.4f} (理论 1/3)")
print(f"换: 胜率 = {monty_hall(switch=True):.4f} (理论 2/3)")
不换: 胜率 = 0.3335 (理论 1/3 = 0.3333)
换: 胜率 = 0.6668 (理论 2/3 = 0.6667)
🎯 为什么? 你最初选的 1/3 概率不变, 主持人给的信息把剩下 2 扇的"2/3 概率"集中到了 1 扇上。直觉的 1/2 错在忽略了主持人的"信息"。
8. 概率在 ML 中的应用
| ML 概念 | 概率论对应 |
|---|---|
| 朴素贝叶斯分类器 | P(类别 | 特征) ∝ P(特征 | 类别) × P(类别) |
| 逻辑回归输出 | P(y=1 | x), 用 sigmoid 把 log-odds 转概率 |
| 交叉熵损失 | -log P(真实类别), 来自最大似然估计 |
| Dropout | 随机丢弃神经元 = 给输出加噪声, 模拟"概率分布" |
| 集成学习 (Bagging) | 多个模型投票, 多数票 ≈ 概率 |
| VAE / Diffusion | 显式建模 P(x) 或 P(x|y) 的分布 |
9. 小结
| 你学到了 | 关键点 |
|---|---|
| 概率 3 定义 | 古典/频率/主观, 不同场景 |
| 3 公理 | 非负/归一/可加 |
| 加法原理 | 互斥直接加, 一般减交集, "至少一个"用补集 |
| 乘法原理 | 独立直接乘, 一般乘条件概率 |
| 计数 4 法则 | 基础/阶乘/排列/组合, 顺序是判断标准 |
| 蒙特卡洛 | 写代码模拟, 验证直觉 |
10. 习题
-
一副 52 张扑克 (无大小王), 抽 1 张:
- P(红桃) = ?
- P(人头牌 J/Q/K) = ?
- P(人头牌 ∪ 红桃) = ? (用加法原理)
- P(人头牌 | 红桃) = ? (条件概率, 下一章)
-
写蒙特卡洛模拟: 抛 3 个公平骰子, 点数之和 = 10 的概率 (理论 = 27/216 = 0.125)。用 10 万次模拟验证。
👉 查看参考答案
-
答案:
- P(红桃) = 13/52 = 0.25
- P(人头牌) = 12/52 = 3/13
- P(人头牌 ∪ 红桃) = 12/52 + 13/52 - 3/52 = 22/52 = 11/26 (有 3 张红桃人头牌, 减一次)
- P(人头牌 | 红桃) = 3/13 (见下章)
-
提示:
sums = np.random.randint(1, 7, (100_000, 3)).sum(axis=1); p = (sums == 10).mean()应得 ≈ 0.125。
11. 下一章
- 条件概率与贝叶斯定理: ML 最重要的概率公式
- 离散概率分布: 二项分布、泊松分布
📚 本章来源: 改编自 Triola《基础统计学》第 14 版 第 4 章 4-1、4-2、4-4 节, 加入 Python 蒙特卡洛实战。
章末小测验
检验你对《概率的基本概念》的掌握程度。
关于概率的古典定义,以下哪些说法是正确的?
关于概率的频率定义,以下哪些说法是正确的?
关于概率的3个公理,以下哪些说法是正确的?
关于加法原理,以下哪些说法是正确的?
关于计数法则,以下哪些说法是正确的?