尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

狄利克雷分布与过程:从有限先验到无限聚类的贝叶斯核心

狄利克雷分布与过程:从有限先验到无限聚类的贝叶斯核心 1. 项目概述从“分蛋糕”到“无限可能”的贝叶斯建模基石如果你在机器学习和贝叶斯统计的领域里摸爬滚打过一阵子大概率会碰到两个听起来很像、但内核截然不同的概念Dirichlet Distribution狄利克雷分布和 Dirichlet Process狄利克雷过程。我第一次接触它们时也犯过迷糊觉得不就是个“分布”和“过程”的区别吗直到在实际项目中用狄利克雷分布去建模一个文档的主题分布又用狄利克雷过程去处理一个用户画像中潜在兴趣簇的数量不确定问题才真正体会到这“一字之差”背后所蕴含的建模哲学与能力的巨大鸿沟。简单来说狄利克雷分布是一个定义在有限维单纯形上的概率分布它天然适合描述一组互斥事件的概率分布比如一个文档中各个主题的占比、一次多项抛硬币试验中各个面朝上的概率。而狄利克雷过程则是一个定义在无限维空间上的随机过程它是一个更基础的“分布之上的分布”核心能力是能自动决定一个数据集中“类别”或“组件”的数量是贝叶斯非参数方法中当之无愧的明星。理解它们不仅是掌握几个数学公式更是打开了处理不确定性、尤其是模型复杂度不确定性问题的一扇大门。无论是做主题模型LDA、聚类分析还是推荐系统中的用户分群这两个工具都提供了坚实而优雅的理论基础。接下来我们就抛开那些令人望而生畏的数学符号用最直白的语言和实际的场景把它们掰开揉碎了讲清楚。2. Dirichlet Distribution有限维的“概率分布之分布”2.1 核心思想如何描述“一组概率”的不确定性我们从一个最经典的例子开始一个骰子。一个公平的六面骰子每个面朝上的概率是1/6。这个概率向量(1/6, 1/6, 1/6, 1/6, 1/6, 1/6)是确定的。但在现实中我们往往面对的是不确定的概率。比如一个加工厂新生产了一批骰子由于工艺波动我们不知道这批骰子是否绝对均匀。我们只能通过抽检一部分骰子比如扔1000次某个骰子来推断这个骰子各个面真实的概率分布。那么在观察到数据之前我们对这个未知的概率向量应该有一个“先验”认知。这个先验认知就是用狄利克雷分布来描述的。狄利克雷分布是多项分布的共轭先验。这是它最重要的性质之一。共轭先验意味着如果数据的似然服从多项分布先验选用狄利克雷分布那么计算出的后验分布仍然是狄利克雷分布。这使得贝叶斯推断在数学上变得极其简便我们可以得到后验分布的解析解而不必依赖复杂的数值近似。它的概率密度函数PDF长这样对于一个K维的概率向量p (p1, p2, ..., pK)其中每个pi 0且所有pi之和为1其狄利克雷分布为Dir(p | α) (1 / B(α)) * ∏(i1 to K) pi^(αi - 1)。 这里的α (α1, α2, ..., αK)是一个正实数向量称为浓度参数。B(α)是多元Beta函数主要起归一化作用。2.2 参数α的直观理解从先验信念到后验更新参数α是理解狄利克雷分布的关键。你可以把α向量想象成我们投给每个类别的“伪计数”或“先验信念强度”。αi的大小决定了分布集中在pi较大值附近的强度。αi越大我们越“相信”第i个类别的概率应该比较大。在密度函数中αi出现在pi^(αi-1)的指数位置αi 1时会使得pi靠近1的区域概率密度增高0 αi 1时则会使得分布更倾向于让某些pi接近0即产生稀疏性。α0 sum(αi)称为总浓度参数。α0的大小衡量了我们先验信念的“强度”或“确定性”。α0很大时狄利克雷分布会非常集中在一个点附近方差小表示我们非常确信概率向量的值α0很小时分布会非常分散方差大覆盖单纯形上很大一片区域表示我们非常不确定。对称狄利克雷分布当所有αi都相等时即α (α/K, α/K, ..., α/K)我们称之为对称狄利克雷分布参数简化为一个标量α。这是最常用的形式。α1时狄利克雷分布退化为单纯形上的均匀分布表示我们对概率向量没有任何偏向的先验知识。实操心得在实际设置先验时如果你对各个类别没有特别的偏好通常会使用对称狄利克雷分布。α的取值需要谨慎如果你希望模型倾向于产生比较均匀的概率分布即各个类别概率相差不大就设置一个较大的α比如α10如果你希望模型能产生稀疏的概率分布即大部分概率集中在少数几个类别上就设置一个较小的α比如α0.1。在主题模型LDA中文档-主题分布和主题-词分布的先验通常都设为对称狄利克雷分布通过调参来控制主题的集中或分散程度。2.3 采样与可视化看看它长什么样理解一个分布最好的方式之一就是看看从它里面采样出来的样本。对于一个三维的对称狄利克雷分布Dir(α)我们可以采样很多个概率向量(p1, p2, p3)因为p1p2p31这些样本点实际上落在了一个二维的单纯形一个等边三角形上。我们可以把这个三角形画出来用点的密度来感受分布的形状。import numpy as np import matplotlib.pyplot as plt import matplotlib.tri as tri # 生成单纯形网格用于绘图 corners np.array([[0, 0], [1, 0], [0.5, np.sqrt(3)/2]]) triangle tri.Triangulation(corners[:, 0], corners[:, 1]) # 将重心坐标转换为直角坐标 def barycentric_to_cartesian(p): # p是三维向量和为1 return p[0] * corners[0] p[1] * corners[1] p[2] * corners[2] # 从Dirichlet分布采样 def sample_dirichlet(alpha, n_samples1000): # 使用Gamma分布采样再归一化 samples np.random.gamma(alpha, 1, (n_samples, len(alpha))) return samples / samples.sum(axis1, keepdimsTrue) # 设置不同的alpha参数 alphas [0.1, 1.0, 10.0] fig, axes plt.subplots(1, 3, figsize(15, 4)) for ax, alpha in zip(axes, alphas): samples sample_dirichlet([alpha]*3, 1000) cartesian_samples np.array([barycentric_to_cartesian(p) for p in samples]) ax.scatter(cartesian_samples[:, 0], cartesian_samples[:, 1], s5, alpha0.6) ax.set_title(fDir(α{alpha}, α{alpha}, α{alpha})) ax.set_aspect(equal) ax.axis(off) # 画出三角形边框 ax.triplot(triangle, k-, linewidth1) plt.tight_layout() plt.show()运行这段代码你会看到三张图α0.1采样点大量集中在三角形的三个顶点和三条边上。这意味着采样的概率向量极度稀疏大概率会出现某一个pi接近1其他两个接近0的情况。这对应着“赢者通吃”的信念。α1.0采样点均匀地散布在整个三角形内部。这就是均匀先验对任何概率组合都没有偏好。α10.0采样点紧密地聚集在三角形的中心(1/3, 1/3, 1/3)附近。这意味着我们强烈地相信这个骰子是均匀的。这个可视化非常直观地揭示了α参数如何控制分布的“形态”。2.4 实际应用场景举例主题建模LDA这是狄利克雷分布最著名的应用。在LDA中每个文档对应一个主题分布一个K维概率向量这个分布就是从狄利克雷分布Dir(α)中采样得到的。α控制了文档主题的集中程度。同样每个主题对应一个词分布一个V维概率向量它从另一个狄利克雷分布Dir(β)中采样得到β控制了主题内用词的集中程度。多项式混合模型假设我们有K个不同的多项分布例如K个不同的词袋模型每个数据点如一个短文本来自其中一个分布。数据点属于哪个分布的概率π (π1, ..., πK)就可以用一个狄利克雷分布作为先验。这是有限混合模型的基础。A/B测试中的先验在进行网页按钮颜色A/B/C的点击率测试时我们可以用狄利克雷分布来描述我们对三种颜色点击率概率向量的先验信念。随着实验进行收集到的点击数据多项分布似然会更新这个狄利克雷分布的后验参数从而得到点击率概率向量的后验分布用于决策。注意狄利克雷分布描述的是有限个类别的概率分布。类别数K必须事先指定。这是它的核心限制也是我们为什么需要狄利克雷过程的原因。3. Dirichlet Process无限维的“分布制造机”3.1 从有限到无限的哲学跨越现实世界中的很多聚类问题我们往往不知道到底有多少个类别簇。比如对社交媒体上的用户进行兴趣聚类你事先能说清楚有多少种兴趣类型吗10种100种还是1000种硬性指定一个K值要么会导致模型欠拟合K太小要么会导致过拟合和模型冗余K太大。狄利克雷过程就是为了解决这个问题而生的。它本质上是一个随机过程其样本轨迹是一个概率分布。更关键的是从这个过程中采样得到的概率分布是定义在一个无限维的空间上的。这意味着理论上它可以支持无限多个类别。在实际采样中由于数据量有限我们每次观察到的只是其中有限个类别但这个数量可以随着新数据的到来而增长。这就是“非参数”的含义——模型的参数在这里是类别数不是固定的而是可以随着数据量增加而灵活变化的。3.2 两种经典构造理解DP的基石理解狄利克雷过程有两种等价但视角不同的方式它们都极其重要。3.2.1 折棍构造这是最直观的理解方式。想象我们有一根长度为1的棍子它代表总的概率质量。我们第一次从Beta(1, α)分布中采样一个比例π1然后掰下棍子的前π1部分这第一部分就对应第一个类别的权重。剩下的棍子长度为1-π1。接着我们从剩下的棍子中再次按比例π2 ~ Beta(1, α)掰下一段作为第二个类别的权重。此时剩下的棍子长度为(1-π1)(1-π2)。重复这个过程无限次。这样我们得到了一个无限长的概率权重序列π (π1, π2, π3, ...)满足∑πi 1。这个序列就是从狄利克雷过程中采样得到的一个离散概率分布的权重。参数α在这里称为集中参数它控制着权重的衰减速度。α越小最初几根“棍子”会掰得比较大权重快速衰减分布趋向于稀疏集中在少数几个类别α越大每次掰下的比例都较小权重衰减慢分布趋向于均匀更多类别被分配到显著的概率质量。3.2.2 中国餐馆过程这是一个更富故事性的描述直接关联到数据点的聚类过程。想象一个拥有无限多张桌子的中国餐馆。第一位顾客走进来坐在第一张桌子。第n1位顾客走进来时他以nk / (α n)的概率选择坐在已经有nk个顾客的第k张桌子。他以α / (α n)的概率选择一张全新的、空着的桌子。这里n是前n位顾客的总数nk是第k张桌子当前的顾客数α还是集中参数。CRP完美地刻画了狄利克雷过程的“富者愈富”特性人多的桌子更容易吸引新顾客。同时α控制了开新桌的倾向。α越大新顾客越可能去开新桌即创建新类别。CRP的样本直接给出了数据点的划分哪个数据点属于哪个桌子/类别而不是显式的概率权重。这个划分就是从狄利克雷过程混合模型中采样得到的数据聚类结果。实操心得折棍构造让你理解DP生成的分布本身是什么样子一个无限维的离散分布而中国餐馆过程则让你理解数据点是如何根据这个分布被分配到潜在无限个类别中的。在推导和实现采样算法时两者会交替使用。对于初学者牢牢掌握CRP的流程就能对DP混合模型的聚类行为有一个非常扎实的直觉。3.3 形式化定义与基分布一个狄利克雷过程由两个参数定义DP(α, H)。α 0集中参数如前所述控制分布的离散程度。H基分布。这是一个定义在某个可测空间Θ上的概率分布。H可以看作是每个新类别新桌子其参数θ_k的来源。在CRP比喻中每当开一张新桌子我们就从H中独立地采样一个“菜谱”θ_k放到那张桌子上。所有顾客数据点根据他们桌子的菜谱来生成自己的观测值。所以从DP(α, H)采样得到的是一个离散分布G它形如G ∑_{k1}^{∞} π_k * δ_{θ_k}其中π_k来自折棍构造θ_k独立同分布于Hδ是狄拉克δ函数。这个G本身就是一个随机概率分布。当我们用它作为混合模型的组份分布时就得到了狄利克雷过程混合模型。3.4 狄利克雷过程混合模型实战解析让我们用一个高斯混合的例子把DP、CRP和数据生成串起来。假设我们要对一组一维数据进行聚类但不知道簇的数量。模型设定基分布H我们假设每个簇的中心μ_k来自一个高斯先验例如H N(0, σ_μ^2)。集中参数α设为某个值比如1.0。观测模型给定数据点i被分配到桌子z_i k其观测值x_i来自以该桌子参数μ_k为中心的高斯分布即x_i | z_ik, μ_k ~ N(μ_k, σ_x^2)。生成过程数据如何产生根据CRP(α)生成N个数据点的座位分配z_1, ..., z_N。这个过程决定了有多少个唯一的桌子类别K以及每个桌子上的顾客数。对于每一个出现的桌子k1...K从基分布H中采样一个均值参数μ_k ~ N(0, σ_μ^2)。对于每一个数据点i根据其座位z_i对应的参数μ_{z_i}生成观测数据x_i ~ N(μ_{z_i}, σ_x^2)。推断过程我们如何从数据反推 我们的目标是给定观测数据x {x_i}推断出潜在的分区z和每个类别的参数{μ_k}。这通常通过吉布斯采样等MCMC方法实现。对于数据点i的类别z_i其条件后验分布为P(z_i k | z_{-i}, x, α, H) ∝ P(z_i k | z_{-i}, α) * P(x_i | x_{-i}, z, μ_k)。第一部分P(z_i k | z_{-i}, α)就是CRP的规则与当前桌子k上的人数n_{k}^{-i}成正比或者以α的概率开新桌。第二部分P(x_i | x_{-i}, z, μ_k)是数据点i在给定当前分配和参数下的似然。对于新桌子我们需要对μ_{new}在基分布H下积分这通常可以解析计算得益于共轭性质。如果基分布H和似然模型是共轭的比如高斯-高斯那么第二部分积分有闭式解吉布斯采样会非常高效。这就是为什么在实际中我们经常选择共轭的基分布。一个简化的吉布斯采样步骤随机初始化所有数据点的类别分配z。对于每一个数据点i按随机顺序 a. 将其从当前类别中移除更新该类别人数。 b. 计算它分配到每一个现有类别k的概率p_k ∝ n_k * N(x_i; μ_k, σ_x^2)。其中n_k是类别k当前的人数N是高斯密度。 c. 计算它分配到一个新类别的概率p_{new} ∝ α * ∫ N(x_i; μ, σ_x^2) dH(μ)。这个积分在高斯共轭下是另一个高斯分布预测分布的密度。 d. 根据归一化后的概率(p_1, ..., p_K, p_{new})采样一个新的z_i。 e. 如果采样到了新类别则从该新类别的参数后验分布基于当前数据点x_i中采样一个新的μ_{new}。在所有数据点扫描一遍后根据当前分配z更新每个现有类别k的参数μ_k。其后验分布是结合了基分布先验H和分配到该类所有数据点的高斯似然也是一个高斯分布。重复步骤2-3多次直到分配稳定。注意在实际代码实现中我们通常不会显式地维护无限多个空类别。我们只维护当前数据分配中实际出现的类别以及一个代表“所有其他未出现类别总和”的项。计算新类别的概率时就是计算α * 预测分布密度。4. Dirichlet Distribution vs. Dirichlet Process核心差异与联系理解了各自的内涵后我们可以系统地对比这对“孪生兄弟”。特性Dirichlet DistributionDirichlet Process定义域有限维单纯形 (K维)无限维概率测度空间输出一个确定的概率向量(p1,...,pK)一个随机的概率分布G核心参数浓度参数向量α(长度K)集中参数α和基分布H共轭性多项分布的共轭先验在特定条件下如DP混合模型具有计算上的便利性但严格来说其样本空间是分布共轭性定义不同类别数固定且已知(K)不确定且潜在无限数据驱动决定主要应用描述有限个互斥类别的概率不确定性 (如LDA中的主题分布)非参数贝叶斯建模聚类类别数未知密度估计主题模型HDP直观比喻给一个已知有K种口味的糖果袋分配每种口味糖果的比例。一个拥有无限多种潜在口味糖果的“魔法糖果机”每次抓一把抓出的口味种类和数量由过程决定。稀疏性控制通过设置小的αi实现向量内的稀疏某些分量接近0通过设置小的α实现分布层面的稀疏集中在少数几个原子类别上联系 狄利克雷过程可以看作是狄利克雷分布在维度趋向于无穷时的极限。更具体地说如果我们对一个有限维的单纯形进行越来越细的划分在这个划分上的狄利克雷分布当维度趋于无穷时在某种意义下会收敛到狄利克雷过程。这也是其名称的由来。此外狄利克雷过程的任意有限维边际分布是狄利克雷分布。也就是说如果你从DP(α,H) 采样得到一个分布G然后对可测空间Θ做任意一个有限划分(A1, A2, ..., AK)那么向量(G(A1), G(A2), ..., G(AK))就服从一个K维的狄利克雷分布Dir(α*H(A1), ..., α*H(AK))。这个性质是DP许多理论推导和实际采样算法的基础。5. 高级话题与常见问题排查5.1 分层狄利克雷过程HDP是DP的一个重要扩展用于解决多个相关的DP混合模型共享类别的问题。经典应用是主题模型。在LDA中所有文档共享同一个主题集合词分布但每个文档的主题比例狄利克雷分布是独立采样的。在HDP中我们为每个文档j引入一个文档特定的分布G_j它从一个文档层面的DP采样得到G_j ~ DP(α, G_0)。而全局的基分布G_0本身又是一个DPG_0 ~ DP(γ, H)。这样G_0是一个全局的离散分布包含了所有可能的主题而每个G_j都以G_0为基分布因此它们共享了G_0中的原子主题但权重不同。这就实现了跨文档共享主题库同时允许每个文档有自己独特的主题比例。HDP-LDA相比LDA的优点是主题数K不需要预先指定。5.2 采样算法选择与实现难点实现DP混合模型吉布斯采样是最常用的方法尤其是基于中国餐馆过程的折棍表示。但有几个难点新组件参数采样当数据点被分配到新类别时需要从基分布H的后验预测分布中采样新参数θ_{new}。这要求H与似然函数共轭否则积分难求需要引入额外的辅助变量或使用近似方法。标签切换问题在MCMC采样中类别的标签索引可能会互换导致后验样本难以直接平均。这不是DP独有的问题但在DP中由于类别数可变问题更复杂。通常我们更关心划分哪个点属于同一类而不是具体标签。收敛诊断由于状态空间复杂包含划分和参数判断MCMC链是否收敛比较困难。除了观察似然值、类别数等标量的轨迹图还可以运行多条链检查划分的一致性如通过调整兰德指数。计算效率每次迭代需要为每个数据点计算分配到所有现有类别和新类别的概率。当数据量大或迭代次数多时计算量可观。有一些加速技巧如使用“截断”的折棍表示如弱极限近似将无限维近似为一个大但有限的维数从而可以使用更高效的有限维推断算法。实操心得对于初学者建议先从共轭模型如高斯-高斯DP混合实现一个标准的CRP吉布斯采样器。这能帮你建立最核心的直觉。在计算新类别概率p_{new}时那个积分∫ p(x_i | θ) dH(θ)一定要推导清楚这是理解DP如何“自动”决定是否创建新类的关键一步。5.3 超参数α的选择与敏感性集中参数α对模型行为影响巨大。α的先验在实际中α通常也被赋予一个先验分布如Gamma分布并在采样过程中与其他变量一起更新。这增加了模型的灵活性。α的影响一个较小的α先验均值会促使模型倾向于使用更少的类别因为开新桌的概率α/(αn)很小。这在数据本身聚类结构明显时是好的。但如果数据本身是分散的过小的α会导致强迫聚类把本应分开的类合并。经验法则可以通过观察后验样本中类别数K的分布来调整α的先验。也可以运行多个不同α固定值的模型通过似然或预测指标如留一法交叉验证来选择。5.4 常见问题与排查模型始终只产生一个类这几乎总是因为α设置得太小。检查α的值尝试增大一个数量级例如从0.1调到1.0或10.0。同时检查基分布H的方差是否过大过大的方差可能导致新类别的预测分布过于分散使得p_{new}相对于现有类别的概率太小。模型产生过多的小类每个类只有1-2个点这通常是α设置过大或者数据似然模型如高斯噪声方差σ_x^2设置过小的信号。α过大使得开新桌太容易。σ_x^2过小使得数据点即使离现有类中心稍远似然就变得极低从而倾向于自立门户。尝试减小α或增大σ_x^2如果可调。MCMC链不混合聚类结果不稳定DP混合的后验空间是多峰的链可能被困在局部模式。可以尝试a) 使用更多的迭代次数和更长的退火阶段b) 使用分裂-合并类型的移动步骤帮助链跳出局部最优c) 运行多条链从不同的随机初始化开始比较结果。计算新类别概率时出现数值下溢计算p_{new} ∝ α * ∫ p(x_i|θ)dH(θ)时如果预测分布密度值非常小可能导致数值问题。通常在对数空间进行计算存储和比较对数概率。log(p_{new}) log(α) log_predictive_density。理解狄利克雷分布和狄利克雷过程是一个从“已知世界”到“未知世界”的思维升级。前者帮你优雅地处理有限选择中的不确定性后者则赋予你建模“未知的未知”的能力。在实际项目中我的体会是不要被其数学形式吓倒多从数据生成过程如CRP和实际采样的角度去思考很多概念会变得非常具体。先从一个小规模的共轭模型实现开始亲手调一调α参数看看聚类结果如何变化这种实践经验比读十篇理论文章都来得深刻。当你需要处理那些类别边界模糊、数量未知的数据时DP系列模型会是你工具箱里一件非常得力的武器。
返回列表