LDA的直观解释

本文通过直观的思路探讨LDA(Latent Dirichlet Allocation)模型,从简化问题到逐步微扰,建立基于聚类思想的演化规则。通过对极端情况的分析,作者推导出与LDA相似的规则,并与标准LDA结果对比,揭示了LDA的本质是词的topic演化过程。
摘要由CSDN通过智能技术生成

缘起

这篇文章的起源是当年看LDA的推导,开始的时候觉得整个数学推导太复杂了,特别是从概率建模推导出Gibbs Sampling演化公式的过程,感觉不太对我的口味了,我更喜欢从自演化的角度来理解,所以就自己尝试折腾一个“Topic Model”。结果在折腾完之后,和LDA的结果进行对比,神奇地发现基本是一致的。
可惜后来发现其实别人也从LDA的推导结果中观察出了这个演化规则了。要是我看得更认真一点的话,直接就能看到这个结论了。不过反过来想,既然我不愿意顺着别人的思路来推导这个模型,自然也不会认真地观察最终的结论,所以最终还是要靠这个方法才能得到LDA的直观理解。

大致介绍一下LDA。LDA是文本分析里面一个很有名的topic
model,它基于一个简单的词袋模型,通过概率建模,得到文档和词汇的主题分布。这个模型很为人称道的一个特点,是它的数学推导是比较优雅的,由给定的先验Dirichlet分布,得到文档生成的似然函数,然后得到Gibbs
Sampling收敛时的分布,就是topic的对应分布。LDA在前些日子还是挺流行的,网络上好的介绍文章很多,比如这个blog,新浪的同学写的LDA漫游指南,还有腾讯的LDA数学八卦,都有很详细的推导过程。

以下就是我折腾这个“Topic Model”的过程。

直观topic model的思路

最简单的想法,当然就是基于聚类的思想,本质上LDA也是一种聚类,比如GMM也是通过概率模型得到似然函数来实现聚类的。同时LDA已经给我们提供了非常好的训练方法了,那就是Gibbs Sampling,可以简单地把它理解为一种迭代算法,或者本质一点就是将系统演化到热力学平衡态的方式,Markov模型的稳态对应的就是热力学平衡态。那么这就是一个典型的Ising model,我们现在要做的事情非常简单,就是给出一些更直观的演化规则,也就是每个词每一次应该如何决定跳转到哪个topic

在思考规则之前,先简化一下问题,方便验证新的规则是否能得到合理的topic分布。同时还应该找个标准的LDA实现,跟标准结果进行对比。

问题的极端版本

这里先处理极端版本,给定3篇文档,9个词,每个文档拥有3个词,每个词只属于一篇文档,用简单的词项向量来表示文档如下


d1 = [(1, 10.0), (2, 10.0), (3, 10.0)]
d2 = [(4, 10.0), (5, 10.0), (6, 10.0)]
d3 = [(7, 10.0), (8, 10.0), (9, 10.0)]

1-9就是词id,后面的10是词的词频。这里权重统一取10是为了后面拓展对比。虽然这里每个文档出现多次的同一个词抽象成了词频,对实际上在训练的时候,是应该每个词(不同位置算两个)单独跳转的。

非常显然,对于这种情况,如果设定topic数目为3,最合理的topic分布是每篇文章完全1个topic,每个词也完全对应一个topic。(如果topic数目设为4呢?理想的情况当然是还是只有3个topic是有意义的,比如前面讨论cluster算法的鲁棒性,这里暂不考虑这个问题)

标准LDA结果

这里的标准LDA实现用了gensim,代码和结果如下
测试代码

corpus = [[(1, 10.0), (2, 10.0), (3, 10.0)],
          [(4, 10.0), (5, 10.0), (6, 10.0)],
          [(7, 10.0), (8, 10.0), (9, 10.0)]
          ]
model = gensim.models.LdaModel(corpus, num_topics=3, update_every=0, passes=20)
print 'topic 0:', model.print_topic(0)
print 'topic 1:', model.print_topic(1)
print 'topic 2:', model.print_topic(2)
for i in range(1, 10):
    print 'word', i, model.get_term_topics(i)

输出结果(事实上&#x

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值