您的位置:首页 > 其它

plsa(Probabilistic Latent Semantic Analysis) 概率隐语义分析

2016-03-13 17:07 323 查看

Probabilistic Latent Semantic Analysis

主题模型简介

plsa,也就是概率隐语义分析,是主题模型的一种。主题模型是什么呢?先从文档说起,每篇文档用bag-of-words模型表示,也就是每篇文档只与所包含的词有关,而不考虑这些词的先后顺序。假设文档集D有N篇文档,主题模型认为在这N篇文档中一共隐含了Z个主题,每篇文档都可能属于一个或多个主题,这可以用给定文档d时所属主题z的概率分布p(z|d)表示。同理,一个主题下可以包含若干个词w,用概率分布p(w|z)表示。

所以,如果我们有文档集D,又求出对应这个文档集的主题模型,那这有什么意义呢?最明显的意义就是,这相当于给文档聚类了,并且聚类的结果有更合理的解释性。因为我们不但可以知道每一篇文档d属于哪个类别z,我们还可以根据概率p(w|z)知道这个主题的关键词是哪些,从而给这个主题z设置合理的标签。知道文档所属的类别,我们就可以判断两篇文档在语义上是否相似了。虽然可以直接根据文档向量的余弦距离来判断它们是否相似,但是这对近义词就无能为力,比如两篇同样介绍电子产品的文档,一篇大量用“苹果”这个关键词,而另一篇大量用“iPhone”,那么通过余弦距离判断的这两个维度上肯定是不相似的。而“苹果”、“iPhone”两个词都与电子产品关系很大,所以这两篇文档可以都属于同一个主题,也就可以断定他们语义上是相似的。

主题模型的用处还是很多的,在推荐系统,舆情监控等等,都有广泛的用途。

plsa原理

介绍完主题模型的基本概念,就要回到本文的重点,给定一个文档集D,如何估计主题模型的参数呢?接下来说明如何用plsa来求出这些参数。先放一张图



首先介绍一下图中参数:d代表每一篇文档,z表示每一个隐含主题,w表示具体的单词。N表示每篇文档的单词数,M表示文档集D内的文档数。

plsa是一个生成模型,它假设了d,w,z之间的关系通过上图的贝叶斯网络 所表示。灰色的节点d和w表示我们能够观测到的变量,也就是具体的文档与文档中的词。白色的节点z就是隐含的主题变量。每篇文档的生成过程是

1. 以概率p(d)选定文档。

2. 以概率p(z|d)选定一个主题。

3. 以概率p(w|z)从主题中选定单词。

我们需要估计的参数就是p(z|d)与p(w|z),后文有些地方用θ来表示他们。先不管我们知不知道z是什么,用极大似然估计试试。n(d,w)表示某篇文档d中的词w出现的次数,这个直接统计得到。p(d,w)就是观测到变量d与w的联合概率分布。写出似然函数

L(θ)=∏d∏wp(d,w)n(d,w)

再写出log似然函数

LL(θ)=∑d∑wn(d,w)logp(d,w)=∑d∑wn(d,w)[logp(d)+logp(w|d)]

其中

p(w|d)=∑zp(w|z)p(z|d)

所以待求解的问题就是

argmaxθLL(θ)=argmaxθ∑d∑wn(d,w)[logp(d)+log∑zp(w|z)p(z|d)]

p(d)与需要估计的参数无关,这一项直接舍去不影响结果,得到

argmaxθLL(θ)=argmaxθ∑d∑wn(d,w)log∑zp(w|z)p(z|d)

现在问题来了,z是隐含变量,无法观测到,怎么去最大化这个公式呢?假设我们已知在观测d,w下z的概率分布p(z|d,w),再对上面的公式做一个变换,同时乘上和除以p(z|d,w)

argmaxθLL(θ)=argmaxθ∑d∑wn(d,w)log∑zp(z|d,w)p(w|z)p(z|d)p(z|d,w)

那么上式log的右边就变成了关于z的函数的期望Ez,式子变成

argmaxθLL(θ)=argmaxθ∑d∑wn(d,w)logEz[p(w|z)p(z|d)p(z|d,w)]

根据Jensen不等式

logEz[p(w|z)p(z|d)p(z|d,w)]≥Ez[logp(w|z)p(z|d)p(z|d,w)]

那么在已知p(z|d,w)的条件下我们就可以得到LL(θ)的一个下界函数Q(θ),如果这个下界函数可以求最大化,我们就最大化它以估计我们所需的参数。然后根据新的参数求p(z|d,w),再写出新的下界函数,再最大化…反复迭代直至收敛。这就是将EM算法应用到plsa的求解中。

其中

Ez[logp(w|z)p(z|d)p(z|d,w)]=∑zp(z|d,w)[logp(w|z)P(z|d)−logp(z|d,w)]

而logp(z|d,w)与我们所需要求的参数无关(因为假设它是已知的值),将它舍去不影响求解。需要求解的问题就变成了

argmaxθQ(θ)=argmaxθ∑d∑wn(d,w)∑zp(z|d,w)logp(w|z)P(z|d)

根据贝叶斯定理,可以得到

p(z|d,w)=p(d,z,w)p(d,w)=p(d)p(z|d)p(w|z)p(d)∑zp(z|d)p(w|z)=p(z|d)p(w|z)∑zp(z|d)p(w|z)(1)

补充说明一下,求p(z|d,w)是求解p(z(k)|d(i),w(j)),也就是我们需要遍历每一个隐含主题z,每一篇文档d,每一个词w。而此时的p(z(k)|d(i))与p(w(j)|z(k))我们是当做已知的,初始化的时候随机给一个值。

到这里已经讲完了用EM算法的E步。归纳一下,在plsa的情境下,E步就是求出所有的p(z(k)|d(i),w(j))。

接下来是M步,最大化Q(θ),求出新的参数p(z|d)与p(w|z)。应用拉格朗日数乘法求解出新的参数

pnew(w(j)|z(k))=∑dn(d,w(j))pold(z(k)|d,w(j))∑d∑wn(d,w)pold(z(k)|d,w)(2)

pnew(z(k)|d(i))=∑wn(d(i),w)pold(z(k)|d(i),w)∑w∑zn(d,w)pold(z|d(i),w)(3)

总结一下,plsa刚开始理解很难,只要理解了怎么求期望(E步),怎么求最大化(M步),然后根据推导出来的公式编程就很简单了。基本上就分为统计所有的n(d,w),选定主题数|Z|,然后初始化所有的参数p(z(k)|d(i))和p(w(j)|z(k)),接下来根据不断的迭代,每一次迭代先用公式(1)求p(z|d,w),然后根据公式(2)和(3)更新参数。直到收敛,收敛条件可以是|Q(θt+1)−Q(θt)|<ϵ,也可以是两次迭代参数的差值小于某个阈值。

完整的Python实现代码见我的github
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息