LDA主题模型讲解及代码Python实现
1. LDA主题模型详解
-
你一定从未看过如此通俗易懂的马尔科夫链蒙特卡罗方法(MCMC)解读(上):https://zhuanlan.zhihu.com/p/250146007
-
Metropolis 采样算法:https://blog.csdn.net/jingjishisi/article/details/79291258
1.1 Beta/Dirichlet 分布的一个性质
如果 , 则
上式右边的积分对应到概率分布 ,对于这个分布,我们有
把上式带入的计算式,得到
(5)
这说明,对于Beta 分布的随机变量,其均值可以用来估计。Dirichlet 分布也有类似的结论,如果
,同样可以证明
(6)
以上两个结论很重要,因为我们在后面的 LDA 数学推导中需要使用这个结论。
1.2 LDA-math-MCMC
吉布斯采样(Gibbs sampling)是统计学中用于马尔科夫蒙特卡洛(MCMC)的一种算法,用于在难以直接采样时从某一多变量概率分布中近似抽取样本序列。该序列可用于近似联合分布、部分变量的边缘分布或计算积分(如某一变量的期望值)。某些变量可能为已知变量,故对这些变量并不需要采样。
马氏链定理: 如果一个非周期马氏链具有转移概率矩阵,且它的任何两个状态是连通的,那么
存在且与
无关,记
, 我们有
是方程
的唯一非负解
其中,
称为马氏链的平稳分布。
这个马氏链的收敛定理非常重要,所有的 MCMC(Markov Chain Monte Carlo) 方法都是以这个定理作为理论基础的。 定理的证明相对复杂,一般的随机过程课本中也不给证明,所以我们就不用纠结它的证明了,直接用这个定理的结论就好了。我们对这个定理的内容做一些解释说明:
-
该定理中马氏链的状态不要求有限,可以是有无穷多个的;
-
定理中的“非周期“这个概念我们不打算解释了,因为我们遇到的绝大多数马氏链都是非周期的;
-
两个状态
是连通并非指
可以直接一步转移到
(
),而是指
可以通过有限的
步转移到达
(
)。马氏链的任何两个状态是连通的含义是指存在一个
, 使得矩阵
中的任何一个元素的数值都大于零。
-
我们用
表示在马氏链上跳转第
步后所处的状态,如果
存在,很容易证明以上定理的第二个结论。由于
上式两边取极限就得到
从初始概率分布 出发,我们在马氏链上做状态转移,记
的概率分布为
, 则有
由马氏链收敛的定理, 概率分布将收敛到平稳分布
。假设到第
步的时候马氏链收敛,则有
所以 都是同分布的随机变量,当然他们并不独立。如果我们从一个具体的初始状态
开始,沿着马氏链按照概率转移矩阵做跳转,那么我们得到一个转移序列
由于马氏链的收敛行为,
都将是平稳分布
的样本。
*** Markov Chain Monte Carlo***
对于给定的概率分布,我们希望能有便捷的方式生成它对应的样本。由于马氏链能收敛到平稳分布, 于是一个很的漂亮想法是:如果我们能构造一个转移矩阵为
的马氏链,使得该马氏链的平稳分布恰好是
, 那么我们从任何一个初始状态
出发沿着马氏链转移, 得到一个转移序列
, 如果马氏链在第
步已经收敛了,于是我们就得到了
的样本
。
这个绝妙的想法在1953年被 Metropolis想到了,为了研究粒子系统的平稳性质, Metropolis 考虑了物理学中常见的波尔兹曼分布的采样问题,首次提出了基于马氏链的蒙特卡罗方法,即Metropolis算法,并在最早的计算机上编程实现。Metropolis 算法是首个普适的采样方法,并启发了一系列 MCMC方法,所以人们把它视为随机模拟技术腾飞的起点。 Metropolis的这篇论文被收录在《统计学中的重大突破》中, Metropolis算法也被遴选为二十世纪的十个最重要的算法之一。
我们接下来介绍的MCMC 算法是 Metropolis 算法的一个改进变种,即常用的 Metropolis-Hastings 算法。由上一节的例子和定理我们看到了,马氏链的收敛性质主要由转移矩阵决定, 所以基于马氏链做采样的关键问题是如何构造转移矩阵
,使得平稳分布恰好是我们要的分布
。如何能做到这一点呢?我们主要使用如下的定理。
定理:[细致平稳条件] 如果非周期马氏链的转移矩阵和分布
满足
(1)
则 是马氏链的平稳分布,上式被称为细致平稳条件(detailed balance condition)。
其实这个定理是显而易见的,因为细致平稳条件的物理含义就是对于任何两个状态, 从
转移出去到
而丢失的概率质量,恰好会被从
转移回
的概率质量补充回来,所以状态
上的概率质量
是稳定的,从而
是马氏链的平稳分布。数学上的证明也很简单,由细致平稳条件可得
由于 是方程
的解,所以
是平稳分布。
假设我们已经有一个转移矩阵为马氏链(
表示从状态
转移到状态
的概率,也可以写为
或者
), 显然,通常情况下
也就是细致平稳条件不成立,所以 不太可能是这个马氏链的平稳分布。我们可否对马氏链做一个改造,使得细致平稳条件成立呢?譬如,我们引入一个
, 我们希望
(2)
取什么样的 以上等式能成立呢?最简单的,按照对称性,我们可以取
于是(*)式就成立了。所以有
(3)
于是我们把原来具有转移矩阵的一个很普通的马氏链,改造为了具有转移矩阵
的马氏链,而
恰好满足细致平稳条件,由此马氏链
的平稳分布就是
!
在改造 的过程中引入的
称为接受率,物理意义可以理解为在原来的马氏链上,从状态
以
的概率转跳转到状态
的时候,我们以
的概率接受这个转移,于是得到新的马氏链
的转移概率为
。
马氏链转移和接受概率
假设我们已经有一个转移矩阵Q(对应元素为), 把以上的过程整理一下,我们就得到了如下的用于采样概率分布
的算法。
上述过程中 说的都是离散的情形,事实上即便这两个分布是连续的,以上算法仍然是有效,于是就得到更一般的连续概率分布
的采样算法,而
就是任意一个连续二元概率分布对应的条件分布。
以上的 MCMC 采样算法已经能很漂亮的工作了,不过它有一个小的问题:马氏链在转移的过程中的接受率
可能偏小,这样采样过程中马氏链容易原地踏步,拒绝大量的跳转,这使得马氏链遍历所有的状态空间要花费太长的时间,收敛到平稳分布
的速度太慢。有没有办法提升一些接受率呢?
假设 , 此时满足细致平稳条件,于是
上式两边扩大5倍,我们改写为
看,我们提高了接受率,而细致平稳条件并没有打破!这启发我们可以把细致平稳条件(**) 式中的 同比例放大,使得两数中最大的一个放大到1,这样我们就提高了采样中的跳转接受率。所以我们可以取
于是,经过对上述MCMC 采样算法中接受率的微小改造,我们就得到了如下教科书中最常见的 Metropolis-Hastings 算法。
对于分布 ,我们构造转移矩阵
使其满足细致平稳条件
此处 并不要求是一维的,对于高维空间的
,如果满足细致平稳条件
那么以上的 Metropolis-Hastings 算法一样有效。
1.2.1 ✨重要理解✨
马氏链:
MCMC的随机变量序列是。中有状态(都是随机变量):,,......,有限或者无限可列个。
用时间表示中的第几个状态,写作,可以是,,......中的任意一个,且遵循时刻的概率分布,每个时刻的概率分布都是不同的。如,随机变量序列={=,=,=,=,=},的概率分布是注意大小写。
状态转移矩阵:
状态转移阵其概率是从随机变量,,......中相互转换的概率,而不是,,......之间的转移概率。简写为。
1.3 Gibbs Sampling
对于高维的情形,由于接受率 的存在(通常
), 以上 Metropolis-Hastings 算法的效率不够高。能否找到一个转移矩阵Q使得接受率
呢?我们先看看二维的情形,假设有一个概率分布
, 考察
坐标相同的两个点
,我们发现
所以得到
(4)
即
基于以上等式,我们发现,在 这条平行于
轴的直线上,如果使用条件分布
做为任何两个点之间的转移概率,那么任何两个点之间的转移满足细致平稳条件。同样的,如果我们在
这条直线上任意取两个点
,也有如下等式
平面上马氏链转移矩阵的构造
于是我们可以如下构造平面上任意两点之间的转移概率矩阵Q
有了如上的转移矩阵 Q, 我们很容易验证对平面上任意两点 , 满足细致平稳条件
于是这个二维空间上的马氏链将收敛到平稳分布 。而这个算法就称为 Gibbs Sampling 算法,是 Stuart Geman 和Donald Geman 这两兄弟于1984年提出来的,之所以叫做Gibbs Sampling 是因为他们研究了Gibbs random field, 这个算法在现代贝叶斯分析中占据重要位置。
二维Gibbs Sampling 算法中的马氏链转移
以上采样过程中,如图所示,马氏链的转移只是轮换的沿着坐标轴 轴和
轴做转移,于是得到样本
马氏链收敛后,最终得到的样本就是
的样本,而收敛之前的阶段称为 burn-in period。额外说明一下,我们看到教科书上的 Gibbs Sampling 算法大都是坐标轴轮换采样的,但是这其实是不强制要求的。最一般的情形可以是,在
时刻,可以在
轴和
轴之间随机的选一个坐标轴,然后按条件概率做转移,马氏链也是一样收敛的。轮换两个坐标轴只是一种方便的形式。
以上的过程我们很容易推广到高维的情形,对于(***) 式,如果 变为多维情形
,可以看出推导过程不变,所以细致平稳条件同样是成立的
(5)
此时转移矩阵 Q 由条件分布 定义。上式只是说明了一根坐标轴的情形,和二维情形类似,很容易验证对所有坐标轴都有类似的结论。所以
维空间中对于概率分布
可以如下定义转移矩阵
- 如果当前状态为
,马氏链转移的过程中,只能沿着坐标轴做转移。沿着
这根坐标轴做转移的时候,转移概率由条件概率
定义;
- 其它无法沿着单根坐标轴进行的跳转,转移概率都设置为 0。
于是我们可以把Gibbs Smapling 算法从采样二维的 推广到采样
维的
以上算法收敛后,得到的就是概率分布的样本,当然这些样本并不独立,但是我们此处要求的是采样得到的样本符合给定的概率分布,并不要求独立。同样的,在以上算法中,坐标轴轮换采样不是必须的,可以在坐标轴轮换中引入随机性,这时候转移矩阵
中任何两个点的转移概率中就会包含坐标轴选择的概率,而在通常的 Gibbs Sampling 算法中,坐标轴轮换是一个确定性的过程,也就是在给定时刻
,在一根固定的坐标轴上转移的概率是1。
2. 所需工具库
3. python实现
python工具库:
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期