§1.1.6

伯努利/二项/高斯/多项/Beta/Dirichlet 分布的密度函数与典型应用?

好的,我们来逐一解析这六个在 AI 和机器学习中至关重要的概率分布。


伯努利分布 (Bernoulli Distribution)

核心概念

伯努利分布是单个二元随机变量的概率分布,也可以看作是单次“硬币实验”的数学模型。实验结果只有两种,通常称为“成功”(X=1X=1)和“失败”(X=0X=0)。该分布由一个参数 pp(成功概率)完全定义,其中 p[0,1]p \in [0, 1]

原理与推导

  • 概率质量函数 (PMF): 对于一个随机变量 XBernoulli(p)X \sim \text{Bernoulli}(p),其 PMF 为:

    P(X=k)=pk(1p)1kfor k{0,1}P(X=k) = p^k (1-p)^{1-k} \quad \text{for } k \in \{0, 1\}
    • k=1k=1 (成功) 时, P(X=1)=p1(1p)11=pP(X=1) = p^1(1-p)^{1-1} = p
    • k=0k=0 (失败) 时, P(X=0)=p0(1p)10=1pP(X=0) = p^0(1-p)^{1-0} = 1-p。 这个紧凑的公式巧妙地覆盖了两种情况。
  • 关键统计特性:

    • 期望 (Mean): E[X]=1P(X=1)+0P(X=0)=pE[X] = 1 \cdot P(X=1) + 0 \cdot P(X=0) = p
    • 方差 (Variance): Var(X)=E[X2](E[X])2=pp2=p(1p)Var(X) = E[X^2] - (E[X])^2 = p - p^2 = p(1-p)
  • 信息论解释: 伯努利分布是构建二元交叉熵损失函数的基础。对于一个真实标签 y{0,1}y \in \{0, 1\} 和模型预测概率 p^\hat{p},损失函数 [ylog(p^)+(1y)log(1p^)]-\left[ y\log(\hat{p}) + (1-y)\log(1-\hat{p}) \right] 正是最小化真实伯努利分布与预测伯努利分布之间的负对数似然。

代码实现

python
1import numpy as np
2from scipy.stats import bernoulli
3import matplotlib.pyplot as plt
4
5# --- 核心演示 ---
6p = 0.3 # 定义成功概率
7
8# 1. 创建一个伯努利分布对象
9# 这是scipy的标准做法,先用参数定义一个分布的“冻结”实例
10rv = bernoulli(p)
11
12# 2. 计算概率质量函数 (PMF)
13# P(X=1) 应该是 p
14pmf_success = rv.pmf(1)
15# P(X=0) 应该是 1-p
16pmf_failure = rv.pmf(0)
17
18print(f"参数 p = {p}")
19print(f"P(X=1) = {pmf_success:.4f}") # 为什么是0.3:根据定义,成功的概率就是p
20print(f"P(X=0) = {pmf_failure:.4f}") # 为什么是0.7:失败的概率是1-p
21
22# 3. 从分布中随机抽样
23# 模拟10次伯努利试验
24samples = rv.rvs(size=10)
25print(f"\n10次伯努利试验的样本: {samples}") # 为什么会有0和1:每次试验都是独立的,以p的概率为1,1-p的概率为0
26
27# --- 可视化 ---
28# 伯努利分布的可视化就是一个条形图
29fig, ax = plt.subplots(1, 1, figsize=(6, 4))
30outcomes = [0, 1]
31probabilities = [rv.pmf(0), rv.pmf(1)]
32ax.bar(outcomes, probabilities, tick_label=outcomes, width=0.2)
33ax.set_xlabel("试验结果 (k)")
34ax.set_ylabel("概率 P(X=k)")
35ax.set_title(f'伯努利分布 PMF (p={p})')
36ax.set_ylim(0, 1)
37plt.show()

工程实践

  • 应用场景:

    • 二元分类: 逻辑回归或神经网络的输出层(经过 Sigmoid 激活后)可以看作是在为每个样本预测其所属类别的伯努利分布参数 pp
    • 点击率预测 (CTR): 用户是否点击一个广告,这是一个典型的伯努利事件。
    • 强化学习: 在某些简单环境中,一个动作是成功还是失败。
  • 参数估计: 给定 NN 个独立同分布的观测样本 x1,x2,...,xNx_1, x_2, ..., x_N,参数 pp 的最大似然估计 (MLE) 就是样本的均值:

    p^MLE=1Ni=1Nxi=成功的次数总试验次数\hat{p}_{MLE} = \frac{1}{N} \sum_{i=1}^N x_i = \frac{\text{成功的次数}}{\text{总试验次数}}

常见误区与边界情况

  • 误区: 伯努利分布与二项分布混淆。伯努利分布是单次试验,二项分布是 n 次独立伯努利试验中成功次数的分布。伯努利分布是二项分布在 n=1n=1 时的特例。
  • 边界情况:
    • p=0p=0 时,结果永远是 0。
    • p=1p=1 时,结果永远是 1。 在这些情况下,分布是确定的,没有随机性。
  • 面试追问: "逻辑回归的输出是什么?" 回答要点: 逻辑回归的 Sigmoid 输出层为一个样本预测了一个概率 pp。这个 pp 可以被解释为一个伯努利分布的参数,该分布描述了该样本属于正类的概率。因此,我们可以说逻辑回归模型是在为每个输入数据点 xx 建模一个以 p=σ(wTx+b)p=\sigma(w^Tx+b) 为参数的伯努- 利分布。

二项分布 (Binomial Distribution)

核心概念

二项分布描述了在 nn 次独立、重复的伯努利试验中,成功发生 kk 次的概率。每次试验的成功概率为 pp。它由两个参数定义:试验次数 nn 和成功概率 pp

原理与推导

  • 概率质量函数 (PMF): 对于一个随机变量 XBinomial(n,p)X \sim \text{Binomial}(n, p),其 PMF 为:

    P(X=k)=(nk)pk(1p)nkfor k{0,1,...,n}P(X=k) = \binom{n}{k} p^k (1-p)^{n-k} \quad \text{for } k \in \{0, 1, ..., n\}
    • 推导动机:
      1. pkp^k: kk 次成功发生的概率。
      2. (1p)nk(1-p)^{n-k}: nkn-k 次失败发生的概率。
      3. (nk)=n!k!(nk)!\binom{n}{k} = \frac{n!}{k!(n-k)!}: 组合数,表示在 nn 次试验中,选出 kk 次成功的位置有多少种组合方式。因为试验是独立的,任何特定的成功 kk 次、失败 nkn-k 次的序列(如 S-S-...-S-F-F-...-F)的概率都是 pk(1p)nkp^k(1-p)^{n-k}。将所有这些不同序列的概率相加,就得到了最终的公式。
  • 关键统计特性:

    • 期望 (Mean): E[X]=npE[X] = np。直观上,做 nn 次试验,每次成功概率为 pp,平均成功次数就是 npnp
    • 方差 (Variance): Var(X)=np(1p)Var(X) = np(1-p)
  • 复杂度: 计算 (nk)\binom{n}{k}nn 很大时可能导致数值溢出,通常使用对数概率来计算。

代码实现

python
1import numpy as np
2from scipy.stats import binom
3import matplotlib.pyplot as plt
4
5# --- 核心演示 ---
6n, p = 10, 0.5 # 定义试验次数和成功概率
7
8# 1. 创建一个二项分布对象
9rv = binom(n, p)
10
11# 2. 计算PMF
12# 例如,计算10次试验中成功5次的概率
13k = 5
14pmf_k = rv.pmf(k)
15print(f"n={n}, p={p} 时,成功 {k} 次的概率: {pmf_k:.4f}") # 为什么是0.2461:C(10,5) * 0.5^5 * 0.5^5
16
17# 3. 随机抽样
18# 模拟4组实验,每组都是n=10的二项分布,看成功次数
19samples = rv.rvs(size=4)
20print(f"\n4次二项分布的样本(每次n=10): {samples}") # 为什么是[5, 4, 5, 6]这样的数:每次实验都是一次完整的n=10的试验,记录成功次数
21
22# --- 可视化 ---
23fig, ax = plt.subplots(1, 1, figsize=(8, 5))
24k_values = np.arange(0, n + 1)
25pmf_values = rv.pmf(k_values)
26ax.bar(k_values, pmf_values, label=f'PMF for n={n}, p={p}')
27ax.set_xlabel("成功次数 (k)")
28ax.set_ylabel("概率 P(X=k)")
29ax.set_title('二项分布 PMF')
30ax.legend()
31plt.show()

工程实践

  • 应用场景:

    • A/B 测试: 比较两个版本(A和B)的转化率。例如,1000个用户访问A版本,有50人转化,这个“50”就可以看作是从一个 B(1000,pA)B(1000, p_A) 分布中抽出的样本。
    • 质量控制: 一批产品中有多少个次品。
    • 生物信息学: 基因序列中某个特定模式出现的次数。
  • 超参数选择:

    • nn 通常由实验设计决定(如总用户数、总抽样数)。
    • pp 是需要估计或推断的核心参数。

常见误区与边界情况

  • 误区: 假设试验不是独立的。二项分布的基石是各次伯努利试验相互独立。如果前一次试验的结果会影响下一次,则不能使用二- 项分布。
  • 边界情况:
    • nn 很大且 pp 不接近0或1时,二项分布可以用高斯分布 N(np,np(1p))N(np, np(1-p)) 来近似(中心极限定理)。
    • nn 很大且 pp 很小时,二项分布可以用泊松分布 Poisson(λ=np)\text{Poisson}(\lambda=np) 来近似。
  • 面试追问: "在A/B测试中,我们观察到A版本1000次展示,50次点击;B版本1000次展示,65次点击。你如何判断B版本是否真的更好?" 回答要点: 这个问题触及了假设检验的核心。我们可以将A和B的点击次数建模为两个独立的二项分布 XAB(1000,pA)X_A \sim B(1000, p_A)XBB(1000,pB)X_B \sim B(1000, p_B)。我们的目标是检验假设 H0:pA=pBH_0: p_A = p_B vs H1:pB>pAH_1: p_B > p_A。可以使用Z检验或卡方检验来计算p-value,判断观察到的差异是否在统计上显著。这展示了将问题抽象为概率模型并进行推断的能力。

高斯分布 (Gaussian/Normal Distribution)

核心概念

高斯分布,也称正态分布,是连续随机变量的最重要分布之一,由其钟形曲线闻名。它由两个参数定义:均值 μ\mu(决定分布的中心位置)和方差 σ2\sigma^2(决定分布的胖瘦程度,σ\sigma 是标准差)。许多自然、社会现象的度量(如身高、测量误差)都近似服从高斯分布。

原理与推导

  • 概率密度函数 (PDF): 对于一个随机变量 XN(μ,σ2)X \sim N(\mu, \sigma^2),其 PDF 为:

    f(xμ,σ2)=12πσ2e(xμ)22σ2f(x | \mu, \sigma^2) = \frac{1}{\sqrt{2\pi\sigma^2}} e^{-\frac{(x-\mu)^2}{2\sigma^2}}
    • 推导动机:
      1. e(xμ)22σ2e^{-\frac{(x-\mu)^2}{2\sigma^2}}: 指数部分是核心。它是一个关于 xx 的二次函数的负指数,这保证了曲线的钟形。当 x=μx=\mu 时,指数为0,函数取最大值。xxμ\mu 越远,函数值越小。
      2. 12πσ2\frac{1}{\sqrt{2\pi\sigma^2}}: 归一化常数,确保整个曲线下的面积(即总概率)为1。
  • 多维高斯分布: 对于一个 DD 维向量 xN(μ,Σ)\mathbf{x} \sim N(\boldsymbol{\mu}, \boldsymbol{\Sigma}),其 PDF 为:

    f(xμ,Σ)=1(2π)D/2Σ1/2exp(12(xμ)TΣ1(xμ))f(\mathbf{x} | \boldsymbol{\mu}, \boldsymbol{\Sigma}) = \frac{1}{(2\pi)^{D/2} |\boldsymbol{\Sigma}|^{1/2}} \exp\left(-\frac{1}{2}(\mathbf{x}-\boldsymbol{\mu})^T \boldsymbol{\Sigma}^{-1} (\mathbf{x}-\boldsymbol{\mu})\right)

    其中 μ\boldsymbol{\mu} 是均值向量,Σ\boldsymbol{\Sigma} 是协方差矩阵。

  • 信息论解释: 在所有具有相同均值和方差的连续分布中,高斯分布的最大。这意味着,如果我们只知道一个随机变量的均值和方差,最无偏的假设就是它服从高斯分布。

代码实现

python
1import numpy as np
2from scipy.stats import norm
3import matplotlib.pyplot as plt
4
5# --- 核心演示 ---
6mu, sigma = 0, 1 # 定义均值和标准差 (标准正态分布)
7
8# 1. 创建高斯分布对象
9rv = norm(mu, sigma)
10
11# 2. 计算PDF
12# 计算 x=0 处的概率密度
13pdf_at_zero = rv.pdf(0)
14print(f"标准正态分布在 x=0 处的概率密度: {pdf_at_zero:.4f}") # 为什么是0.3989: 1/sqrt(2*pi)
15
16# 3. 计算CDF (累积分布函数)
17# P(X <= 0) 应该是 0.5
18cdf_at_zero = rv.cdf(0)
19print(f"标准正态分布 P(X<=0) = {cdf_at_zero:.4f}") # 为什么是0.5:高斯分布对称,均值点左侧面积为一半
20
21# 4. 随机抽样
22samples = rv.rvs(size=1000)
23
24# --- 可视化 ---
25fig, ax = plt.subplots(1, 1, figsize=(8, 5))
26x_values = np.linspace(-4, 4, 100)
27pdf_values = rv.pdf(x_values)
28ax.plot(x_values, pdf_values, 'r-', lw=2, label='PDF')
29ax.hist(samples, bins=30, density=True, alpha=0.6, label='抽样数据的直方图') # density=True使直方图面积为1
30ax.set_xlabel("x")
31ax.set_ylabel("概率密度")
32ax.set_title(f'高斯分布 PDF (μ={mu}, σ={sigma})')
33ax.legend()
34plt.show()

工程实践

  • 应用场景:
    • 建模噪声: 传感器读数、通信信号中的噪声通常被建模为高斯白噪声。
    • 贝叶斯推断: 在贝叶斯线性回归中,权重参数的先验分布常被设为高斯分布(这对应于 L2 正则化)。
    • 变分自编码器 (VAE): VAE 的潜在空间通常被假设服从标准高斯分布。
    • 高斯混合模型 (GMM): 用于聚类,假设数据是由多个高斯分布混合生成的。
    • 神经网络初始化: 许多权重初始化方法(如 Xavier/Glorot 初始化)都从一个均值为0、方差经特殊设计的高斯分布中采样。

常见误区与边界情况

  • 误区: 滥用高斯假设。许多金融数据(如股票收益率)具有“肥尾”特性,即极端事件的发生概率比高斯分布预测的要高得多。此时使用学生t分布等可能更合适。
  • 数值稳定性: 在多维高斯中,计算协方差矩阵的逆 (Σ1\boldsymbol{\Sigma}^{-1}) 和行列式 (Σ|\boldsymbol{\Sigma}|) 可能因矩阵病态(接近奇异)而数值不稳定。工程上常使用Cholesky分解或对角线加一个小数(jitter)来提高稳定性。
  • 面试追问: "中心极限定理 (CLT) 是什么,它为什么重要?" 回答要点: CLT 指出,大量独立同分布的随机变量之和(或均值)的分布,在满足一定条件的情况下,会趋向于一个高斯分布,无论原始变量本身是什么分布。这解释了为什么高斯分布在自然界如此普遍。在工程上,它为我们用高斯分布去近似许多复杂过程的聚合效应提供了理论依据。

多项分布 (Multinomial Distribution)

核心概念

多项分布是二项分布的推广。它描述了在 nn 次独立的试验中,每种可能的结果(共 KK 种)分别出现了多少次的概率。每次试验有 KK 个互斥的结果,每个结果的发生概率为 p1,p2,...,pKp_1, p_2, ..., p_K,且 i=1Kpi=1\sum_{i=1}^K p_i = 1

原理与推导

  • 概率质量函数 (PMF): 假设一个向量 X=(X1,...,XK)\mathbf{X} = (X_1, ..., X_K) 表示 KK 种结果在 nn 次试验中各自发生的次数,其中 i=1KXi=n\sum_{i=1}^K X_i = n。其 PMF 为:

    P(X1=x1,...,XK=xK)=n!x1!x2!...xK!p1x1p2x2...pKxKP(X_1=x_1, ..., X_K=x_K) = \frac{n!}{x_1! x_2! ... x_K!} p_1^{x_1} p_2^{x_2} ... p_K^{x_K}
    • 推导动机:
      1. p1x1p2x2...pKxKp_1^{x_1} p_2^{x_2} ... p_K^{x_K}: 某个特定结果序列(例如,结果1出现x1x_1次,结果2出现x2x_2次...)的概率。
      2. n!x1!x2!...xK!\frac{n!}{x_1! x_2! ... x_K!}: 多项式系数,表示将 nn 次试验分配给 KK 个类别,各类别的数量分别为 x1,...,xKx_1, ..., x_K 的总组合数。
  • 关键统计特性:

    • 期望 (Mean): E[Xi]=npiE[X_i] = np_i
    • 方差 (Variance): Var(Xi)=npi(1pi)Var(X_i) = np_i(1-p_i)
    • 协方差 (Covariance): Cov(Xi,Xj)=npipjCov(X_i, X_j) = -np_ip_j for iji \neq j。协方差为负,这很直观:如果一种结果出现的次数多了,其他结果出现的次数必然会减少,因为总次数是固定的 nn

代码实现

python
1import numpy as np
2from scipy.stats import multinomial
3import matplotlib.pyplot as plt
4
5# --- 核心演示 ---
6n = 20 # 总试验次数 (例如,投掷20次骰子)
7p = [1/6, 1/6, 1/6, 1/6, 1/6, 1/6] # 每个结果的概率 (一个公平的6面骰子)
8
9# 1. 创建多项分布对象
10rv = multinomial(n, p)
11
12# 2. 计算PMF
13# 计算一个具体结果向量的概率,例如:
14# 点数1出现3次, 2出现3次, 3出现4次, 4出现3次, 5出现3次, 6出现4次
15# 注意总和必须是 n=20
16counts = [3, 3, 4, 3, 3, 4]
17pmf_val = rv.pmf(counts)
18print(f"n=20, p={p}")
19print(f"观察到计数 {counts} 的概率是: {pmf_val:.6f}") # 为什么是这个值:根据多项分布公式计算
20
21# 3. 随机抽样
22# 模拟4次实验,每次实验都是n=20次投掷,记录每个点数的出现次数
23samples = rv.rvs(size=4)
24print(f"\n4次多项分布的样本 (每次n=20):\n{samples}") # 为什么是向量:每次抽样结果是一个向量,表示K个类别的计数
25
26# 多项分布的可视化比较复杂,通常不直接画PMF,而是看边缘分布或抽样结果

工程实践

  • 应用场景:
    • 自然语言处理 (NLP):
      • 词袋模型 (Bag-of-Words): 一个文档可以看作是 nn 次“从词典中抽词”的试验(nn是文档长度),文档中各个词的词频向量 (c1,c2,...,cV)(c_1, c_2, ..., c_V) 就服从以词典词汇概率为参数的多项分布。
      • 主题模型 (Topic Modeling): 如 LDA,文档的主题分布和主题的词分布都与多项分布有关。
    • 多分类问题: 神经网络的 Softmax 输出层给出了一个样本属于各个类别的概率向量 (p1,...,pK)(p_1, ..., p_K)。如果我们有一批 NN 个样本,那么预测为各个类别的样本数 (n1,...,nK)(n_1, ..., n_K) 就服从多项分布 M(N,(p1,...,pK))M(N, (p_1, ..., p_K))

常见误区与边界情况

  • 误区:分类分布 (Categorical Distribution) 混淆。分类分布是单次试验的多项分布(n=1n=1),是伯努利分布的推广。多项分布是 nn 次独立分类试验的结果计数。
  • 数据稀疏性: 在 NLP 中,词典大小 KK 非常大,导致大多数词的计数为0。这给参数估计带来挑战,需要平滑技术(如拉普拉斯平滑)来处理。
  • 面试追问: "请解释一下词袋模型,并说明它与多项分布的关系。" 回答要点: 词袋模型将文本当作一个无序的词集合。它忽略语法和词序,只关心词频。如果假设文档中的每个词都是从一个固定的、覆盖整个词汇表的概率分布中独立抽取的,那么该文档的词频向量(即每个词出现多少次)就遵循一个多项分布。这个分布的参数是试验次数 nn(文档长度)和词汇表的基础词频概率向量 p\mathbf{p}

Beta 分布

核心概念

Beta 分布是一个定义在 [0,1][0, 1] 区间上的连续概率分布,它由两个正数形状参数 α\alphaβ\beta 控制。它通常被看作是概率的概率分布,最常见的用途是作为伯努利分布或二项分布中概率参数 pp 的先验分布。

原理与推导

  • 概率密度函数 (PDF): 对于一个随机变量 pBeta(α,β)p \sim \text{Beta}(\alpha, \beta),其 PDF 为:

    f(p;α,β)=pα1(1p)β1B(α,β)for p[0,1]f(p; \alpha, \beta) = \frac{p^{\alpha-1}(1-p)^{\beta-1}}{B(\alpha, \beta)} \quad \text{for } p \in [0, 1]
    • B(α,β)=01uα1(1u)β1du=Γ(α)Γ(β)Γ(α+β)B(\alpha, \beta) = \int_0^1 u^{\alpha-1}(1-u)^{\beta-1} du = \frac{\Gamma(\alpha)\Gamma(\beta)}{\Gamma(\alpha+\beta)} 是 Beta 函数,作为归一化常数。
    • 直观解释: α1\alpha-1 可以看作是“伪成功次数”,β1\beta-1 可以看作是“伪失败次数”。当 α,β\alpha, \beta 都大于1时,分布呈单峰,峰值在 (α1)/(α+β2)(\alpha-1)/(\alpha+\beta-2) 附近。
  • 共轭先验 (Conjugate Prior): 这是 Beta 分布最重要的特性。当先验分布 (Prior) 和似然函数 (Likelihood) 结合后,得到的后验分布 (Posterior) 与先验分布属于同一种分布族,则称该先验为似然的共轭先验。

    • Beta-Binomial 共轭:
      • 先验: 假设我们对一个硬币的正面概率 pp 的先验信念是 pBeta(α,β)p \sim \text{Beta}(\alpha, \beta)
      • 似然: 我们进行了 nn 次试验,观察到 kk 次成功,其似然为 P(datap)pk(1p)nkP(\text{data}|p) \propto p^k(1-p)^{n-k} (二项分布)。
      • 后验: 根据贝叶斯定理,后验 P(pdata)P(datap)×P(p)P(p|\text{data}) \propto P(\text{data}|p) \times P(p) P(pdata)[pk(1p)nk]×[pα1(1p)β1]=pk+α1(1p)nk+β1P(p|\text{data}) \propto [p^k(1-p)^{n-k}] \times [p^{\alpha-1}(1-p)^{\beta-1}] = p^{k+\alpha-1}(1-p)^{n-k+\beta-1} 这个形式正是 Beta(k+α,nk+β)\text{Beta}(k+\alpha, n-k+\beta) 的核。所以,后验分布也是一个 Beta 分布。这使得贝叶斯更新变得异常简单:只需更新参数即可。

代码实现

python
1import numpy as np
2from scipy.stats import beta
3import matplotlib.pyplot as plt
4
5# --- 核心演示 ---
6# 不同的 alpha, beta 参数组合
7params = [(0.5, 0.5), (1, 1), (2, 5), (5, 2), (10, 10)]
8
9fig, ax = plt.subplots(1, 1, figsize=(10, 6))
10x = np.linspace(0, 1, 100)
11
12for a, b in params:
13 # 1. 创建Beta分布对象
14 rv = beta(a, b)
15 # 2. 计算PDF
16 pdf_values = rv.pdf(x)
17 ax.plot(x, pdf_values, label=f'Beta(α={a}, β={b})')
18
19# 3. 抽样演示
20# 假设我们从 Beta(2,5) 中抽样一个概率p
21sampled_p = beta.rvs(2, 5, size=1)[0]
22print(f"从Beta(2,5)中抽样得到的概率p值: {sampled_p:.4f}") # 为什么是小于0.5的数:因为beta=5 > alpha=2,分布偏向0
23
24ax.set_xlabel("概率值 p")
25ax.set_ylabel("概率密度")
26ax.set_title('不同参数下的Beta分布')
27ax.legend()
28plt.show()

工程实践

  • 应用场景:
    • 贝叶斯 A/B 测试: 不再简单地计算点击率,而是为每个版本的点击率 pA,pBp_A, p_B 维护一个 Beta 分布。开始时可能是无信息先验 Beta(1,1)(即均匀分布)。每当有新数据(点击或未点击),就更新这个分布。最后比较两个后验分布,例如计算 P(pB>pA)P(p_B > p_A) 的概率。
    • 探索-利用 (Explore-Exploit): 在多臂老虎机问题中,汤普森采样 (Thompson Sampling) 算法就是从每个臂的 Beta 后验分布中采样一个成功率,然后选择采样率最高的臂执行。

常见误区与边界情况

  • 误区: Beta 分布是用来建模数据的。不,它通常是用来建模其他分布的参数的。
  • 参数解释:
    • α=β=1\alpha=\beta=1: 均匀分布,表示对 pp 没有任何先验知识。
    • α,β<1\alpha, \beta < 1: U形分布,认为 pp 很可能接近0或1。
    • α,β>1\alpha, \beta > 1: 单峰分布,认为 pp 在某个值附近的可能性最大。
    • α,β\alpha, \beta 越大,分布越窄,表示对 pp 的信念越强。
  • 面试追问: "请解释一下贝叶斯 A/B 测试和传统频率派 A/B 测试(如Z检验)的主要区别。" 回答要点: 频率派方法给出 p-value,回答“如果两个版本没区别,观察到当前数据或更极端数据的概率有多大”,比较绕。贝叶斯方法直接给出后验分布,可以直观地回答“B版本比A版本好的概率是多大?”(即计算 P(pB>pA)P(p_B > p_A)),并且可以随时更新和解读结果,不需要等到固定的样本量。

Dirichlet 分布

核心概念

Dirichlet 分布是 Beta 分布在高维上的推广。Beta 分布是定义在 [0,1][0, 1] 区间上的分布,而 Dirichlet 分布是定义在一个概率单纯形 (Simplex) 上的分布。它为一组概率向量 p=(p1,...,pK)\mathbf{p} = (p_1, ..., p_K)(其中 pi0p_i \ge 0pi=1\sum p_i = 1)赋予了概率。它由一个正数向量参数 α=(α1,...,αK)\boldsymbol{\alpha} = (\alpha_1, ..., \alpha_K) 控制。

原理与推导

  • 概率密度函数 (PDF): 对于一个概率向量 pDirichlet(α)\mathbf{p} \sim \text{Dirichlet}(\boldsymbol{\alpha}),其 PDF 为:

    f(p;α)=1B(α)k=1Kpkαk1f(\mathbf{p}; \boldsymbol{\alpha}) = \frac{1}{B(\boldsymbol{\alpha})} \prod_{k=1}^K p_k^{\alpha_k-1}
    • B(α)=k=1KΓ(αk)Γ(k=1Kαk)B(\boldsymbol{\alpha}) = \frac{\prod_{k=1}^K \Gamma(\alpha_k)}{\Gamma(\sum_{k=1}^K \alpha_k)} 是多维 Beta 函数,作为归一化常数。
    • 直观解释: 类似 Beta 分布,αk1\alpha_k-1 可以看作是第 kk 个类别的“伪计数”。
  • 共轭先验 (Conjugate Prior): Dirichlet 分布是多项分布的共轭先验。

    • Dirichlet-Multinomial 共轭:
      • 先验: 假设我们对一个 KK 面骰子的概率向量 p\mathbf{p} 的先验信念是 pDirichlet(α)\mathbf{p} \sim \text{Dirichlet}(\boldsymbol{\alpha})
      • 似然: 我们进行了 nn 次试验,观察到各类别的计数为 x=(x1,...,xK)\mathbf{x} = (x_1, ..., x_K),其似然为 P(xp)pkxkP(\mathbf{x}|\mathbf{p}) \propto \prod p_k^{x_k} (多项分布)。
      • 后验: P(px)P(xp)×P(p)P(\mathbf{p}|\mathbf{x}) \propto P(\mathbf{x}|\mathbf{p}) \times P(\mathbf{p}) P(px)(pkxk)×(pkαk1)=pkxk+αk1P(\mathbf{p}|\mathbf{x}) \propto \left(\prod p_k^{x_k}\right) \times \left(\prod p_k^{\alpha_k-1}\right) = \prod p_k^{x_k+\alpha_k-1} 这正是 Dirichlet(α+x)\text{Dirichlet}(\boldsymbol{\alpha}+\mathbf{x}) 的核。更新规则同样简单:将观察到的计数加到先验参数上。

代码实现

python
1import numpy as np
2from scipy.stats import dirichlet
3import matplotlib.pyplot as plt
4import plotly.graph_objects as go
5
6# --- 核心演示 ---
7# K=3 维的情况
8alpha_params = [0.1, 1, 10]
9
10# 1. 抽样
11# 从对称的Dirichlet分布中抽样
12# alpha_0 = sum(alpha_i) 控制分布的集中程度
13# alpha_0 越小,样本越可能在角落(稀疏)
14# alpha_0 越大,样本越可能在中心(均匀)
15samples_sparse = dirichlet.rvs([alpha_params[0]] * 3, size=1000)
16samples_uniform = dirichlet.rvs([alpha_params[1]] * 3, size=1000)
17samples_concentrated = dirichlet.rvs([alpha_params[2]] * 3, size=1000)
18
19print(f"从Dirichlet(0.1, 0.1, 0.1)抽样的前3个样本:\n{samples_sparse[:3]}")
20print(f"\n从Dirichlet(10, 10, 10)抽样的前3个样本:\n{samples_concentrated[:3]}")
21
22# --- 可视化 (3D 单纯形) ---
23# 这是一个高级可视化,需要plotly
24def plot_simplex(points, title):
25 fig = go.Figure(data=[go.Scatterternary({
26 'mode': 'markers',
27 'a': points[:, 0],
28 'b': points[:, 1],
29 'c': points[:, 2],
30 'marker': {'size': 3}
31 })])
32 fig.update_layout({
33 'ternary': {
34 'sum': 1,
35 'aaxis': {'title': 'P1', 'min': 0, 'linewidth': 2, 'ticks': 'outside'},
36 'baxis': {'title': 'P2', 'min': 0, 'linewidth': 2, 'ticks': 'outside'},
37 'caxis': {'title': 'P3', 'min': 0, 'linewidth': 2, 'ticks': 'outside'}
38 },
39 'title': title
40 })
41 fig.show()
42
43plot_simplex(samples_sparse, "Dirichlet(α=[0.1, 0.1, 0.1]) - 稀疏")
44plot_simplex(samples_uniform, "Dirichlet(α=[1, 1, 1]) - 均匀")
45plot_simplex(samples_concentrated, "Dirichlet(α=[10, 10, 10]) - 集中")

工程实践

  • 应用场景:
    • 主题模型 (Topic Modeling): Dirichlet 分布是 Latent Dirichlet Allocation (LDA) 的核心。在 LDA 中:
      1. 每个文档的主题分布(一个概率向量,表示该文档包含各个主题的比例)被假设是从一个 Dirichlet 分布中抽样得到的。
      2. 每个主题的词分布(一个概率向量,表示该主题下生成各个词的概率)也是从另一个 Dirichlet 分布中抽样得到的。
    • 贝叶斯多项式模型: 作为多项分布参数的先验。

常见误区与边界情况

  • 误区: 将 Dirichlet 分布的样本(一个概率向量)与多项分布的样本(一个计数向量)混淆。Dirichlet 生成的是多项分布的参数
  • 参数解释:
    • 对称的 α=(α0,α0,...,α0)\boldsymbol{\alpha} = (\alpha_0, \alpha_0, ..., \alpha_0):
      • α0<1\alpha_0 < 1: 样本点倾向于落在单纯形的顶点,生成的概率向量是稀疏的(大部分接近0,少数接近1)。
      • α0=1\alpha_0 = 1: 样本点在单纯形上均匀分布
      • α0>1\alpha_0 > 1: 样本点倾向于落在单纯形的中心,生成的概率向量更均匀。
    • αk\sum \alpha_k 的大小被称为浓度参数。浓度越大,生成的概率向量彼此之间越相似。
  • 面试追问: "请简述 LDA 的生成过程,并指出 Dirichlet 分布在其中扮演的角色。" 回答要点:
    1. 对每一个主题 kk,从一个 Dirichlet(β\boldsymbol{\beta}) 分布中抽取该主题的词分布 ϕk\phi_k
    2. 对每一篇文档 dd,从一个 Dirichlet(α\boldsymbol{\alpha}) 分布中抽取该文档的主题分布 θd\theta_d
    3. 对文档 dd 中的每一个词 wiw_i: a. 从该文档的主题分布 θd\theta_d 中(按多项分布)抽取一个主题 ziz_i。 b. 从选定主题 ziz_i 的词分布 ϕzi\phi_{z_i} 中(按多项分布)抽取这个词 wiw_i。 Dirichlet 分布在此处作为先验,为主题-词分布和文档-主题分布这两个概率向量提供了灵活的、符合共轭特性的建模框架。
相关题目