1. LDA主题模型详解

1.1 Beta/Dirichlet 分布的一个性质

如果 , 则

上式右边的积分对应到概率分布 ,对于这个分布,我们有

把上式带入的计算式,得到

(5)

这说明,对于Beta 分布的随机变量,其均值可以用来估计。Dirichlet 分布也有类似的结论,如果,同样可以证明

(6)

以上两个结论很重要,因为我们在后面的 LDA 数学推导中需要使用这个结论。

1.2 LDA-math-MCMC

吉布斯采样(Gibbs sampling)是统计学中用于马尔科夫蒙特卡洛(MCMC)的一种算法,用于在难以直接采样时从某一多变量概率分布中近似抽取样本序列。该序列可用于近似联合分布、部分变量的边缘分布或计算积分(如某一变量的期望值)。某些变量可能为已知变量,故对这些变量并不需要采样。

马氏链定理: 如果一个非周期马氏链具有转移概率矩阵,且它的任何两个状态是连通的,那么 存在且与无关,记 , 我们有

  1. 是方程 的唯一非负解

其中,

称为马氏链的平稳分布。

这个马氏链的收敛定理非常重要,所有的 MCMC(Markov Chain Monte Carlo) 方法都是以这个定理作为理论基础的。 定理的证明相对复杂,一般的随机过程课本中也不给证明,所以我们就不用纠结它的证明了,直接用这个定理的结论就好了。我们对这个定理的内容做一些解释说明:

  1. 该定理中马氏链的状态不要求有限,可以是有无穷多个的;

  2. 定理中的“非周期“这个概念我们不打算解释了,因为我们遇到的绝大多数马氏链都是非周期的;

  3. 两个状态是连通并非指 可以直接一步转移到(),而是指 可以通过有限的步转移到达()。马氏链的任何两个状态是连通的含义是指存在一个, 使得矩阵 中的任何一个元素的数值都大于零。

  4. 我们用 表示在马氏链上跳转第步后所处的状态,如果 存在,很容易证明以上定理的第二个结论。由于

    上式两边取极限就得到

从初始概率分布 出发,我们在马氏链上做状态转移,记的概率分布为, 则有

由马氏链收敛的定理, 概率分布将收敛到平稳分布 。假设到第步的时候马氏链收敛,则有

所以 都是同分布的随机变量,当然他们并不独立。如果我们从一个具体的初始状态 开始,沿着马氏链按照概率转移矩阵做跳转,那么我们得到一个转移序列 由于马氏链的收敛行为, 都将是平稳分布 的样本。

*** 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的随机变量序列是\(X\)。\(X\)中有状态(都是随机变量):\(x_1\),\(x_2\),\(x_3\)......,有限或者无限可列个。

用时间\(t\)表示\(X\)中的第几个状态,写作\(X_t\),\(X_t\)可以是\(x_1\),\(x_2\),\(x_3\)......中的任意一个,且遵循\(t\)时刻\(x\)的概率分布,每个时刻\(x\)的概率分布都是不同的。如,随机变量序列\(X\)={\(X_1\)=\(x_2\),\(X_2\)=\(x_1\),\(X_3\)=\(x_1\),\(X_4\)=\(x_3\),\(X_5\)=\(x_3\)},\(X_1\)的概率分布是\(π(x)\)注意大小写。

状态转移矩阵

状态转移阵\(P_{x_ix_j}\)其概率是从随机变量\(x_1\),\(x_2\),\(x_3\)......中相互转换的概率,而不是\(X_1\),\(X_2\),\(X_3\)......之间的转移概率。简写为\(P_{ij}\)。


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 由条件分布 定义。上式只是说明了一根坐标轴的情形,和二维情形类似,很容易验证对所有坐标轴都有类似的结论。所以维空间中对于概率分布 可以如下定义转移矩阵

  1. 如果当前状态为,马氏链转移的过程中,只能沿着坐标轴做转移。沿着 这根坐标轴做转移的时候,转移概率由条件概率 定义;
  2. 其它无法沿着单根坐标轴进行的跳转,转移概率都设置为 0。

于是我们可以把Gibbs Smapling 算法从采样二维的 推广到采样 维的

以上算法收敛后,得到的就是概率分布的样本,当然这些样本并不独立,但是我们此处要求的是采样得到的样本符合给定的概率分布,并不要求独立。同样的,在以上算法中,坐标轴轮换采样不是必须的,可以在坐标轴轮换中引入随机性,这时候转移矩阵 中任何两个点的转移概率中就会包含坐标轴选择的概率,而在通常的 Gibbs Sampling 算法中,坐标轴轮换是一个确定性的过程,也就是在给定时刻,在一根固定的坐标轴上转移的概率是1。

2. 所需工具库

3. python实现

python工具库:

3.1 初始化停止语料

3.2 读入语料数据


3.3 建立词典

3.4 LDA模型拟合推断

3.5 随机打印某10个文档的主题

4. 项目代码链接

https://gitee.com/JupiterLi/ldapython-project

LDA主题模型讲解及代码Python实现的更多相关文章

  1. LDA主题模型三连击-入门/理论/代码

    目录 概况 为什么需要 LDA是什么 LDA的应用 gensim应用 数学原理 预备知识 抽取模型 样本生成 代码编写 本文将从三个方面介绍LDA主题模型--整体概况.数学推导.动手实现. 关于LDA ...

  2. Gensim LDA主题模型实验

    本文利用gensim进行LDA主题模型实验,第一部分是基于前文的wiki语料,第二部分是基于Sogou新闻语料. 1. 基于wiki语料的LDA实验 上一文得到了wiki纯文本已分词语料 wiki.z ...

  3. Spark:聚类算法之LDA主题模型算法

    http://blog.csdn.net/pipisorry/article/details/52912179 Spark上实现LDA原理 LDA主题模型算法 [主题模型TopicModel:隐含狄利 ...

  4. 理解 LDA 主题模型

    前言 gamma函数 0 整体把握LDA 1 gamma函数 beta分布 1 beta分布 2 Beta-Binomial 共轭 3 共轭先验分布 4 从beta分布推广到Dirichlet 分布 ...

  5. 用scikit-learn学习LDA主题模型

    在LDA模型原理篇我们总结了LDA主题模型的原理,这里我们就从应用的角度来使用scikit-learn来学习LDA主题模型.除了scikit-learn,  还有spark MLlib和gensim库 ...

  6. R语言︱LDA主题模型——最优主题数选取(topicmodels)+LDAvis可视化(lda+LDAvis)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 笔者寄语:在自己学LDA主题模型时候,发现该模 ...

  7. 机器学习入门-文本特征-使用LDA主题模型构造标签 1.LatentDirichletAllocation(LDA用于构建主题模型) 2.LDA.components(输出各个词向量的权重值)

    函数说明 1.LDA(n_topics, max_iters, random_state)  用于构建LDA主题模型,将文本分成不同的主题 参数说明:n_topics 表示分为多少个主题, max_i ...

  8. 通俗理解LDA主题模型

    通俗理解LDA主题模型 0 前言 印象中,最開始听说"LDA"这个名词,是缘于rickjin在2013年3月写的一个LDA科普系列,叫LDA数学八卦,我当时一直想看来着,记得还打印 ...

  9. [综] Latent Dirichlet Allocation(LDA)主题模型算法

    多项分布 http://szjc.math168.com/book/ebookdetail.aspx?cateid=1&&sectionid=983 二项分布和多项分布 http:// ...

  10. R语言︱LDA主题模型——最优主题...

    R语言︱LDA主题模型——最优主题...:https://blog.csdn.net/sinat_26917383/article/details/51547298#comments

随机推荐

  1. substrate 编译出错unresolved import `sp_runtime::testing` failed to resolve: could not find `GenesisConfig` in `system`

    error[E0432]: unresolved import `sp_runtime::testing` --> /Users/suyinrong/bitcoin-proj/substrate ...

  2. 基于html2canva jspdf 实现前端页面加水印 并导出页面PDF

    基于html2canva jspdf 实现前端页面加水印 并导出页面PDF; 下载完整代码请访问uni-app插件市场地址:https://ext.dcloud.net.cn/plugin?id=12 ...

  3. R语言中的跨平台支持:如何在Windows、MacOS和Linux上使用R语言进行数据分析和可视化

    目录 当今数据科学领域,R语言已经成为了数据分析和可视化的流行工具.R语言具有强大的功能和灵活性,使得它可以在各种不同的平台上运行,包括Windows.MacOS和Linux.因此,本文将介绍R语言中 ...

  4. 精选8道ES高频面试题和答案,后悔没早点看。

    不要再干巴巴的背诵八股文了,一定要结合具体场景回答面试问题! 前言 我们在回答面试题的时候,不能干巴巴的去背八股文,一定要结合应用场景,最好能结合过去做过的项目,去和面试官沟通. 这些场景题虽然不要求 ...

  5. 【后端面经-Java】AQS详解

    目录 1. AQS是什么? 2. AQS核心思想 2.1 基本框架 2.1.1 资源state 2.1.2 CLH双向队列 2.2 AQS模板 3. 源码分析 3.1 acquire(int) 3.1 ...

  6. Unity UGUI的所有组件的介绍及使用

    Unity UGUI的所有组件的介绍及使用 本文将介绍Unity UGUI中的各个组件,包括它们的具体介绍.用途 1. Text(文本) 介绍:Text组件用于在UI界面上显示文本内容. 用途:常用于 ...

  7. python 将中文数字转换成阿拉伯数字

    日常遇到的中文数字主要有两种情况: 1."二零零一"这种类型,只包含[0-9]对应的十个中文字,需要转换成数字:2001.这种情况的转换十分简单. 2. "三百二十一&q ...

  8. OOP第三次大作业

    前言 前言的前言 快期末,也一直在等这次作业发布,我现在只能说终于等到了!!!跟上一个Blog的时间相隔比较大,内容也比较多,涉及范围也比较广7-11次小练习,废话不多说,直接开始吧.如果对我blog ...

  9. UE构建基础和实践:四、使用脚本打包

    序言 使用UE版本为UE5.20 在实际项目中,我们常常使用自动化脚本来进行构建,它可以增加我们的生产效率,并降低人为操作带来的失误风险. BuildGraph BuildGraph UE官方提供的构 ...

  10. 服务器衡量标准--RASUM

    对于一台服务器来讲,服务器的性能设计目标是如何平衡各部分的性能,使整个系统的性能达到最优.如果一台服务器有每秒处理1000个服务请求的能力,但网卡只能接受200个请求,而硬盘只能负担150个,而各种总 ...