我是靠谱客的博主 务实水蜜桃,最近开发中收集的这篇文章主要介绍机器学习之LDA,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部