概述
1.LDA是主题生成模型,由三层贝叶斯模型构成。
三层贝叶斯包括:文档-主题、主题-词、前两者的联合分布。
2.对每篇文章(或者每个topic)而言,文章-主题属于多项式分布。
而多篇文章组成的多项式分布并不属于同一个多项式分布(参数不同)。由于主题是属于具体的每篇文章的,所以不能使用类似NB的策略。
多项式分布和Dirichlet分布属于共轭分布。因此多篇文档的分布可以构成一个分布:dirichlet分布。
因此,可以得到文档-主题的dirichlet分布、主题-词的dirichlet分布。因此文档和词的分布可以由前面两种dirichlet分布的联合分布获得。
3.现在我们得到了最终的一个分布公式。
由于训练样本比较大,通常情况下,我们都是选择对样本进行抽样进行优化计算过程。
抽样由马尔科夫链蒙特卡洛抽样方法,其核心是MH算法。而Gibbs sampling是该算法的特例。
吉布斯采用通过计算边缘分布,一步步的得到最终样本。
有了上述样本之后,便可以进行计算。
4.由于上述分布公式过于复杂
我们没必要求出精确的参数值(即使算出具体的参数值,也可能出现过拟合的现象。这也是贝叶斯派相对频率派的区别),也很难算出具体的值。
这里面就涉及到EM算法(期望最大值算法)。
1.E步:
我们通过计算类似似然函数的方法,求解得到一个简化的函数,Q函数(正态分布的右尾函数)。
2.M步:
通过对上述获得的Q函数进行优化,计算出最终的参数值。即可得到两个dirichlet分布的参数。
这里有个问题:为什么一定可以求解得到参数?
因为文档-主题、主题-词从事实上来讲,是有一个分类的(这也是说为什么人可以进行打标,因为我们认为谋篇文章就属于某一类、某个词以多大可能性属于某主题)
5.通过上述过程,我们计算得到最终的两个参数:θ、fai
上述的文档-主题是训练样本中辅助我们对生成主题的参数,因此θ只是在训练集中有效。最终结果我们将主题-词模型用于新样本的识别。
6.示例:
# -*- coding: utf-8 -*-
import numpy as np
import lda
import lda.datasets
''' 1.导入数据源 '''
#通过LDA库自带的API接口调用路透社的数据
X = lda.datasets.load_reuters()
vocab = lda.datasets.load_reuters_vocab()
titles = lda.datasets.load_reuters_titles()
#设置主题数目为20个,每个主题包含8个词语,模型迭代次数为1500次
model = lda.LDA(n_topics=20,n_iter=1500,random_state=1)
model.fit(X)
topic_word = model.topic_word_
n_top_words = 8
''' 2.求解P(词语|主题),得到每个主题所包含的单词的分布 '''
for i,topic_dist in enumerate(topic_word):
topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n_top_words+1):-1]
#输出每个主题所包含的单词的分布
print('Topic {}:{}'.format(i,' '.join(topic_words)))
''' 3.求解P(主题|文档),得到文章所对应的主题 '''
doc_topic = model.doc_topic_
for i in range(20):
#输出文章所对应的主题
print("{} (top topic:{})".format(titles[i],doc_topic[i].argmax()))
最后
以上就是务实水蜜桃为你收集整理的机器学习之LDA的全部内容,希望文章能够帮你解决机器学习之LDA所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复