浅谈gibbs sampling(LDA实验)

来源:互联网 发布:ubuntu下安装exe 编辑:程序博客网 时间:2024/06/08 11:15

先把问题描述一下:

如果我们已知了topic内的每个词的词频,比如下图中topic1 中money 2 次,loan 3次...那么任意给一个文档我们可以对里面每一个词算一个产生这个词的概率即 P(w=wi|t=tj)

如下图,doc1 中的money 百分之百的来自于topic1 。doc2 中的词用topic1 无法全部解释,必须借助topic2 。

但现在问题是,如果我们只有一堆文档,Doc1,Doc2,Doc3,且拍脑袋的大概知道会有2个topic,那么怎么产生着两个topic才能最好的解释这三个文档呢?

       

因此我们要计算一个概率,即文档中的这个词活脱脱的呈现在我们面前的概率P(wi),我们尽可能想办法让这个概率最大。就好像XX厂长成功了,我们要罗织功劳,让XX厂长成功这件事,最可信。

 那么这个概率计算的方法如下图,简单来说就是 P(wi) = P(wi|topic) * P(topic|doc)*p(doc),我们省略p(doc)【求解没有意义】于是得到下面公式。




现在问题又来了,如果给定一个文档di的一个词wi,他最大可能是来自哪个topic呢?

即 求解P(topic|(di,wi))?

我们知道,P(topic|(wi,di))和P((wi,di)|topic)有关系,那么P((wi,di)|topic)=P(wi|topic)P(doc|topic),即我们要使得P(wi|topic)P(doc|topic) 这两个东东的liklyhood最大。

也就是论文中的CWT和CDT,而下图公式左边 (CWT+β)/(∑CWT+Wβ) 表示的含义就是P(wi|topic),即topic产生wi的能力。后面一个是P(doc|topici)。


为了验证有效性,我对论文中的这个例子做了实验,很遗憾没有做到他的结果,但我感觉应该是对的,其中α,大家可以调大调小了试试看,调大了的结果是每个文档接近同一个topic,即让p(wi|topici)发挥的作用小,这样p(di|topici)发挥的作用就大。 其中的β,调大的结果是让p(di|topici)发挥的作用变下,而让p(wi|topici)发挥的作用变大,体现在每个topic更集中在几个词汇上面,或者而每个词汇都尽可能的百分百概率转移到一个topic上。

大家可以看下论文,用我的代码实际感觉下数据的变化。


以下to @老师木 @王威廉 @李沐mu @等高手:

我觉得论文中的结果也很奇怪,如果在更新wi的类标号的时候,比如更新第一个doc的第二词,money,money出现了6次(2黑,4白),如果第一个更新为白,后面怎么可能更新为黑呢?如果不可能,为什么论文作者在64次迭代后,会有一些文档同一个word会打上不同的类标签,比如doc2,的bank,打了4黑1白? 

我尝试过update放在每个更新之后,发现也做不到,很神奇,也许论文作者原始文档的term出现顺序不是我写的那样。



代码和论文地址:

https://github.com/pennyliang/MachineLearning-C---code/tree/master/gibbs_sampling