查看全课大纲(第 11 / 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 回传
概率分布(二):贝塔、泊松、正态与两个贝叶斯故事
约 23 分钟
小象实战讲义 · 机器学习算法精讲
上一节收尾时留下了伽马函数,当时讲师就预告过它马上要派上用场。这一节把概率篇的”兵器谱”补齐:先看构建在伽马函数上、专门住在 0 到 1 之间的贝塔分布;再学给”百年一遇”这类稀有事件计数的泊松分布;然后是出镜率之王正态分布。最后,讲师用一场沙漠婚礼和一张电影票,把贝叶斯推理演成两出小剧——这也是概率篇的收官,下一章就要正式走进机器学习了。
💡 核心导读
- 贝塔分布:构建在伽马函数上、定义在 (0,1) 区间的分布;调一调 α、β,碗形、钟形、偏峰全都造得出来——0 到 1 之间的不确定性(包括”概率本身”)都归它管。
- 泊松分布:给稀有事件计数的离散分布,概率质量函数是 ;λ 就是事件的平均发生次数(均值),也是分布的中心。
- 正态分布:μ 管位置、σ² 管胖瘦;±2σ 装下 95%、±3σ 装下 99.7% 的概率质量;二项分布的极限和中心极限定理,都为它站台。
- 指数族:泊松、伯努利、二项、多项式、高斯……许多分布都能写成统一的指数形式,合成一个 family。
- 贝叶斯更新:先验乘上似然再归一化——一场沙漠婚礼(预报下雨 ≠ 真下雨)和一张电影票(证据能让信念瞬间反转)把它演活了。
贝塔分布:0 到 1 之间的形状库
常见的分布多是一副”中间多、两头少”的钟形面孔。可如果偏偏要”两头多、中间少”——像一只碗——该用什么函数去表达?上一节的伽马函数立刻给出答案:贝塔分布(Beta distribution)。它构建在伽马函数之上(这就是上一节学 Γ 的原因),定义域被约束在 0 和 1 之间:
分母里的 是贝塔函数,由伽马函数表出:。它的角色是归一化常数——保证整个密度在 (0,1) 上积分为 1。
贝塔分布最大的本事是形状多样:调一调 α 和 β,可以造出两头翘的碗形、漂亮的钟形(注意:这个钟形跟正态分布不一样,但同样”中间多两头少”)、一头小一头大的偏峰……”通过参数的稍稍调整,可以生成完全不同的分布”。为什么这很值钱?因为0 到 1 之间的不确定性——比如一个概率值本身取多大的可能——天然需要这样一个住在 (0,1) 上的分布来描述。四组参数放代码里,各点密度高低一眼见分晓:
import math
def beta_pdf(x, alpha, beta):
"""贝塔分布密度:x^(α-1)(1-x)^(β-1) / B(α,β),B 用伽马函数表出。"""
b = math.gamma(alpha) * math.gamma(beta) / math.gamma(alpha + beta)
return x ** (alpha - 1) * (1 - x) ** (beta - 1) / b
points = [0.1, 0.3, 0.5, 0.7, 0.9]
for alpha, beta, shape in [(0.5, 0.5, "碗形"), (2, 5, "峰偏左"), (5, 5, "钟形"), (5, 2, "峰偏右")]:
row = " ".join(f"f({x:.1f})={beta_pdf(x, alpha, beta):.3f}" for x in points)
print(f"α={alpha:g}, β={beta:g} — {shape}:{row}")α=0.5, β=0.5 — 碗形:f(0.1)=1.061 f(0.3)=0.695 f(0.5)=0.637 f(0.7)=0.695 f(0.9)=1.061
α=2, β=5 — 峰偏左:f(0.1)=1.968 f(0.3)=2.161 f(0.5)=0.938 f(0.7)=0.170 f(0.9)=0.003
α=5, β=5 — 钟形:f(0.1)=0.041 f(0.3)=1.225 f(0.5)=2.461 f(0.7)=1.225 f(0.9)=0.041
α=5, β=2 — 峰偏右:f(0.1)=0.003 f(0.3)=0.170 f(0.5)=0.938 f(0.7)=2.161 f(0.9)=1.968四行输出把”形状库”演了个遍:α=β=0.5 时两头 1.061、中间 0.637,是一只碗;α=2、β=5 时峰在左侧;α=β=5 时是端正的钟形,峰顶 2.461;把 2 和 5 互换,峰就照着镜子搬去了右侧。同一套公式,两个参数就换了四副面孔。
泊松分布:给”百年一遇”算概率
第二个新伙伴来自法国数学家泊松(Poisson)。它专门回答一类问题:固定的时间段里,某件稀有事件一共发生了几次?概率质量函数只需要一个参数 λ:
讲师的经典例题:一条河的”百年一遇”大洪水,平均一百年才来一次。从 1918 到 2018 年这一百年里,它到底会发生几次?用泊松分布描述——λ 就是均值:百年一次,λ=1;若是”千年一遇”的洪水,折算到”一百年”的口径下,λ=0.1。
先靠直觉过一遍:一百年里,这场洪水发生 0 次、1 次的可能性比较大;2 次就小很多,3 次也比较小;要是发生了 8 次——“百年一遇的洪水在一百年里发生了八次,那你最开始对这个假设就是有问题的了”。再代入公式手算开头几项(λ=1):k=0 时,分子 λ⁰=1,分母 0!=1,只剩 ;k=1 时 λ¹=1、1!=1,还是 0.368;k=2 时多除了一个 2,掉到 0.184——概率果然在减小。完整的一列:
import math
def poisson_pmf(k, lam):
"""泊松分布 P(X=k) = λ^k · e^(-λ) / k!"""
return lam ** k * math.exp(-lam) / math.factorial(k)
lam = 1.0
print(f"百年一遇洪水(λ={lam:g}):一百年里发生 k 次的概率")
for k in range(9):
print(f" k={k}: P(X={k}) = {poisson_pmf(k, lam):.4f}")
print("换 λ,峰跟着均值走:")
for lam in [4, 10]:
row = " ".join(f"P({k})={poisson_pmf(k, lam):.4f}" for k in (lam - 2, lam - 1, lam, lam + 1))
print(f" λ={lam}: {row}")百年一遇洪水(λ=1):一百年里发生 k 次的概率
k=0: P(X=0) = 0.3679
k=1: P(X=1) = 0.3679
k=2: P(X=2) = 0.1839
k=3: P(X=3) = 0.0613
k=4: P(X=4) = 0.0153
k=5: P(X=5) = 0.0031
k=6: P(X=6) = 0.0005
k=7: P(X=7) = 0.0001
k=8: P(X=8) = 0.0000
换 λ,峰跟着均值走:
λ=4: P(2)=0.1465 P(3)=0.1954 P(4)=0.1954 P(5)=0.1563
λ=10: P(8)=0.1126 P(9)=0.1251 P(10)=0.1251 P(11)=0.1137与讲师的口算严丝合缝:0.368、0.368、0.184,一路走低,到 k=8 已经四舍五入成 0.0000——“到 8 的时候几乎为 0”。再看下两行:λ=4 时 k=3、k=4 并列最高,λ=10 时 k=9、k=10 并列最高(整数 λ 有个小规律:P(λ−1) 恰好等于 P(λ))。讲师说”λ=4 中心在 4、λ=10 中心在 10”,方向完全正确:λ 在哪,分布的中心就在哪。
正态分布:最常用的那个”钟”
压轴登场的是正态分布(normal distribution,也叫高斯分布)——最常见的钟形曲线,由两个参数完全确定:均值 和方差 。
讲师说公式”记住就行”,真正要建立的是两个直觉:μ 管位置——均值增大,整条曲线往右挪;σ² 管胖瘦——方差变大,曲线更平缓;方差变小,曲线更 sharp(尖瘦)。那正态分布凭什么这么常用?讲师给了两条硬理由:其一,二项分布的极限就是高斯分布(上一节的杨辉三角,n 越来越大时正是往钟形靠);其二,中心极限定理——很多相互独立的变量加在一起,和的分布趋近正态,无论它们原来各自服从什么分布。于是它成了”生活中的默认假设”:对一个变量没有任何信息时,可以先假设它服从正态分布。一个日常佐证:生成随机数一般就两种——要么均匀分布的,要么正态分布的。
它还有一个特别好用的集中度特性:±2σ 区间装下约 95% 的概率质量,±3σ 装下约 99.7%——“比较集中于中心的部分”。用代码把三件事一次验清:
import math
def normal_pdf(x, mu=0.0, sigma=1.0):
"""正态分布密度:1/(σ√(2π)) · exp(-(x-μ)²/(2σ²))。"""
return math.exp(-0.5 * ((x - mu) / sigma) ** 2) / (sigma * math.sqrt(2 * math.pi))
print("σ 控制胖瘦——峰顶高度 f(μ):")
for sigma in [0.5, 1, 2]:
print(f" N(0, σ={sigma:g}):f(0) = {normal_pdf(0, 0, sigma):.4f}")
print("μ 控制位置——同形平移:")
print(f" f(3 | μ=3) = {normal_pdf(3, 3, 1):.4f},f(0 | μ=0) = {normal_pdf(0, 0, 1):.4f}")
print("集中度——落在 μ±kσ 内的概率(erf 精确计算):")
for k in [1, 2, 3]:
p = math.erf(k / math.sqrt(2))
print(f" μ±{k}σ:{p:.4f}")σ 控制胖瘦——峰顶高度 f(μ):
N(0, σ=0.5):f(0) = 0.7979
N(0, σ=1):f(0) = 0.3989
N(0, σ=2):f(0) = 0.1995
μ 控制位置——同形平移:
f(3 | μ=3) = 0.3989,f(0 | μ=0) = 0.3989
集中度——落在 μ±kσ 内的概率(erf 精确计算):
μ±1σ:0.6827
μ±2σ:0.9545
μ±3σ:0.9973σ 从 2 收到 0.5,峰顶从 0.1995 拔到 0.7979——总量不变,全堆向了中心;μ=3 与 μ=0 峰顶同为 0.3989,位置平移、形状分毫未动;±2σ 精确值 0.9545、±3σ 精确值 0.9973——讲师口中的 95% 与 99.7% 就是它。
正态分布还能”生”出新分布:把 写成 ,其中 z 是标准正态变量,就得到对数正态分布(lognormal)——一个重新构造出来的新分布,有时会用到。讲师摆摆手:“我们略过去先不讲,以后遇到的时候,我们再继续讲。”
指数形式与”自己造分布”的哲学
最后拉高一层视角。你或许已经注意到,泊松的 、正态的 ,骨子里都带着指数。这不是巧合:很多概率密度函数都能写成指数的形式——比如指数分布 (它描述的正是泊松过程中两次事件之间的间隔时间)。凡是能统一装进指数形式这一”家族”的分布,合称 exponential family(指数族):泊松、伯努利、二项、多项式、高斯……全在里面。“以后我们在整个机器学习里面,会大量地研究这个。”
讲到这,讲师说了一段朴素但受用的话:这些分布,都是历代科学家根据自己研究的问题,找到一个函数来描述那种概率变化——本质上是”不同的人用不同的函数来描述不确定性的一种办法”。它们能撑起概率统计这门大学科,是因为经过了大量的检验与研究。你甚至可以构造自己的概率密度函数——关键只有一条:它能否比较准确地描述你面对的不确定性。
贝叶斯实战:一场沙漠婚礼和一张电影票
概率篇收官前,讲师端出两道”生活应用题”——毕竟”下节课开始,就要真正学机器学习了”。
婚礼还办不办?
Mary 明天要在沙漠里办一场室外婚礼。麻烦的是:此地一年只下 5 天雨(最近五年年年如此),可天气预报偏偏说明天有雨。预报的底细也清楚:真下雨时,90% 的情况它报对了;不下雨时,它也有 10% 误报下雨。如果你是 Mary(或者她的未婚夫),明天婚礼还办不办?
设 A = 预报说下雨,B = 真的下雨,要算的是 。贝叶斯公式需要三块料:
- 先验:(一年只有 5 天雨),;
- 似然:(下雨时预报说雨)、(没下雨却误报);
- 分母: 用全概率公式展开——,“total probability,把所有条件的可能性累加”。
p_rain = 5 / 365 # 先验:此地一年只下 5 天雨
p_no_rain = 1 - p_rain
p_fore_given_rain = 0.9 # 真下雨时,预报说下雨的概率
p_fore_given_no = 0.1 # 不下雨时,预报误报下雨的概率
p_fore = p_fore_given_rain * p_rain + p_fore_given_no * p_no_rain # 全概率公式
p_rain_given_fore = p_fore_given_rain * p_rain / p_fore # 贝叶斯公式
print(f"P(明天下雨) = 5/365 = {p_rain:.4f}")
print(f"P(预报说雨) = 0.9×{p_rain:.4f} + 0.1×{p_no_rain:.4f} = {p_fore:.4f}")
print(f"P(真下雨 | 预报说雨) = 0.9×{p_rain:.4f} / {p_fore:.4f} = {p_rain_given_fore:.4f}")P(明天下雨) = 5/365 = 0.0137
P(预报说雨) = 0.9×0.0137 + 0.1×0.9863 = 0.1110
P(真下雨 | 预报说雨) = 0.9×0.0137 / 0.1110 = 0.1111尽管预报言之凿凿,真下雨的概率只有约 11%——干旱的先验实在太强,把预报的信心拽了回来。婚礼照办!讲师顺势点破生活版:体检查出一种千万人中才一例的罕见病,第一次先别慌——“病罕见的程度,比医生出错的概率还要小得多”,多半是检测错了;要靠多次检测、让证据一次次累积,后验才会真正改变。一句话:很多判断,都要看先验。
电影票的力量
第二个故事来自男生宿舍。小王和三个室友通宵打游戏,打得稀烂,被室友们痛扁一顿。第二天,室友们发现他一宿未归——都笃定他是偷偷包夜练游戏报仇去了。小王辩解:我是陪女朋友看通宵电影去了。没人信。直到他从口袋里掏出一张电影票——三个室友的怀疑瞬间崩塌,马上觉得”他好像真的是去看电影了”。
贝叶斯怎么解释这场态度反转?想算的其实是 :拿得出电影票的条件下,他其实是去打游戏的概率。套贝叶斯公式:
- (先验):他被揍得那么惨,“偷偷练游戏报仇”的动机极强——先验很大;
- (似然):可如果他真是去通宵练游戏,还能顺手弄出一张电影票?这种概率几乎等于 0;
- (分母):上一节刚讲过,它就是个归一化系数。
先验再大,乘上一个近乎 0 的似然,后验也塌到 0——“如果他真的有一张电影票,他去玩游戏的概率几乎为 0”。室友们的直觉,正是贝叶斯更新的样子:证据出现,信念随之改变。
📝 动手练一练
- 动手计算:讲师提到,“千年一遇”的洪水折算到一百年口径下 λ=0.1。请手算:一千年里,这种洪水发生 0 次、1 次、2 次的概率各是多少?哪个结果最可能?
👉 点击查看参考答案
代入 :
import math
lam = 0.1
for k in range(3):
print(f"P(X={k}) = {lam ** k * math.exp(-lam) / math.factorial(k):.4f}")P(X=0) = 0.9048
P(X=1) = 0.0905
P(X=2) = 0.0045千年一遇的事件,一千年里一次都不来才是大概率(约 90%);来一次约 9%;来两次只剩 0.45%。λ 是均值(期望 0.1 次),但”0 次”远比”1 次”更常见——这正是稀有事件分布的偏峰形态:λ<1 时,泊松的峰永远钉在 k=0 上。
- 数字体检:沿用讲师的体检类比——某病发病率 1/10,000,000(千万人中一例);检测很准:有病者 99% 报阳性,没病者只有 1% 误报阳性。①一次检测阳性,真患病的概率是多少?②两次独立检测都阳性呢?③十次全阳呢?结合讲师”需要多次检测”的说法,说明证据如何一步步推着后验走。
👉 点击查看参考答案
p_d = 1e-7 # 发病率:千万人中一例
p_pos_if_d, p_pos_if_no = 0.99, 0.01
def posterior(n_pos):
"""n 次独立检测全阳后,真的患病的后验概率。"""
like_d = p_pos_if_d ** n_pos * p_d
like_no = p_pos_if_no ** n_pos * (1 - p_d)
return like_d / (like_d + like_no)
print(f"一次阳性:P(病 | 阳性) = {posterior(1):.6%}")
print(f"两次独立检测都阳性:P(病 | 两个阳性) = {posterior(2):.6%}")
print(f"十次独立检测都阳性:P(病 | 十个阳性) ≈ {posterior(10):.2e}")一次阳性:P(病 | 阳性) = 0.000990%
两次独立检测都阳性:P(病 | 两个阳性) = 0.097914%
十次独立检测都阳性:P(病 | 十个阳性) ≈ 1.00e+00一次阳性:后验只有 0.00099%——比先验(0.00001%)翻了约百倍,却仍近乎不可能。讲师说得对:病太罕见,罕见到压过了检测的出错率,单次阳性不足以下结论。两次阳性升到约 0.098%,再翻百倍;十次全阳,后验才真正逼近 1。这就是”多次检测”的数学含义:每一条新证据都让后验再更新一次,证据方向一致时,再小的先验也会被一步步推翻。
本章小结
概率篇到这里收官:从概率公理到随机变量,从期望、方差、协方差到伯努利、二项、多项式,再到伽马函数撑起的贝塔分布、给稀有事件计数的泊松、无处不在的正态,最后用全概率公式加贝叶斯公式,把”先验 × 似然 → 归一化 → 后验”这条推理主线演成婚礼与电影票两个故事。分布没有高下,只有合不合身——它们都是前人描述不确定性的工具。带着这套工具,下一章就走进真正的机器学习。(讲师还埋了一手伏笔:辛普森悖论,后面的课再见。)
📋 行动清单
- 用 λ=0.1 亲手代入泊松公式算 P(0)、P(1)、P(2),与练一练第 1 题的代码输出对照
- 把婚礼例换成你所在城市的雨天数(查一查一年平均下雨几天),重跑代码看后验怎么变,体会”先验一变,结论就变”
- 给朋友讲电影票的故事,用”先验很大 × 似然几乎为 0 → 后验几乎为 0”收尾
—— 小象教研组
配套资料 · 直接下载
课件、代码、数据集等配套资料全部免费,点击即可直接下载,无需分享或解锁。
- 下载第2章课件:机器学习的数学基础 II(概率)