LDA是一种典型的词袋模型,即它认为一篇文档是由一组词构成的一个集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中每一个词都由其中的一个主题生成。

它是一种主题模型,它可以将文档集中每篇文档的主题按照概率分布的形式给出;

同时是一种无监督学习算法,在训练时不需要手工标注的训练集,需要的仅仅是文档集以及指定主题的数量k即可;

此外LDA的另一个优点则是,对于每一个主题均可找出一些词语来描述它;

LDA可以被认为是一种聚类算法:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布

[LDA automatically assigns topics to text documents]

在我们开始了解LDA模型算法之前,我们先要了解我们的一篇文章往往是如何生成的

LDA生成模型

我们可能会认为作者先确定这篇文章的几个主题,然后围绕这几个主题遣词造句,表达成文。

因此正如LDA‎贝叶斯网络结构中所描述的,在LDA模型中一篇文档生成的方式如下:

  • 从狄利克雷分布中取样生成文档i的主题分布      …………………………..通过α得到文档i的主题分布
  • 从主题的多项式分布中取样生成文档i第j个词的主题……………………..从主题分布中得到词的主题
  • 从狄利克雷分布中取样生成主题的词语分布…………………………….得到该主题的词分布
  • 从词语的多项式分布中采样最终生成词语…………………………………根据上述的词分布得到词(因为是词袋模型,因此不在乎上下文)

LDA模型参数求解概述

因此整个模型中所有可见变量以及隐藏变量的联合分布是

(这里i表示第i个文档)最终一篇文档的单词分布的最大似然估计可以通过将上式的

以及

进行积分和对

进行求和得到

根据

的最大似然估计,最终可以通过吉布斯采样等方法估计出模型中的参数。

LDA的参数估计(吉布斯采样)

Gibbs Sampling,具体过程如下:

  • 首先对所有文档中的所有词遍历一遍,为其都随机分配一个主题,即zm,n=k~Mult(1/K),其中m表示第m篇文档,n表示文档中的第n个词,k表示主题,K表示主题的总数,之后将对应的n(k)m+1, nm+1, n(t)k+1, nk+1, 他们分别表示在m文档中k主题出现的次数,m文档中主题数量的和??(可重复的,所以应该就是文档中词的个数,不变的量)??,k主题对应的t词的次数,k主题对应的总词数(n(k)m等等初始化为0)。
  • 之后对下述操作进行重复迭代。
  • 对所有文档中的所有词进行遍历,假如当前文档m的词t对应主题为k,则n(k)m-1, nm-1, n(t)k-1, nk-1, 即先拿出当前词,之后根据LDA中topic sample的概率分布采样出新主题,在对应的n(k)m, nm, n(t)k, nk上分别+1。
  •   ∝ (topic sample的概率分布)…………….根据该词的该主题出现的次数以及该文档该主题的的次数
  • 迭代完成后输出主题-词参数矩阵φ和文档-主题矩阵θ
  •         主题k中词t的概率分布

        文档m中主题k的概率分布

从这里看出,gibbs采样方法求解lda最重要的是条件概率p(zi | z-i,w)的计算上。

[http://zh.wikipedia.org/wiki/隐含狄利克雷分布]

LDA中的数学概念

主题模型LDA文档生成模式

从LDA与pLSA的区别和联系角度出发

LDA就是在pLSA的基础上加层贝叶斯框架。pLSA样本随机,参数虽未知但固定,属于频率派思想;而LDA样本固定,参数未知但不固定,是个随机变量,服从一定的分布,LDA属于贝叶斯派思想。

pLSA与LDA生成文档方式的对比

pLSA模型按照如下的步骤生成“文档-词项”:

  • 按照概率选择一篇文档
  • 选定文档后,确定文章的主题分布
  • 从主题分布中按照概率选择一个隐含的主题类别
  • 选定后,确定主题下的词分布
  • 从词分布中按照概率选择一个词
  •     LDA模型中一篇文档生成的方式:
  • 按照先验概率选择一篇文档
  • 从狄利克雷分布中取样生成文档的主题分布,换言之,主题分布由超参数为的Dirichlet分布生成
  • 从主题的多项式分布中取样生成文档第 j 个词的主题
  • 从狄利克雷分布(即Dirichlet分布)中取样生成主题对应的词语分布,换言之,词语分布由参数为的Dirichlet分布生成
  • 从词语的多项式分布中采样最终生成词语


                                                   [沈博PPT]

从上面两个过程可以看出,LDA在PLSA的基础上,为主题分布和词分布分别加了两个Dirichlet先验(也就是主题分布的分布和词分布的分布)。

pLSA与LDA的概率图对比

pLSA跟LDA生成文档的不同过程,左图是pLSA,右图是LDA(右图不太规范,z跟w都得是小写):


python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_02

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_03

LDA概率图:

    对应到上面右图的LDA,只有W / w是观察到的变量,其他都是隐变量或者参数,其中,Φ表示词分布,Θ表示主题分布,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_04

是主题分布Θ的先验分布(即Dirichlet 分布)的参数,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_05

是词分布Φ的先验分布的参数,N表示文档的单词总数,M表示文档的总数。

  • 假定语料库中共有M篇文章,每篇文章下的Topic的主题分布是一个从参数为的Dirichlet先验分布中采样得到的Multinomial分布,每个Topic下的词分布是一个从参数为的Dirichlet先验分布中采样得到的Multinomial分布。 (每篇文章的Topic的主题分布和Topic下的词分布都是Multinomial 分布)
  • 对于某篇文章中的第n个词,首先从该文章中出现的每个主题的Multinomial分布(主题分布)中选择或采样一个主题,然后再在这个主题对应的词的Multinomial分布(词分布)中选择或采样一个词。不断重复这个随机生成过程,直到M篇文章全部生成完成。(先采样主题,再在该主题分布中采样词)
  •     M 篇文档会对应于 M 个独立的 Dirichlet-Multinomial 共轭结构(每篇文档都有其独特不同的doc-topic分布),K 个 topic 会对应于 K 个独立的 Dirichlet-Multinomial 共轭结构。
  • 其中,→θ→z 表示生成文档中的所有词对应的主题,显然 →θ 对应的是Dirichlet 分布,θ→z 对应的是 Multinomial 分布,所以整体是一个 Dirichlet-Multinomial 共轭结构,如下图所示:

  • 类似的,→φ→w,容易看出, 此时β→φ对应的是 Dirichlet 分布, φ→w 对应的是 Multinomial 分布, 所以整体也是一个Dirichlet-Multinomial 共轭结构,如下图所示:

pLSA与LDA参数估计方法的对比

假定文档已经产生,反推其主题分布。那么,它们估计未知参数所采用的方法有什么不同?

  • pLSA中,我们使用EM算法去估计“主题-词项”矩阵Φ和“文档-主题”矩阵Θ,而且这两参数都是个未知的固定的值,使用的思想其实就是极大似然估计MLE。
  • LDA中,估计Φ、Θ这两未知参数可以用变分(Variational inference)-EM算法,也可以用gibbs采样,前者的思想是最大后验估计MAP(MAP与MLE类似,都把未知参数当作固定的值),后者的思想是贝叶斯估计。贝叶斯估计是对MAP的扩展,但它与MAP有着本质的不同,即贝叶斯估计把待估计的参数看作是服从某种先验分布的随机变量。
  •     由于LDA把要估计的主题分布和词分布看作是其先验分布是Dirichlet分布的随机变量,所以,在LDA这个估计主题分布、词分布的过程中,它们的先验Dirichlet分布事先由人为给定,那么LDA就是要去求(可用gibbs采样)它们的后验分布,得到期望、。LDA中,主题分布和词分布本身都是多项分布,而由上文可知“Dirichlet分布是多项式分布的共轭先验概率分布”,因此选择Dirichlet 分布作为它们的共轭先验分布。意味着为多项分布的参数p选取的先验分布是Dirichlet分布,那么以p为参数的多项分布用贝叶斯估计得到的后验分布仍然是Dirichlet分布。

LDA Gibbs Sampler

为了构造LDA Gibbs抽样器,我们需要使用隐变量的Gibbs抽样器公式

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_06


(lz:这里分母实际只是分子对zi的一个积分,将变量zi积分掉,就得到p(z-i, x),所以重点在联合分布p(z,w)公式上,一般先推出联合分布公式再积分就可以使用上面的隐变量gibbs采样公式了。而这个联合分布就是我们采样出来的结果推断出的近似分布,也就是下面LDA所有变量的联合分布如何通过采样结果求解出来)。

在LDA模型中,隐变量为zm,n,即样本中每个词wm,n所属的主题,而参数Θ和Φ等可以通过观察到的wm,n和相应的zm,n积分求得,这种处理方法称作collapsed,在Gibbs sampling中经常使用。

要推断的目标分布p(z|w)(后验概率分布),它和联合分布成正比    p(z|w)=p(z,w)p(w)=∏Wi=1p(zi,wi)∏Wi=1∑Kk=1p(zi=k,wi)    {这里省略了超参数},这个分布涉及很多离散随机变量,并且分母是KW个项的求和,很难求解(正如从一维均匀分布采样很容易,直接从二维均匀分布采样就比较困难了,也是通过固定某个维度gibbs采样的)。此时,就需要Gibbs sampling发挥用场了,我们期望Gibbs抽样器可以通过Markov链利用全部的条件分布p(zi|z-i,w) 来模拟p(z|w)  。

LDA所有变量的联合分布

联合概率分布p(w,z):    p(w,z|α,β)=p(w|z,β)p(z|α)

    给定一个文档集合,w是可以观察到的已知变量,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_04


python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_05

是根据经验给定的先验参数,其他的变量z,θ和φ都是未知的隐含变量,需要根据观察到的变量来学习估计的。根据LDA的图模型,可以写出所有变量的联合分布:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_09

    因为

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_04

产生主题分布θ,主题分布θ确定具体主题,且

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_05

产生词分布φ、词分布φ确定具体词,所以上述式子等价于下述式子所表达的所有变量的联合概率分布

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_12


python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_13

(从概率图表示中也可以看出)    由于此公式第一部分独立于 α⃗ ,第二部分独立于 β⃗ ,所以可以分别处理。计算的两个未知参数:第一项因子

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_14

表示的是根据确定的主题

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_15

和词分布的先验分布参数

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_05

采样词的过程,第二项因子

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_17

是根据主题分布的先验分布参数

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_04

采样主题的过程。

采样词过程

第一个因子

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_14

,可以根据确定的主题

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_15

和从先验分布

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_05

取样得到的词分布Φ产生:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_22

    由于样本中的词服从参数为主题

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_23

的独立多项分布,这意味着可以把上面对词的乘积分解成分别对主题和对词的两层乘积:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_24

其中

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_25

是词 t 在主题 k 中出现的次数,可以从初始化和迭代中计算出;Φ(k, t)是词分布也就是主题k下词t的采样概率,未知参数,如上分析过,通过

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_25

求。

Note:

1 每个主题下包含所有词,所有词都要考虑,只是概率不一样而已。并且这里的w和z上面都有箭头,都是向量。

2 初始时每个词w随机分配主题k,这样每个主题下的词也就随机分配了,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_25

也就得到初始值并不断修正,具体参考后面的【Gibbs sampling具体算法】    回到第一个因子上来,目标分布

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_28

需要对词分布Φ积分:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_29

                       (68)其中在LDA中的数学模型定义的Dirichlet 分布的归一化系数

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_30

的公式

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_31

(两种表达方式,其中int表示积分)

这个结果可以看作K个Dirichlet-Multinomial模型的乘积。

Note: 推导:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_32

采样主题过程

    类似,对于

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_17

,先写出条件分布,然后分解成两部分的乘积:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_34

    其中,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_35

表示的单词 i 所属的文档,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_36

是主题 k 在文章 m 中出现的次数。

    对主题分布Θ积分可得联合分布因子2:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_37

                 (72)

Note: 上式推导:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_38

综合第一个因子和第二个因子的结果,得到

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_12

的联合分布结果为:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_40

通过联合分布公式就可以得出出下面的条件分布的公式,对每个单词的主题进行采样。

LDA词的主题采样

通过联合分布

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_12

来计算在给定可观测变量 w 下的隐变量 z 的条件分布(后验分布)

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_42

,再进行贝叶斯分析。换言之,有了这个联合分布后,要求解第m篇文档中的第n个词(下标为

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_43

的词)的全部条件概率就好求了。    变量定义: 

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_44

表示除去

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_45

的词,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_46


python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_47

排除当前词的主题分配,即根据其他词的主题分配和观察到的单词来计算当前词主题的概率公式为:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_48

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_49

公式(80)

lz Note:

1 各符号表示含义

理解的一个重要前提是,单词库中的每个单词w都分配了一个不同的主题z。w:数据集Dt中所有词;m:文档;k:主题; t:当前词实例wi = t(特指时)。

我们需要求的实际是p(z, w)的联合分布,也就是(z, w)的概率分布,表示每个词对应的主题是什么,怎么求当然是通过含隐变量的gibbs采样公式采样,直接通过前面求出的p(w,z)当然是没法直接采样,毕竟高维,wz的情况太多。对某个词wi进行主题分配时,即求(z, w)的分布时,可以通过排除当前词的主题分配,根据其他词的主题分配和观察到的单词(z-i, w-i)来计算当前词主题的概率公式,这也就是含隐含变量的gibbs采样。

p(zi | z-i, w)是wi属于指定主题zi = k的概率,我们要计算所有的p(zi | z-i, w),归一化就组成了一个可对wi进行主题采样的概率分布了。

-i除去当前词i相关的不考虑where n−i is the count excluding the current assignment of z i , i.e., z −i .;n−i denotes a quantity excluding the current instance;
z−i代表不是wi的其它所有单词对应的不同主题组成的集合(类似式68中nz的定义)。

p(w|z) 表示所有不同单词在所有不同主题下概率和伪概率的某种复杂乘积(式68 p(z|w, β)),而p(w-i | z-i)表示的是除了单词i外的所有其它不同单词在所有不同主题下的乘积;

p(z) 表示所有不同主题在不同文档中概率和伪概率的某种复杂乘积(式72 p(z | α));而p(z-i)表示除了词wi对应的主题外,其它所有不同主题在所有不同文档中的乘积。
n(t)k,-i表示主题k中单词t(除了单词wi外,wi也是词t1,注意不在和式中的t是指wi等于的单词t)的个数;而n(t)k表示主题k中单词t的个数;

n(k)m,-i表示文档m中所有词(不包括wi)被赋予主题k的次数(其中对于wi所在的主题k, n(k)m, -i = n(k)m - 1;对于wi不在的主题,两者当然相等);

主题分布参数Θ和词分布参数Φ的计算

Note: LDA的原始论文中,主题的词分布通常叫β,但是在许多后来的论文中叫φ,如on smoothing and inference for topic models.

    最后一步,根据Markov链的状态

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_23

获取主题分布的参数Θ和词分布的参数Φ(知道了每篇文档下每个词对应的主题,那么文档下的主题分布和主题的词分布就好求了)。思路:参数是通过贝叶斯方法求的,先计算 文档m中主题的概率分布,再取其均值作为参数的估计值。根据贝叶斯法则和Dirichlet先验,以及上文中得到的

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_51


python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_52

各自被分解成两部分乘积的结果,可以计算得到每个文档上Topic的后验分布和每个Topic下的词的后验分布分别如下(据上文可知:其后验分布跟它们的先验分布一样,也都是Dirichlet 分布):可知,文档m中主题的概率分布是 数据学习得到的主题多项式分布似然*文档m主题分布的Dir先验。

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_53


其中,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_54

是构成文档m的主题数向量,

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_55

是构成主题k的词项数向量。

文档m主题的概率分布公式推导如下:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_56

根据Dirichlet 分布期望,最终得到的分布参数求解公式为(注意分布参数的计算要在sampling收敛阶段进行):

python如何确定LDA主题模型的主题个数 lda主题模型的优点_贝叶斯估计_57

LDA吉布斯采样概率公式图解

如果将

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_58


python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_59

的结果代入之前得到的

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_60

{公式(81)}的结果中,可得:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_61

        仔细观察上述结果,可以发现,式子的右半部分便是

python如何确定LDA主题模型的主题个数 lda主题模型的优点_多项式_62

,这个概率的值对应着

python如何确定LDA主题模型的主题个数 lda主题模型的优点_概率分布_63

的路径概率。如此,K 个topic 对应着K条路径,Gibbs Sampling 便在这K 条路径中进行采样,如下图所示:

python如何确定LDA主题模型的主题个数 lda主题模型的优点_人工智能_64

就这样,Gibbs Sampling通过求解出主题分布和词分布的后验分布,从而成功解决主题分布和词分布这两参数未知的问题。

而采样wi的主题k,其分布就是这些路径的概率分布,当然更倾向于选择概率最大的那个路径。