LDA主题模型(算法详解)

LDA主题模型(算法详解)

http://blog.csdn.net/weixin_41090915/article/details/79058768?%3E

一、LDA主题模型简介

LDA(Latent Dirichlet Allocation)中文翻译为:潜在狄利克雷分布。LDA主题模型是一种文档生成模型,是一种非监督机器学习技术。它认为一篇文档是有多个主题的,而每个主题又对应着不同的词。一篇文档的构造过程,首先是以一定的概率选择某个主题,然后再在这个主题下以一定的概率选出某一个词,这样就生成了这篇文档的第一个词。不断重复这个过程,就生成了整篇文章(当然这里假定词与词之间是没有顺序的,即所有词无序的堆放在一个大袋子中,称之为词袋,这种方式可以使算法相对简化一些)。

LDA的使用是上述文档生成过程的逆过程,即根据一篇得到的文档,去寻找出这篇文档的主题,以及这些主题所对应的词。

白话解释:比如document1的内容为:[自从乔布斯去世之后,iPhone再难以产生革命性的创新了] 
通过上述的方法,document1将对应两个主题topic1,topic2,进而,主题topic1会对应一些词:[苹果创始人][苹果手机],主题topic2会对应一些词:[重大革新][技术突破]。于是LDA模型的好处显而易见,就是可以挖掘文档中的潜在词或者找到两篇没有相同词的文档之间的联系。

二、算法流程

详细,通俗易懂,逻辑脉络清晰)


我们以文档集合D中的文档d为例,文档d中包含单词序列 <w1,w2,...wn> wi 表示第 i 个单词,设d中有 n 个单词; 
文档集合D中出现的全部词组成 Vocabulary ; 
首先将文档d作为算法的输入,并输入主题数K,此时d对应到各个主题的概率为 θd=(pt1,pt2,...ptk) pti 为d对应第 i 个主题的概率; 
此时输入到算法中的只有文档d和主题数K,那么 pt1,pt2...ptk 的数值从何而来?


我们首先人为设置文档d中对应主题 t1,t2,...tk 的词的个数,比如文档d中5个词对应主题 t1 ,7个词对应主题 t2 ,…,4个词对应主题 tk ,那么此时,我们就人为确定了一个参数向量(5,7,…4),将这个向量记作 α⃗  ,这个我们人为设置的参数向量称为超参数。 
那么如何将超参数 α⃗  转化为概率分布 θd=(pt1,pt2,...ptk) 呢?


这里我们引入狄利克雷分布函数: 

Dirichlet(p1,p2,p3|α1,α2,α3)=Γ(α1+α2+α3)Γ(α1)Γ(α2)Γ(α3)pα111pα222pα333

它所表达的含义简单来说就是,已知 α1,α2,α3 的条件下,概率 p1,p2,p3 的概率分布,也就是概率的概率,分布的分布。再直观点说就是:比如在已知 α1,α2,α3 (5,7,4) 的条件下,样本点 p1,p2,p3 (0.4,0.5,0.1) 的概率是多少。


那么我们将上述的三维 Dirichlet 函数扩展为 K 维,即在已知 α⃗  的条件下,得到 p⃗  的分布( α⃗ ,p⃗  分别为K维向量)。 K Dirichlet 公式如下: 

Dirichlet(p⃗ |α⃗ )=Γ(Kk=1αk)Kk=1Γ(αk)k=1Kpαk1k


至此,我们通过输入超参数 α⃗  得到了文档d的关于K个主题的狄利克雷分布: 

θd=Dirichlet(α⃗ )

其含义显然, Dirichlet 的输入参数为 α⃗  ,得到的输出为可以理解为一个矩阵: 
(pt1,pt2,...ptk)  
......  
......  
(pt1,pt2,....ptk)  
即文档d对应各个主题 tk 的概率分布的分布。


同理,我们可以将任一主题 tk 产生各个词的概率表示出来。人为设置主题 tk 产生的各个词的数量,即设置超参数,用向量 η⃗  来表示。同上所述,将 η⃗  作为 Dirichlet 函数的输入参数,得到主题 tk 产生各个词的狄利克雷分布: 

βk=Dirichlet(η⃗ )


此时我们已经得到了文档d对应各个主题的概率分布的分布(即狄利克雷分布) θd ,以及文档 tk 产生各个词的概率分布的分布 βk ,那么接下来,我们要从文档d中取出第i个词,求这个词对应各个主题的分布; 
换句大家熟悉的话来说就是:已知第i个词 wi 在文档d中出现n次,且已知它对应各个主题的概率(这里每个词对应各个主题的概率就是文档d对应各个主题的概率,二者同分布),求该词被各个主题产生的次数; 
这就等同于我们熟知的一共有n个球,且已知红球、黄球、绿球的概率分别为 p1,p2,p3 ,求这n个求当中红球、黄球、绿球的个数。


那么如何通过文档d对应各个主题的分布 θd 得到文档中的每个词被各个主题产生的次数,进而重新得到文档d中对应各个主题的词的个数呢?


首先我们引入十分熟悉的多项式分布: 

multi(m1,m2,m3|n,p1,p2,p3)=n!m1!m2!m3!pm11pm22pm33

这个公式的意义总所周知:已知一共n个球,且知道每种颜色球的概率,就可以得到有 m1 个红球, m2 个黄球, m3 个绿球的概率。


那么同样将其扩展为K维,将 θd 作为参数,就可以得到文档d中第i个词 wi 对应的各个主题的多项式分布 zdn=multi(θd)  
于是,非常值得庆幸,我们通过文档d对应各个主题的概率 θd ,进而得知文档d中各个词对应各个主题的概率,且知道这个词在文档d中的出现次数,于是求得这个词被各个主题的产生次数,遍历文档d中的每一个词,就可以得到新的文档d中对应各个主题的词的个数。 
白话举例:文档d对应主题 t1,t2 的概率分别为 pt1,pt2, ,于是文档d中词 w1 对应的主题 t1,t2, 的概率也分别为 pt1,pt2 ,又得知词 w1 在文档d中出现了15次,于是得到词 w1 由主题 t1,t2 产生的次数分别为10次、5次(这个是假设的); 
对文档d中的每个词都执行此操作,(假设文档中只有两个词)词 w2 由主题 t1,t2 产生的次数分别为13次、2次,于是就能重新得到文档d中对应各个主题的词的数量,即对应主题 t1,t2 的词的数量分别为2个、0个(初始的d中对应各个主题的词的数量是人为设定的超参数 α⃗  )。


于是,我们最终得到了文档d对应各个主题的词的个数的更新值:记作向量 n⃗  ,我们将更新后的向量 n⃗  再次作为狄利克雷分布的输入向量,即 Dirichlet(θd|n⃗ ) ,就会又会得到文档d对应各个主题的概率的更新值,即更新的 θd ,如此反复迭代,最终得到收敛的 θd ,即为我们要的结果。


有了以上的经验,主题 tk 产生各个词的概率 βk 可以同样处理,对于产生文档d中的第 i 个词 wi 的各个主题的分布为: 
multi(βi) ,于是用同上面相同的方法,可以得到更新后的各个主题产生各个单词的数量:记作向量 m⃗  ,将向量 m⃗  作为新的参数再次带入狄利克雷分布 Dirichlet(βk|m⃗ ) ,就又会得到每个主题产生各个词的概率,即更新的 βk ,如此反复迭代,最终得到收敛的 βk ,即所求结果。


得到了收敛的 θd βk ,算法就大功告成了,这时,该算法就会根据输入的文档d,找到潜在主题下的相关词啦!!!!

++++++++++++++++++++++++++++++++++++++++ 
个人整理,水平有限,可能存在很多错误,希望大家一起探讨研究,还有关于为什么选用狄利克雷分布以及狄利克雷分布和多项式分布之间的关系、先验概率后验概率等内容并没有仔细探讨,作者现在已经生不如死了,先休息休息,过几天再补充吧!! 
++++++++++++++++++++++++++++++++++++++++

猜你喜欢

转载自blog.csdn.net/zhaozhn5/article/details/79150004