文本主题模型之LDA(一) LDA基础

简介:

1. LDA贝叶斯模型

    LDA是基于贝叶斯模型的,涉及到贝叶斯模型离不开“先验分布”,“数据(似然)”和"后验分布"三块。在朴素贝叶斯算法原理小结中我们也已经讲到了这套贝叶斯理论。在贝叶斯学派这里:

先验分布 + 数据(似然)= 后验分布

    这点其实很好理解,因为这符合我们人的思维方式,比如你对好人和坏人的认知,先验分布为:100个好人和100个的坏人,即你认为好人坏人各占一半,现在你被2个好人(数据)帮助了和1个坏人骗了,于是你得到了新的后验分布为:102个好人和101个的坏人。现在你的后验分布里面认为好人比坏人多了。这个后验分布接着又变成你的新的先验分布,当你被1个好人(数据)帮助了和3个坏人(数据)骗了后,你又更新了你的后验分布为:103个好人和104个的坏人。依次继续更新下去。

2. 二项分布与Beta分布

    对于上一节的贝叶斯模型和认知过程,假如用数学和概率的方式该如何表达呢?

    对于我们的数据(似然),这个好办,用一个二项分布就可以搞定,即对于二项分布:

B i n o m ( k | n , p ) = ( n k ) p k ( 1 p ) n k

    其中p我们可以理解为好人的概率,k为好人的个数,n为好人坏人的总数。

    虽然数据(似然)很好理解,但是对于先验分布,我们就要费一番脑筋了,为什么呢?因为我们希望这个先验分布和数据(似然)对应的二项分布集合后,得到的后验分布在后面还可以作为先验分布!就像上面例子里的“102个好人和101个的坏人”,它是前面一次贝叶斯推荐的后验分布,又是后一次贝叶斯推荐的先验分布。也即是说,我们希望先验分布和后验分布的形式应该是一样的,这样的分布我们一般叫共轭分布。在我们的例子里,我们希望找到和二项分布共轭的分布。

    和二项分布共轭的分布其实就是Beta分布。Beta分布的表达式为:

B e t a ( p | α , β ) = Γ ( α + β ) Γ ( α ) Γ ( β ) p α 1 ( 1 p ) β 1

    其中 Γ 是Gamma函数,满足 Γ ( x ) = ( x 1 ) !

    仔细观察Beta分布和二项分布,可以发现两者的密度函数很相似,区别仅仅在前面的归一化的阶乘项。那么它如何做到先验分布和后验分布的形式一样呢?后验分布 P ( p | n , k , α , β ) 推导如下:

(1) P ( p | n , k , α , β ) P ( k | n , p ) P ( p | α , β ) (2) = P ( k | n , p ) P ( p | α , β ) (3) = B i n o m ( k | n , p ) B e t a ( p | α , β ) (4) = ( n k ) p k ( 1 p ) n k × Γ ( α + β ) Γ ( α ) Γ ( β ) p α 1 ( 1 p ) β 1 (5) p k + α 1 ( 1 p ) n k + β 1  

    将上面最后的式子归一化以后,得到我们的后验概率为:

P ( p | n , k , α , β ) = Γ ( α + β + n ) Γ ( α + k ) Γ ( β + n k ) p k + α 1 ( 1 p ) n k + β 1

    可见我们的后验分布的确是Beta分布,而且我们发现:

B e t a ( p | α , β ) + B i n o m C o u n t ( k , n k ) = B e t a ( p | α + k , β + n k )

    这个式子完全符合我们在上一节好人坏人例子里的情况,我们的认知会把数据里的好人坏人数分别加到我们的先验分布上,得到后验分布。 

    我们在来看看Beta分布 B e t a ( p | α , β ) 的期望:

(6) E ( B e t a ( p | α , β ) ) = 0 1 t B e t a ( p | α , β ) d t (7) = 0 1 t Γ ( α + β ) Γ ( α ) Γ ( β ) t α 1 ( 1 t ) β 1 d t (8) = 0 1 Γ ( α + β ) Γ ( α ) Γ ( β ) t α ( 1 t ) β 1 d t

    由于上式最右边的乘积对应Beta分布 B e t a ( p | α + 1 , β ) ,因此有:

0 1 Γ ( α + β + 1 ) Γ ( α + 1 ) Γ ( β ) p α ( 1 p ) β 1 = 1

    这样我们的期望可以表达为:

E ( B e t a ( p | α , β ) ) = Γ ( α + β ) Γ ( α ) Γ ( β ) Γ ( α + 1 ) Γ ( β ) Γ ( α + β + 1 ) = α α + β

    这个结果也很符合我们的思维方式。

3. 多项分布与Dirichlet 分布

    现在我们回到上面好人坏人的问题,假如我们发现有第三类人,不好不坏的人,这时候我们如何用贝叶斯来表达这个模型分布呢?之前我们是二维分布,现在是三维分布。由于二维我们使用了Beta分布和二项分布来表达这个模型,则在三维时,以此类推,我们可以用三维的Beta分布来表达先验后验分布,三项的多项分布来表达数据(似然)。

    三项的多项分布好表达,我们假设数据中的第一类有 m 1 个好人,第二类有 m 2 个坏人,第三类为 m 3 = n m 1 m 2 个不好不坏的人,对应的概率分别为 p 1 , p 2 , p 3 = 1 p 1 p 2 ,则对应的多项分布为:

m u l t i ( m 1 , m 2 , m 3 | n , p 1 , p 2 , p 3 ) = n ! m 1 ! m 2 ! m 3 ! p 1 m 1 p 2 m 2 p 3 m 3

    那三维的Beta分布呢?超过二维的Beta分布我们一般称之为狄利克雷(以下称为Dirichlet )分布。也可以说Beta分布是Dirichlet 分布在二维时的特殊形式。从二维的Beta分布表达式,我们很容易写出三维的Dirichlet分布如下:

D i r i c h l e t ( p 1 , p 2 , p 3 | α 1 , α 2 , α 3 ) = Γ ( α 1 + α 2 + α 3 ) Γ ( α 1 ) Γ ( α 2 ) Γ ( α 3 ) p 1 α 1 1 ( p 2 ) α 2 1 ( p 3 ) α 3 1

    同样的方法,我们可以写出4维,5维,。。。以及更高维的Dirichlet 分布的概率密度函数。为了简化表达式,我们用向量来表示概率和计数,这样多项分布可以表示为: D i r i c h l e t ( p | α ) ,而多项分布可以表示为: m u l t i ( m | n , p )

    一般意义上的K维Dirichlet 分布表达式为:

D i r i c h l e t ( p | α ) = Γ ( k = 1 K α k ) k = 1 K Γ ( α k ) k = 1 K p k α k 1

    而多项分布和Dirichlet 分布也满足共轭关系,这样我们可以得到和上一节类似的结论:

D i r i c h l e t ( p | α ) + M u l t i C o u n t ( m ) = D i r i c h l e t ( p | α + m )

    对于Dirichlet 分布的期望,也有和Beta分布类似的性质:

E ( D i r i c h l e t ( p | α ) ) = ( α 1 k = 1 K α k , α 2 k = 1 K α k , . . . , α K k = 1 K α k )

4. LDA主题模型

    前面做了这么多的铺垫,我们终于可以开始LDA主题模型了。

    我们的问题是这样的,我们有 M 篇文档,对应第d个文档中有有 N d 个词。即输入为如下图:

    我们的目标是找到每一篇文档的主题分布和每一个主题中词的分布。在LDA模型中,我们需要先假定一个主题数目 K ,这样所有的分布就都基于 K 个主题展开。那么具体LDA模型是怎么样的呢?具体如下图:

    LDA假设文档主题的先验分布是Dirichlet分布,即对于任一文档 d , 其主题分布 θ d 为:

θ d = D i r i c h l e t ( α )

    其中, α 为分布的超参数,是一个 K 维向量。

    LDA假设主题中词的先验分布是Dirichlet分布,即对于任一主题 k , 其词分布 β k 为:

β k = D i r i c h l e t ( η )

    其中, η 为分布的超参数,是一个 V 维向量。 V 代表词汇表里所有词的个数。

    对于数据中任一一篇文档 d 中的第 n 个词,我们可以从主题分布 θ d 中得到它的主题编号 z d n 的分布为:

z d n = m u l t i ( θ d )

    而对于该主题编号,得到我们看到的词 w d n 的概率分布为: 

w d n = m u l t i ( β z d n )

    理解LDA主题模型的主要任务就是理解上面的这个模型。这个模型里,我们有 M 个文档主题的Dirichlet分布,而对应的数据有 M 个主题编号的多项分布,这样( α θ d z d )就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的文档主题后验分布。

    如果在第d个文档中,第k个主题的词的个数为: n d ( k ) , 则对应的多项分布的计数可以表示为

n d = ( n d ( 1 ) , n d ( 2 ) , . . . n d ( K ) )

    利用Dirichlet-multi共轭,得到 θ d 的后验分布为:

D i r i c h l e t ( θ d | α + n d )

    同样的道理,对于主题与词的分布,我们有 K 个主题与词的Dirichlet分布,而对应的数据有 K 个主题编号的多项分布,这样( η β k w ( k ) )就组成了Dirichlet-multi共轭,可以使用前面提到的贝叶斯推断的方法得到基于Dirichlet分布的主题词的后验分布。

    如果在第k个主题中,第v个词的个数为: n k ( v ) , 则对应的多项分布的计数可以表示为

n k = ( n k ( 1 ) , n k ( 2 ) , . . . n k ( V ) )

    利用Dirichlet-multi共轭,得到 β k 的后验分布为:

D i r i c h l e t ( β k | η + n k )

    由于主题产生词不依赖具体某一个文档,因此文档主题分布和主题词分布是独立的。理解了上面这 M + K 组Dirichlet-multi共轭,就理解了LDA的基本原理了。

    现在的问题是,基于这个LDA模型如何求解我们想要的每一篇文档的主题分布和每一个主题中词的分布呢?

    一般有两种方法,第一种是基于Gibbs采样算法求解,第二种是基于变分推断EM算法求解。

    如果你只是想理解基本的LDA模型,到这里就可以了,如果想理解LDA模型的求解,可以继续关注系列里的另外两篇文章。


本文转自刘建平Pinard博客园博客,原文链接:http://www.cnblogs.com/pinard/p/6831308.html,如需转载请自行联系原作者

相关文章
|
安全 网络安全
现代化企业网络安全架构设计与实践
随着企业信息化程度的提升,网络安全问题日益凸显。本文从企业网络安全架构设计与实践的角度出发,探讨了现代化企业网络安全的重要性、设计原则和实施方法,并结合具体案例进行分析,为企业构建健壮的网络安全体系提供了参考和指导。
|
开发工具 git
git clone TimeOut 无法下载 git 设置代理
git clone TimeOut 无法下载 git 设置代理
348 0
|
机器学习/深度学习 算法 PyTorch
论文阅读笔记 | 目标检测算法——DETR
论文阅读笔记 | 目标检测算法——DETR
1449 0
论文阅读笔记 | 目标检测算法——DETR
|
vr&ar 图形学 API
Unity与VR控制器交互全解:从基础配置到力反馈应用,多角度提升虚拟现实游戏的真实感与沉浸体验大揭秘
【8月更文挑战第31天】虚拟现实(VR)技术迅猛发展,Unity作为主流游戏开发引擎,支持多种VR硬件并提供丰富的API,尤其在VR控制器交互设计上具备高度灵活性。本文详细介绍了如何在Unity中配置VR支持、设置控制器、实现按钮交互及力反馈,结合碰撞检测和物理引擎提升真实感,助力开发者创造沉浸式体验。
796 1
|
XML Java 数据库连接
【MySQL用法】MyBatis 多对多 中间表插入数据,添加记录后获取主键ID
【MySQL用法】MyBatis 多对多 中间表插入数据,添加记录后获取主键ID
462 0
|
算法 搜索推荐 数据挖掘
数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(续)
数据挖掘实战 —— 抖音用户浏览行为数据分析与挖掘(续)
1019 1
|
机器学习/深度学习 人工智能 搜索推荐
使用PyTorch实现混合专家(MoE)模型
在本文中,我将使用Pytorch来实现一个MoE模型。在具体代码之前,让我们先简单介绍一下混合专家的体系结构。
1179 1
|
监控 BI Sentinel
深入理解Sentinel系列-2.Sentinel原理及核心源码分析(下)
深入理解Sentinel系列-2.Sentinel原理及核心源码分析
283 0
|
Oracle Java 关系型数据库
CentOS 7 - 安装Oracle JDK8
我们要在CentOS安装最新版本的JDK8,需要首先将JDK下载到服务器,然后通过操作系统自带的工具yum进行安装。 本文我们将介绍CentOS 7下JDK8的安装。
4314 0
|
编译器 Python
Jupyter notebook安装教程
Jupyter Notebook 是以网页的形式打开,可以在网页页面中直接编写代码和运行代码,代码的运行结果也会直接在代码块下显示的程序。如在编程过程中需要编写说明文档,可在同一个页面中直接编写,便于作及时的说明和解释。
617 2