贝叶斯推理[1](Bayesian inference)是统计学中的一个重要问题,也是许多机器学习方法中经常遇到的问题。例如,用于分类的高斯混合模型或用于主题建模的潜在狄利克雷分配(Latent Dirichlet Allocation,简称LDA)模型等概率图模型都需要在拟合数据时解决这一问题。
同时,由于模型设置(假设、维度……)不同,贝叶斯推理问题有时会很难解决。在解决大型问题时,精确的方案往往需要繁重的计算,要完成这些难以处理的计算,必须采用一些近似技术,并构建快速且有可扩展性的系统。
统计推断旨在根据可观察到的事物来了解不可观察到的事物。即,统计推断是基于一个总体或一些样本中的某些观察变量(通常是影响)得出结论的过程,例如关于总体或样本中某些潜在变量(通常是原因)的准时估计、置信区间或区间估计等。
而贝叶斯推理则是从贝叶斯的角度产生统计推断的过程。简而言之,贝叶斯范式是一种统计/概率范式,在这种范式中,每次记录新的观测数据时就会更新由概率分布建模的先验知识,观测数据的不确定性则由另一个概率分布建模。支配贝叶斯范式的整个思想嵌入在所谓的贝叶斯定理中,该定理表达了更新知识(“后验”)、已知知识(“先验”)以及来自观察的知识(“可能性”)之间的关系。
贝叶斯模型选择
贝叶斯定理为:
上面的每一项都有一个名称,测量不同的概率:
当我们只考虑一个模型时,我们经常忽略模型 。然而,除非只有一个可能的模型,否则我们仍然需要解决比较可能的模型的元推理问题。虽然这一步通常被称为 模型选择,但最好将其看作是模型比较,因为它只能为不同的模型分配相对的概率。
从贝叶斯视角看模型选择是用概率来表示模型选择的不确定性。假设要比较模型集 ,模型指的是在观测数据集 上的一个概率分布。我们假设数据是从这些模型中的某一个产生的,但不确定是哪一个。
假设观测数据为 ,模型 的后验概率为:
其中,分子 是给定 的 证据,而分母现在是一个 超级证据:
在一个离散可数(也许是无限)的模型集的情况下,积分变成一个和:
每个 模型可能性 指的是在 范围内的概率。并引入了模型本身的先验 ,它可以看作是整个模型空间上的似然函数,模型参数均被边际化。
注意这个 模型的贝叶斯定理 与原始贝叶斯定理之间的相似性。
两个实际模型比较的问题
在不计算证据P(D|M)的情况下对给定模型进行推理,但这不适用于模型比较。为了计算超级证据,必须能够指定所有可能的模型。
然而,如果只想比较两个可能的模型M1和M2,而不指定(或者甚至不知道)可能的模型集,就可以避开第二个问题。此处用优势比进行比较:
其中,超级证据P(D)在比率中抵消了。右边出现的模型证据 的比率被称为贝叶斯因子(Bayes factor):
举例说明
我们很容易忽视全局概率的计算,所以来看一个简单的例子:
讨论
研究此刻你所观察到的图像D在脑海中的两个模型:
M1:图像显示一张纸。
M2:图像显示两张纸。
这两种模式都是有可能的吗?给出一些为什么不可能是M2的理由。你的论点是否基于先验知识?
这两种模型当然都是可能的,因为尺子可能隐藏了这是并排的两张纸的事实。
然而,实际上不太可能是模型M2,因为:
这看起来像一张标准的(美国)纸,纸张尺寸作为论点会支持这种可能的结论。
退一步讲,如果有两张纸能像这样完美地排成一行,那一定是个惊人的巧合。
第一个论点是基于我们的先验知识,例如:
标准(美国)纸的比例是8.5到11。
大多数(美国)尺子的单位是英寸。
因此,上面的这种类型的论证出现在模型先验的比率中,即优势比为P(M1)/P(M2)。
然而,第二个论点是关于概率的陈述,不依赖于任何先验知识。相反,它出现在上面的贝叶斯因子中。如要了解这是内在机制,我们需要为每个模型定义参数。对于每一张纸,使用四个参数:
定义(x,y)在纸张的左上角,这可以是图像中的任何位置。
纸张的宽度w和高度h,范围覆盖整个图像的宽度和高度。
M1和M3 的可能性分别是四个和八个参数的积分:
对于M2,观察到的图像D的可能性将为零,除非第二张纸的参数表明它在标尺下完全对齐。因为M2参数范围只是整个图像中的一小部分,所以与P(D/M1)相比,P(D/M2)受到严重的惩罚,从而导致具有较大的Bayes因子。
这是奥卡姆剃刀[3]的一个例子:贝叶斯推理倾向于最简单的解释(模型),独立于任何先验知识。
案例分析:多少峰值?
采样方法(MCMC)从由一个因子定义的概率分布中抽取样本。然后,可以从这个分布中得到样本(仅使用未标准化的部分定义),并使用这些样本计算各种准时统计量,如均值和方差,甚至通过密度估计来求得近似分布,从而避免处理涉及后验的棘手计算。
根据采样方法定义如下函数:从两个高斯函数的混合中生成单个特征x的一些随机样本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | def generate_mix(n_total, frac1, mu1, mu2, sigma1, sigma2, seed=123, plot_range=(-1.5, 1.5)): gen = np.random.RandomState(seed=seed) # 将每个样本分配给其中一个峰值。 idx = scipy.stats.bernoulli.rvs(1 - frac1, size=n_total, random_state=gen) # 设置每个样本的高斯参数。 mu = np.array([mu1, mu2])[idx] sigma = np.array([sigma1, sigma2])[idx] # 生成每个样本。 X = scipy.stats.norm.rvs(mu, sigma, random_state=gen) # 可选的绘图. if plot_range: bins = np.linspace(*plot_range, 30) plt.hist(X, bins, histtype='stepfilled', alpha=0.5, density=True) plt.hist(X, bins, histtype='step', color='k', lw=1, density=True) grid = np.linspace(*plot_range, 201) if frac1 > 0: pdf1 = scipy.stats.norm.pdf(grid, mu1, sigma1) plt.plot(grid, frac1 * pdf1, lw=2) if frac1 < 1: pdf2 = scipy.stats.norm.pdf(grid, mu2, sigma2) plt.plot(grid, (1 - frac1) * pdf2, lw=2) plt.show() return X |
生成数据集
生成高斯参数均值为0、方差为0.5,且只有一个峰值的高斯分布。
1 2 | n_gen = 200 Da = generate_mix(n_gen, 1.0, 0.0, np.nan, 0.5, np.nan) |
生成第一高斯参数均值为-0.3、方差为0.1,第二高斯参数均值为0.3、方差为0.3,这样就得到具有两个峰值的高斯分布。
1 | Db = generate_mix(n_gen, 0.5, -0.3, 0.3, 0.1, 0.3) |
将上步的方差增大至0.4,其余参数不变,得到如下高斯分布图。
1 | Dc = generate_mix(n_gen, 0.5, -0.3, 0.3, 0.4, 0.4) |
注意,每个样本都有从每个高斯分布中提取的整数项,因此只在设置了均值情况下frac1才能真正的实现。
接下来通过比较两个模型来解释这些数据。
对于这三个数据集,预测M1相对于M2的Bayes系数是否为:
阅读剩余内容请下载完整版pdf文件:贝叶斯模型选择问题
评论0