LDA主题模型

来源:互联网 发布:centos安装cacti 编辑:程序博客网 时间:2024/05/22 16:03

本总结是是个人为防止遗忘而作,不得转载和商用。

 

      在解释LDA之前需要先介绍些前置知识,然后一点点说明LDA,所以,如果某个前置知识你不明白,那个人建议你不要跳过,否则....否则随你喽~

      PS:下面章节的关系是:

           LDA的DA是“Dirichleet分布”的缩写

           Dirichleet分布是Beta分布推广到多维的情况

           Beta分布和Γ函数有关系,且它是二项分布的共轭先验分布

Γ函数

      其实就是阶乘在实数上的推广,也就是:不仅把1!, 2!, 3!, ..., n!用坐标轴表示,也把1.1!, 1.2!, ...这样的小数也的阶乘也用坐标轴表示,这样的函数就是Γ函数。

 

Beta分布

      PS:概率密度 -- 函数的面积为1.

           PS的PS:这个仅仅作为一个记录,没什么特别含义。

Beta分布的期望

Beta分布的一点思考

      因为Beta分布的x定义域是[0,1],所以这个x可以看成是另一个事件发生的概率,或者说另一个事件发生的概率可能满足Beta分布。

 

共轭先验分布

      由朴素贝叶斯可以得出下面的式子:

     

      其中x是样本,θ是参数。

      如果后验概率P(θ|x)和先验概率p(θ)满足同样的分布律(连续的话就是概率密度),那么,先验分布和后验分布被叫做共轭分布,同时,先验分布叫做似然函数的共轭先验分布

      例1:硬币朝上这个事件,即x满足二项分布。然后硬币朝上的概率的背后可能有个参数θ,而这个θ可能属于某一个分布(硬币朝上的概率属于某一个分布),假设这个分布是z分布。于是,若z分布*二项分布后还是z分布,那么这个z分布就是二项分布的共轭先验分布。

      例2:x满足高斯分布N(x|μ, σ2),如果这个μ又满足另一个高斯分布N(μ|μ0, σ20),则μ是x的共轭先验分布。

      PS:对于高斯分布,σ 的共轭先验分布是伽马分布。

Beta分布是二项分布的共轭先验分布

      将上面两者合并运用一下,我们来看看“Beta分布真的是二项分布的共轭先验分布吗?”

      对于二项分布的经典例子投硬币:投掷一个非均匀硬币,可以使用参数为θ的

伯努利模型,θ为硬币为正面的概率,那么结果x的分布形式为:

           1p(x|θ) =θx(1-θ)1-x

      先假设两点分布/二项分布的共轭先验是Beta分布,且Beta分布的参数为α和β,即:

      PS:这里的α和β是决定参数θ的参数,常称之为超参数。

      下面我们计算下先验概率p(θ)和后验概率p(θ|x)。

      根据假设,先验概率为

          

      根据朴素贝叶斯公式和刚才已知的似然概率(即1),可以算出后验概率:

          

      结论:

           后验概率的形式与先验概率的形式一样——后验概率是参数为(x+α,1-x+β)的Beta分布,即:伯努利分布的共轭先验是Beta分布。

伪计数

      在刚才例子的后验概率的最终表达式中,参数α、β和x一起作为参数θ的指数——后验概率的参数为(x+α,1-x+β)。而这个指数的实践意义是:投币过程中,正面朝上的次数。α和β 先验性的给出了在没有任何实验的前提下,硬币朝上的概率分配;因此,α和β可被称作“伪计数”。

 

Dirichlet分布

      Dirichleet分布其实就是Beta分布推广到K维的情况。

      Beta分布是:


      将其扩展到K维得到Dirichleet分布:

Dirichleet分布分析

      你看,二项分布需要两个参数,比如:对于投硬币,x表示正面向上的概率,1-x表示反面向上的概率。于是K项分布就需要K个参数。

      于是对于Dirichleet分布,它的参数α 就是个K维的参数向量。

      但是这个参数有个特点,即:所有的参数相加和为1,所以,一旦知道任意K-1个参数,那剩下的那个参数就知道了,于是参数α 的自由度是K-1维。

解释:

对于Beta分布,即Beta(x|α, β),我可以将其写成这样一个Dirichleet分布:Dir(x|α1, α2),(还有个1-x这个式子里没表示),而α1是x的指数,α2是1-x的指数,所以虽然给了两个α,但只决定1个x(有点不懂的看看1,(此处为了统一把式1的θ换成x),式1中要么是x生效,要么1-x生效,即扩展到K维的话就是一次只有K-1个生效。)

一个小例子:

对于3点分布,其共轭先验分布,即Dirichleet分布可以写成:

    f(p1, p2, p3|α1, α2, α3) = (1/Δ(α))p1α1-1p2α2-1p3α3-1

但因为p1 + p2 + p3 = 1,所以上式左右两边都可以省略p3,即变成:

    f(p1, p2, 1-p1-p2|α1, α2, α3) = (1/Δ(α))p1α1-1p2α2-1(1-p1-p2)α3-1

这反应到坐标轴上就是,我只需要给出p1轴和p2轴就好了,p3轴压根就不用给!

     

分词和Dirichleet分布的关系

      解释这个分布有啥用?或者说:LDA中既然DA指的就是Dirichleet分布,那这个分布总该和文档分词有关系吧!

      没错!

      你看:

           二项分布扩展到K为是K项分布吧     ->

           既然二项分布的共轭先验分布是Beta分布,那K项分布的就是Dirichleet分布吧  ->

           如果一个文档中只有两个词,那这个文档就是个二项分布吧   ->

           但一个文档中一般有很多词,比如有K个,所以说文档是K项分布吧。

      OK(拍手),现在轮到你说说Dirichleet分布和文档分词有什么关系了。

      注意:词频不是Dirichleet分布,词频是K项分布,而K项分布需要有参数的,这个参数是Dirichleet分布。

       如:

           我将投掷硬币的例子稍作改动,将“对于投掷硬币的f(x) = x0.5(1-x)0.5,x是正面向上的概率”,中x改成文章属于主题0的事件,1-x改成文章属于主题1的事件,p=0.5改成属于主题1的概率,这样就是主题模型了吧。

           于是对于这个二项分布的模型,其共轭先验分布就是Beta(p|α1=1.5, α2=1.5),如下图:

          

           如果将p改为f(x) = x2(1-x)5,即Beta分布为Beta(p|α1=3, α2=6),那图像就会变成:

          

           发现,属于文档0的概率会变大了。

对称Dirichleet分布

      PS:对称Dirichleet分布只是α 一样,某文档属于各个主体的概率Pk是不同的。

       对称Dirichlet分布的参数分析:

              α=1时:退化为均匀分布:

              α>1时:p 1 =p 2 =…=p k 的概率增大

              α<1时:pi =1,p非i =0的概率增大

       用图说明的话就是:

      这什么意思?

      对应到主题模型时就是在说:

          1, 文档X属于各个主体的概率P,而P是由 α 这个超参数决定的,即:文档1属于各个主题的概率为p1k,于是文档1的这个p1k属于对称Dirichleet分布,而对称Dirichleet分布的参数为 α = (α1, α2, ..., αk),文档k同理,即:

 

主题1

主题2

主题3

...

主题k

文章1-α1

p11

p12

p13

...

p1k

文章2-α2

p21

p22

p23

...

p2k

...

...

...

...

...

...

文章m-αm

pm1

pm2

pm3

...

pmk

          2, 如果令α=1,则先验认为一篇文档对应所有主题的概率都相同,它意味着“没有先验信息”。            PS:因为是对称Dirichleet分布,所以所有的文档都是 α。

            如果令α>1,意味着采样到各个主题相等的概率最大,但也有可能采样到的主题概率不相等。

           如果令α<1,则先验认为一篇文档只聚类一个/一部分主题的概率大。

      

LDA(主题模型)

LDA的一些认识

      LDA为了解决一词多义和多词一义的情况,其做法是:词和文档之间增加一个主题。或者说词和文档之间增加的主题就是增加了一个隐变量。

      LDA是个无监督的模型,即:只需要把文档喂给LDA模型,就可以分词了,只需要准备Dirichleet分布的参数α和主题的个数K,不需要做其他准备(包括主题类型)。

      LDA的结果不是:这个文档就属于这个主题没跑了!而是:这个文档属于主题1的概率是0.3,属于主题2的概率是0.4...这样。因此可以说LDA是把所有的文档做了个概率化的聚类。

      假设一个文档有100W个词,那这个文档就可以看成是个100W维的向量,如果主题一共有1000个,那LDA的结果就是把这个文档从100W维降到了1000维,是个降维。

LDA的解释

      1,共有m篇文章,一共涉及了K个主题;每篇文章(长度为N m )都有各自的主题分布,主题分布是多项分布,该多项分布的参数服从Dirichlet分布,该Dirichlet分布的参数为α;

      即:文档X属于各个主体的概率P,而P是由 α 这个超参数决定的,即:文档1属于各个主题的概率为p1k,于是文档1的这个p1k属于对称Dirichleet分布,而对称Dirichleet分布的参数为 α = (α1, α2, ..., αk),文档k同理,如下:

 

主题1

主题2

主题3

...

主题k

文章1-α1

p11

p12

p13

...

p1k

文章2-α2

p21

p22

p23

...

p2k

...

...

...

...

...

...

文章m-αm

pm1

pm2

pm3

...

pmk

      2,每个主题都有各自的词分布,词分布为多项分布,该多项分布的参数服从Dirichlet分布,该Dirichlet分布的参数为β;

      画表格的话,如下:

 

主题1

主题2

...

主题k

1号词β1

p11

p12

...

p1k

2号词β2

p21

p22

...

p2k

...

...

...

...

...

N号词βn

pn1

pn2

...

pnk

      即:      3,对于某篇文章中的第n个词,首先从该文章的主题分布中采样一个主题,然后在这个主题对应的词分布中采样一个词。不断重复这个随机生成过程,直到m篇文章全部完成上述过程。

           假设已经从第i篇文章学到主题分布  ->

           从这个文章的主题分布中采样一个主题  ->

           因为一个主题有一个词分布 ->

           所以从词分布中采样一个词 ->

           这个词属于哪个主题就知道了。

      简单的说就是:不停的“选一个文章->选一个主题->选一个词”

      将上面的过程画成贝叶斯网络图的话就是:

           1

      这是一个非常经典的贝叶斯网络图,它十分重要!该图就解释了上面的整个过程,解释的话就是:

      α -> θ:先给定超参数 α(本质上是给定α 和 k,其中 α 决定了对称Dirichleet分布,k是主题个数),然后根据指定了参数 α 的对称Dirichleet分布采样出一个主题分布θ。

            PS1:α 和 θ 的关系是 ---- θ 服从一个参数为 α 的对称Dirichleet分布

           PS2:θ 本身即采样出来的主题是一个多项分布

           PS3:关于主题分布的样子,还记得:“如果令α=1,则先验认为一篇文档对应所有主题的概率都相同”、“如果令α<1,....”这几个情况吗?

      θ -> z:根据主题分布采样出一个主题。

       β -> φ:β 是词分布的超参数,φ 是词分布,这个的意思就是:根据指定了参数β 的对称Dirichleet分布采样出一个词分布 φ。做K次,就得到了K个词分布 φK,这分别对应那K个主题的词分布。

      φ -> w:刚才不是得到了第z号主题了吗?于是z号主题的词分布就是 φz,那我从z号主题的词分布 φz 中采一个词,最后就得到了词w。

       PS:α表达了不同文档间主题是否鲜明,β度量了有多少近义词能够属于同一个类别。

下面的截图是更详细的解释:

      那上面的词分布和主题分布怎么采样呢?方法就是Gibbs采样

Gibbs 采样的思想:

      首先,对于一篇文档,每个词都是有主题的吧!假设一共有K个主题,那就先随机的给没个词赋予一个主题,总可以吧!

      然后,想办法对其做进一步的聚类,做进一步的收敛。

      比如:我刚认识一个人,只知道“哦,这个人还不错”,然后通过看其微信,观其朋友圈对其做进一步的收敛“哦,这个人喜欢音乐”-> “哦,这个人会玩吉他!”,但看微信,看朋友圈是讲究方法的,这个方法就是:看他朋友都在做什么,从而来估计他做什么,看他的朋友的身份,从而估计他的身份。

      因此,若想知道一个词的主题,那就看与其相邻的词的主题,用那些主题来决定这个词的主题。那这个相邻怎么规定呢?是这样:与这个词在同一个文档的词都算与其相邻

      于是,我们就先把当前的词去了,不管它了!我们直接计算没有这个词的时候其他所有词构成的整篇文档属于哪个主题,那这个词就属于哪个主题!

      上面是自然语言的描述,下面看看公式:

       解释:

      p(zi = k|z(非)i, w):在“给定所有词(w) ”和“除了第Zi个词之外的所有词的主题给定”的时候,第Zi个词主题为K的概率。

      第一个等号:条件概率公式,只不过分子把zi 与z(非)i合并成z了。

      第二个等号:根据条件概率公式,p(w, z(非)i)可以写成,p(w|z(非)i)·p(z(非)i),然后w可以分成wi和w(非)i,即:p(w|z(非)i) = p(wi, w(非)i|z(非)i),然后进一步写成p(wi, w(非)i|z(非)i) = p(wi|z(非)i)·p(w(非)i|z(非)i),而对于p(wi |z(非)i),因为其他词和当前的词没关系,所以z(非)i就可以不写,最后再把p(w,z)利用条件概率分解成p(w|z)·p(z),第二个等号就出来了。

      第二行:利用下图的公式(图中的记号参考1)。

     

     

      上面两个图的分母不要了,只要分子(成正比嘛,分母是定值不要了)。

      而p(wi)就是样本,样本是已给的,是已经确定的,对结果的判断没用,所以去掉。

      第三行:根据Δ的定义

          

       第四行:根据Γ函数 的性质

          

       第五行:我们的目的是求第Zi个词属于第K个主题的概率,而[(求和)nm(k)k]是看第m篇文档的K个主题,和目标没关系,所以可以舍去。

      于是结果就是:

           n(t)k,(非)i:对于主题k,单词t出现的次数;
           ∑_t V n(t)k,(非)i:对于主题k,除去第i个词本身后,单词t出现的次数;
“单词t”是指的“token”意义的词,无重复。只不过要针对整个词典计数。

           n(k)m,(非)i:数一下除去第i个词之后,第k个主题在第m篇文档中出现了多少次。于是出现的次数越多,则我这个词可能也属于第k个主题。

采样之后主题分布和词分布的确定

      因为主题分布和词分布是个多项分布,它们的参数符合Dirichlet分布

      所以,就用对应的Dirichlet分布的期望来作为其主题分布和词分布就可以了

     

超参的选择

      给定主题数目K,可以使用:

           α=50/K

           β=0.01

      注:不一定普遍适用

0 0
原创粉丝点击