查看全课大纲(第 10 / 82 节)
- 1.函数与数据泛化
- 2.向量:从几何直觉到高维空间
- 3.矩阵与张量
- 4.特征值与特征向量:矩阵变换的不动方向
- 5.凸函数:从向量求导的矩阵记号到好优化的函数形状
- 6.概率与统计:机器学习的数学基础
- 7.独立性与随机变量:贝叶斯公式与二项分布
- 8.期望、方差与协方差:随机变量的数字画像
- 9.联合概率:当一条轴不够用的时候
- 10.概率分布(一):从伯努利到伽马函数
- 11.概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
- 12.机器学习的模型:找输入与输出的关系
- 13.机器学习的应用
- 14.过拟合
- 15.机器学习的分类
- 16.有监督学习:从房价预测说起
- 17.损失函数
- 18.梯度下降(上):更新规则与学习速率
- 19.梯度下降(2)
- 20.牛顿方法
- 21.KNN简介
- 22.距离测算
- 23.朴素贝叶斯
- 24.朴素贝叶斯的实际应用
- 25.信息熵:决策树构建的度量基础
- 26.信息增益与决策树的构建
- 27.ID3算法
- 28.决策树节点的划分
- 29.CART树
- 30.Bagging
- 31.Boosting:自适应提升算法
- 32.Gradient Boosting
- 33.线性模型:回归与分类的同一副骨架
- 34.最小二乘:把最优参数直接解出来
- 35.最小二乘法的几何与概率视角
- 36.极大似然:给最小二乘一个概率出身
- 37.逻辑回归(1):把线性模型接到分类上
- 38.逻辑回归(2):损失函数与多分类
- 39.---- 手造数据: 5 个样本, 2 个特征; x2 几乎 = 2*x1 (偏差手工指定, 无随机) ----
- 40.讲师例: 向量 "23014" -- 三把范数尺子量同一个向量
- 41.优化方法(1):坐标下降与前向选择
- 42.优化方法(2):前向策略与最小角回归
- 43.拉格朗日乘子法(1):从无约束到等式约束
- 44.拉格朗日乘子法(2):等式约束下的平行条件与拉格朗日函数
- 45.拉格朗日乘子法(3):不等式约束与 KKT 条件
- 46.最大间隔:把分类问题变成优化问题
- 47.拉格朗日对偶问题:把 w 和 b 全部换成 α
- 48.支持向量:边界上的少数派
- 49.SVM 计算过程:一笔到底算完,再走进核方法
- 50.贝叶斯公式:概率即信念
- 51.隐含变量和概率模型:给看不见的原因建模
- 52.EM 算法:期望与最大化的迭代
- 53.琴生不等式:EM 的数学钥匙
- 54.三个硬币问题:EM 的复盘与衔接
- 55.高斯混合模型:用隐变量解释双峰数据
- 56.隐马尔可夫模型
- 57.隐马尔可夫模型(2):前向算法与动态混合模型
- 58.隐马尔可夫模型在 NLP 中的运用
- 59.EM 算法:把「为什么收敛」推到底
- 60.HMM 在 NLP 中的运用:从分词到机器翻译
- 61.HMM 参数估计:Baum-Welch 的三块拉格朗日
- 62.高维下的高斯模型
- 63.主题模型:从词袋到隐含主题
- 64.Dirichlet 分布(1)
- 65.Dirichlet 分布(2)
- 66.统计学习内容回顾
- 67.K-means 算法
- 68.PCA 降维
- 69.SVD 降维
- 70.从聚类到流形
- 71.局部线性嵌入
- 72.随机邻域嵌入:SNE 与 t-SNE
- 73.无参模型:让数据自己说话
- 74.高斯过程:函数空间里的正态分布
- 75.高斯过程(2):噪声、正则化与核的线性组合
- 76.神经网络简介:从感知器到自编码器
- 77.反向传播:把误差一层层传回去
- 78.卷积神经网络(CNN):让特征自己学出来
- 79.循环神经网络(RNN):给网络装上记忆
- 80.深度学习回顾:静态一类,动态一类
- 81.增强学习(1):蒙特卡洛、树搜索与 Q-learning
- 82.强化学习(2):从乌鸦吃核桃到井字棋的 value 回传
概率分布(一):从伯努利到伽马函数
约 21 分钟
小象实战讲义 · 机器学习算法精讲
本节我们将从离散概率迈向连续概率,系统学习机器学习中常用的几种核心概率分布。理解这些分布的特性、适用场景及其数学表达,是后续学习贝叶斯推断、主题模型、高斯过程等高级算法的基石。学完本节,你将能够清晰地区分伯努利、二项式、多项式分布,并理解伽马函数作为阶乘扩展的深刻含义。
💡 核心导读
- 连续与离散:理解概率密度函数(PDF)与离散概率质量函数的本质区别——前者用面积表示概率,后者用求和。
- 经典离散分布:掌握伯努利分布(单次试验)、二项式分布(n次独立伯努利试验的成功次数)与多项式分布(多类别试验的计数分布)的定义、公式与直观意义。
- 二项式系数与杨辉三角:直观理解二项式展开的系数规律,及其在概率计算中的应用。
- 伽马函数:认识伽马函数作为阶乘运算在连续实数域上的扩展,它是定义许多连续分布(如伽马分布、狄利克雷分布)的关键工具。
从离散到连续:概率密度函数
在之前的讨论中,我们主要处理像掷硬币(正面/反面)或掷骰子(1到6点)这样的离散随机变量。每个可能的结果都有一个明确的概率值,所有结果的概率之和为1。
然而,现实世界中有许多现象是连续的。例如,测量一个人的身高。身高值可以是150厘米、150.1厘米、150.15厘米……在任意两个实数之间都存在无限多个可能的值。我们无法为“身高恰好是170.000…厘米”这样一个点赋予一个非零的概率(否则无限个点概率之和将无穷大)。
为了解决这个问题,我们引入了概率密度函数。
概率密度函数 是一个非负函数 ,用于描述连续随机变量在不同取值附近的“可能性”密度。对于连续随机变量 落在区间 内的概率,由密度函数在该区间上的积分给出:
最关键的性质是,概率密度函数在整个实数域上的积分(即曲线下的总面积)必须等于1:
这对应于离散概率中所有可能结果的概率之和为1。
我们选择不同的概率密度函数来描述不同特性的不确定性。例如,人的身高通常用正态分布(高斯分布)来描述;而“百年一遇的洪水在十年内来几次”这类计数问题,则要用另外的分布来刻画(下一节展开)。每种分布都有其独特的形态,由少数几个参数(如均值、方差)控制,并决定了大部分概率质量集中在哪个区域——比如一个方差之内落了多少比例的值、两个方差之内又落了多少。
接下来,我们从最简单的离散分布开始,逐步构建更复杂的分布概念。
经典离散概率分布
伯努利分布:单次二元试验
伯努利分布 是最简单的概率分布,描述一次只有两种可能结果的试验,例如抛一次硬币(正面/反面)、一次射击(命中/脱靶)。顺带一提,Bernoulli 是瑞士一个极高产的数学家族——伯努利方程、伯努利分布出自家族中不同的成员,有空可以搜搜他们的维基百科页面,非常有意思。
我们通常将两种结果编码为:成功(Success)= 1,失败(Failure)= 0。设成功的概率为 (),则失败的概率为 。
伯努利分布的概率质量函数可以紧凑地写为:
- 当 (成功)时,。
- 当 (失败)时,。
该分布的期望(均值)为 ,方差为 。
import random
# 伯努利试验模拟
def bernoulli_trial(p):
"""以概率p返回1(成功),以概率1-p返回0(失败)。"""
return 1 if random.random() < p else 0
# 参数设置
p = 0.3 # 单次试验成功的概率
num_trials = 10000 # 模拟试验次数
# 模拟并统计
random.seed(42)
success_count = sum(bernoulli_trial(p) for _ in range(num_trials))
empirical_p = success_count / num_trials
print(f"理论成功概率 p = {p}")
print(f"模拟 {num_trials} 次试验,成功次数 = {success_count}")
print(f"经验成功概率 = {empirical_p:.4f}")
print(f"与理论概率的绝对误差 = {abs(empirical_p - p):.4f}")理论成功概率 p = 0.3
模拟 10000 次试验,成功次数 = 2964
经验成功概率 = 0.2964
与理论概率的绝对误差 = 0.0036二项式分布:n次独立伯努利试验的成功计数
二项式分布 描述的是进行 次独立的伯努利试验,每次成功概率为 ,总共获得 次成功的概率。例如:抛10次硬币,得到6次正面的概率;射击10次,命中8次的概率。
其概率质量函数为: 其中 是二项式系数,表示从 次试验中选择 次成功有多少种不同的方式。
讲师在课上放了一个”板钉”演示:小球从顶部落下,每撞一排钉子就以 与 的概率向左或向右分化,层层累积后底部的堆叠形状正是二项式分布的样子——概率在中间高、两头低,肉眼可见。
这里的系数 正是杨辉三角(帕斯卡三角)中的数字。杨辉三角的每一行对应 二项式展开的系数。
- 第0行:1 →
- 第1行:1, 1 →
- 第2行:1, 2, 1 →
- 第3行:1, 3, 3, 1 →
- …
这种几何关系可以通过面积(平方)和体积(立方)来直观理解: 的面积等于边长为 的正方形、边长为 的正方形以及两个 矩形的面积之和。
import math
def binomial_probability(n, k, p):
"""计算二项式分布概率 P(X = k) for n trials, success prob p."""
# 计算组合数 C(n, k) = n! / (k! * (n-k)!)
# 使用对数计算防止阶乘溢出
def log_comb(n, k):
# 利用 log(n!) = sum(log(i)) 以及 C(n,k) = n!/(k!(n-k)!)
# 计算 log(C(n,k))
if k < 0 or k > n:
return -float('inf') # 概率为0
# 使用更稳定的方法:log(C(n,k)) = log(n!) - log(k!) - log((n-k)!)
# 这里用求和近似,对于教学小规模数据直接计算
comb = math.comb(n, k) if hasattr(math, 'comb') else math.factorial(n) // (math.factorial(k) * math.factorial(n - k))
return math.log(comb) if comb > 0 else -float('inf')
log_coef = log_comb(n, k)
log_prob = log_coef + k * math.log(p) + (n - k) * math.log(1 - p)
return math.exp(log_prob)
# 示例:抛10次公平硬币,恰好得到6次正面的概率
n = 10
k = 6
p = 0.5
prob = binomial_probability(n, k, p)
coef = math.comb(n, k) if hasattr(math, 'comb') else math.factorial(n) // (math.factorial(k) * math.factorial(n - k))
print(f"进行 n={n} 次独立伯努利试验,每次成功概率 p={p}")
print(f"恰好得到 k={k} 次成功的概率为:{prob:.4f}")
print(f"二项式系数 C({n}, {k}) = {coef}")进行 n=10 次独立伯努利试验,每次成功概率 p=0.5
恰好得到 k=6 次成功的概率为:0.2051
二项式系数 C(10, 6) = 210多项式分布:多类别试验的计数
多项式分布 是二项式分布的推广,用于描述每次试验有 种可能结果(而不仅仅是两种)的情况。例如,掷骰子(6种结果)、对文档进行主题分类(K个主题)。
设单次试验中,结果 出现的概率为 ,满足 。现在进行 次独立试验,用 表示结果 出现的次数,则向量 服从多项式分布,其联合概率质量函数为: 其中 。
系数 是多项式系数,表示在 次试验中得到特定计数组合 的不同序列数。
伽马函数:阶乘的连续化扩展
在多项式分布的公式中,我们看到了阶乘。当我们需要处理非整数或者推广到更一般的分布时,阶乘运算需要被扩展到一个连续的定义上。这就是伽马函数的用武之地。
伽马函数 定义为:
伽马函数最关键的性质是它的递推关系: 并且有 。
如果 是正整数,那么: 因此,伽马函数是阶乘在正实数域上的推广。我们可以计算 、 等值,它们对应着“非整数”的阶乘。
从图像上看,如果我们把正整数点 画在坐标系中,伽马函数就是一条光滑穿过所有这些点的曲线。
import math
# 伽马函数在Python标准库中可用 math.gamma
# 这里我们演示其性质,并与阶乘对比
print("伽马函数与阶乘的关系验证:")
for n in range(1, 6):
factorial_n = math.factorial(n) # n!
gamma_n_plus_1 = math.gamma(n + 1) # Γ(n+1)
print(f" n = {n}: {n}! = {factorial_n}, Γ({n+1}) = {gamma_n_plus_1:.2f}, 是否相等?{abs(factorial_n - gamma_n_plus_1) < 1e-9}")
# 计算一个非整数的“阶乘”
z = 2.5
gamma_val = math.gamma(z + 1) # 这可以看作是“2.5!”
print(f"\n非整数示例:Γ({z}+1) = Γ({z+1:.1f}) ≈ {gamma_val:.4f} (可以理解为‘{z}!’的连续版本)")伽马函数与阶乘的关系验证:
n = 1: 1! = 1, Γ(2) = 1.00, 是否相等?True
n = 2: 2! = 2, Γ(3) = 2.00, 是否相等?True
n = 3: 3! = 6, Γ(4) = 6.00, 是否相等?True
n = 4: 4! = 24, Γ(5) = 24.00, 是否相等?True
n = 5: 5! = 120, Γ(6) = 120.00, 是否相等?True
非整数示例:Γ(2.5+1) = Γ(3.5) ≈ 3.3234 (可以理解为‘2.5!’的连续版本)利用伽马函数,多项式分布的概率质量函数可以写成更紧凑的形式(尽管在离散情况下看起来更复杂,但这种形式在连续推广和贝叶斯推理中非常有用):
伽马函数本身也是定义其他重要连续分布的基础——本节结尾讲师就用两个参数 、 带出了在正实数轴(0 到正无穷)上定义的伽马分布;第 15 章主题模型中的 Dirichlet 分布同样由伽马函数构建,它是多项式分布的”连续版搭档”。
📝 动手练一练
- 概念辨析:伯努利分布、二项式分布和多项式分布之间最本质的区别是什么?请各用一句话总结其描述的随机过程。
- 代码实践:修改上面的二项式概率计算代码,计算抛20次不均匀硬币(正面概率 )时,得到正面次数不超过15次(即 )的累计概率。提示:你需要对 从0到15的概率求和。
👉 点击查看参考答案
概念辨析:
- 伯努利分布:描述单次二元随机试验的结果(成功/失败)。
- 二项式分布:描述固定次数 n 的独立伯努利试验中,成功总次数的概率分布。
- 多项式分布:描述固定次数 n 的独立多类别试验中,各类别出现次数的联合概率分布。
代码实践:
import math def binomial_probability(n, k, p): """计算二项式分布概率 P(X = k)。""" # 使用 math.comb 计算组合数(Python 3.8+) if hasattr(math, 'comb'): coef = math.comb(n, k) else: coef = math.factorial(n) // (math.factorial(k) * math.factorial(n - k)) return coef * (p ** k) * ((1 - p) ** (n - k)) n = 20 p = 0.7 cumulative_prob = 0.0 for k in range(0, 16): # k = 0, 1, ..., 15 prob_k = binomial_probability(n, k, p) cumulative_prob += prob_k # 可选:打印每个k的概率 # print(f"P(X={k}) = {prob_k:.6f}") print(f"抛{n}次硬币(正面概率p={p}),正面次数不超过15次的累计概率为:{cumulative_prob:.6f}") # 验证:也可以用1减去反面次数少于5次的概率来算,但这里直接累加更清晰。运行后输出类似(具体数值可能因计算精度略有差异):
抛20次硬币(正面概率p=0.7),正面次数不超过15次的累计概率为:0.762492这意味着,在20次试验中,尽管单次成功概率高达0.7,但成功次数超过15次(即16次及以上)的概率仍有约23.75%。
本章小结
本节我们建立了从离散概率到连续概率的桥梁,并深入学习了三类基础的离散分布:
- 伯努利分布是基石,描述单次二元试验。
- 二项式分布在其基础上,通过计数n次独立试验的成功次数,并引入了二项式系数(杨辉三角)这一关键组合数学概念。
- 多项式分布进一步推广到多类别试验,是理解后续主题模型等算法的基础。
最后,我们认识了伽马函数 ,它巧妙地将阶乘运算 推广到了整个正实数域,为定义更复杂的连续分布(如伽马分布、贝塔分布)提供了数学工具。理解伽马函数是理解许多高级概率模型共轭先验的关键一步。
📋 行动清单
- 默写出伯努利、二项式、多项式分布的概率质量函数,并说明每个参数和变量的含义。
- 用 Python 标准库
math.gamma函数验证 是否等于 ,并尝试计算 的值。 - 构思一个现实场景(如调查问卷选项、产品缺陷分类),用多项式分布来描述其数据生成过程。
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第2章课件:机器学习的数学基础 II(概率)