今天晚上看了lda算法的原理,深感自己知识的缺乏啊(Dirichlet分布、多项分布、图模型、Gibbs抽样)。这也让我深感惭愧,早就意识到自己数学知识的缺乏,但是一直没有补一下。

   好吧,简单来总结一下现在对lda的理解(还有很多的地方不理解)。

   1、用途:

   判断两个文档的关联程度使用的方法是查看两个文档中出现相同的单词的个数,就如TF-IDF,这种方法未能够找到隐藏到文本后面的主题关联(或者语义关联),可能两个文档包含的相同的单词不多,但是他们表达的主题却是一样或者相似的。正如:“乔布斯离我们而去了。”和“苹果价格会不会降”一样。

   2、主题模型:

   到底什么是主题模型。一个主题,可以简单的认为是语义相似的词的集合,比如说“爱”和“喜欢”,或者“讨厌”或者“厌恶”一样,所以这时候可以把主题想象成为一个桶,而桶里面放的是出现概率较高的词,并且这些词和主题有着很强的相关性。

   3、生成模型:

   现在假设我们有大量的文档,那么我们怎么能够生成主题呢?这时候要用到生成模型的概念,让我们用概率模型,来写一篇文章。

假如说我们要写一篇文章,那么这篇文章主要是关于什么的呢,也就是说它的主题是什么呢?哦,是关于爱情、亲情和友情的。并且这些主题在文章中都占有一定的比例,或者说主题在文档中具有一定的分布(多项式分布)。那么接下来怎么去表达这些主题呢?嗯,用句子表达。当然再细化一下,就是使用词语来表达,也就是从一个主题的“桶”里面挑选出来词语,而这些词语在主题当中又服从一定的分布(多项式分布)(通常这些词要进行一定的预处理,比如剔除stopword,对于英文来说还要stemming,当然中文似乎不用stemming了)。所以说一篇文章可以这样立体化的表示:

doc
|
----------------------------------------
|                       |...                     |
topic_1            topic_2              topic_m

而
topic_i
|
----------------------------------------
|                       |...                     |
word_1            word_2              word_n

所以说一篇文章中的每个词可以是通过以一定的概率选择了某个主题(正如选择了爱情、亲情这样的主题一样),然后从这个主题当中又以一定的概率选择词语来进行表达,这样的过程就是一个生成模型。在这样的定义下,每篇文档中词语出现的概率为:

LDA主题建模案例 lda主题模型结果分析_LDA主题建模案例

使用矩阵表示就是:

LDA主题建模案例 lda主题模型结果分析_主题模型_02

其中C中的每一列表示每个文档中词语出现的概率(或者说成文档中词语的分布),Φ中的每一列表示每个主题中每个单词出现的概率,θ每一列表示文档中每个主题出现的概率。

   这时候给定一系列文档,通过对文档进行分词,然后计算出C矩阵。这时候的任务就是利用C矩阵训练右边的两个矩阵。

   4、具体表述:

   接下来该具体怎么使用生成模型呢,到现在了怎么还没有和Dirichlet相关呢。不要着急,先看看下面的图:

LDA主题建模案例 lda主题模型结果分析_LDA主题建模案例_03

这图刚一看会让人崩溃的……

其中,阴影圆圈表示可观测变量(observed variable);非阴影的圆圈表示潜在变量(latentvariable),箭头表示两个变量之间的依赖性,方框表示重复抽样,重复的次数在右下角。W表示词语,Z表示主题,θ是一个主题向量,α和β分别是语料级别的参数。

从上图可以看出,LDA的三个表示层被三种颜色表示出来:

通过狄利克雷分配构建一个高层的分配,即你从狄利克雷分配中以某一个概率选了一个分布,这个分布就是p(w|z),因此,公式中不是p(w|z),而是p(w|z,β),这个β就是指这个狄利克雷分布。这样,公式中α也是类似的,是指上面第一步中 的狄利克雷分布。

       2.document-level(橙色):θ是文档级别的变量,每个文档对应一个θ,也就是每个文档产生各个主题z的概率是不同的,所有生成每个文档采样一次θ。

       3. word-level(绿色):z和w都是单词级别变量,z由θ生成,w由z和β共同生成,一个 单词w对应一个主题z。

       通过上面对LDA生成模型的讨论,可以知道LDA模型主要是从给定的输入语料中学习训练两个控制参数α和β,学习出了这两个控制参数就确定了模型,便可以用来生成文档。其中α和β分别对应以下各个信息:

       α:分布p(θ)需要一个向量参数,即Dirichlet分布的参数,用于生成一个主题θ向量;

        β:各个主题对应的单词概率分布矩阵p(w|z)。

产生文章的过程:

对于一篇文档,我们通过p(θ|α)产生θ,这是主题在此文档中对应的多项分布,通过多项分布抽取一个主题Z,然后我们再从主题Z对应的多项分布中抽取一个单词w。将这个过程重复N次便产生了一篇文章。

用语言表述的话:

 1. 对每一篇文档,从主题分布中抽取一个主题;

2. 从上述被抽到的主题所对应的单词分布中抽取一个单词;

3. 重复上述过程直至遍历文档中的每一个单词。

也可以用下面的方式表示:

Chooseparameter θ ~ p(θ|α); //按照狄利克雷分配,选出一个主题分布

For eachof the N words w_n: //设文档中有N个单词,那么对每个单词做如下操作

   Choose a topic z_n ~ p(z|θ); //按照主体分部,选择一个主题

   Choose a word w_n ~ p(w|z,β); //按照这个主题,选择一个单词

 5、如何计算参数:

      把w当做观察变量,θ和z当做隐藏变量,就可以通过EM算法学习出α和β,求解过程中遇到后 验概率p(θ,z|w)无法直接求解,需要找一个似然函数下界来近似求解,原文使用基于分解(factorization)假设的变分法(varialtional inference)进行计算,用到了EM算法。每次E-step输入α和β,计算似然函数,M-step最大化这个似然函数,算出α和β,不断迭代直到收敛。

6、开源实现:

LDAGibbsSampling

7、缺点:

由于lda采用了词袋的方法,将每一篇文档实为一个词频向量,从而将文本信息转换成为了易于建模的数字信息,但是却没有考虑词与词之间的顺序。

 

参考:1、主题模型-LDA浅析

2、http://www.douban.com/note/263498661/

3、http://cos.name/2010/10/lda_topic_model/

4、http://baike.baidu.com/link?url=dJYUecyatqr4v38b2mFGqRZzRSyPTRxA6_0ykHQjPqnqYAVTGVtyvhR3hZJt9KbtlzlSeHchd0w9Bg9O_zJJUa#3