狄利克雷分布的概率密度函数为

p ( θ ∣ α ) = Γ ( ∑ i = 1 k α i ) ∏ i = 1 k Γ ( α i ) ∏ i = 1 k θ i α i − 1 p ( \theta | \alpha ) = \frac { \Gamma ( \sum _ { i = 1 } ^ { k } \alpha _ { i } ) } { \prod _ { i = 1 } ^ { k } \Gamma ( \alpha _ { i } ) } \prod _ { i = 1 } ^ { k } \theta _ { i } ^ { \alpha _ { i } - 1 } p(θα)=i=1kΓ(αi)Γ(i=1kαi)i=1kθiαi1

其中 ∑ i = 1 k θ i = 1 , θ i ≥ 0 , α = ( α 1 , α 2 , ⋯   , α k ) , α i > 0 , i = 1 , 2 , ⋯ 、 \sum _ { i = 1 } ^ { k } \theta _ { i } = 1 , \theta _ { i } \geq 0 , \alpha = ( \alpha _ { 1 } , \alpha _ { 2 } , \cdots , \alpha _ { k } ) , \alpha _ { i } > 0 , i = 1,2 , \cdots、 i=1kθi=1,θi0,α=(α1,α2,,αk),αi>0,i=1,2,

狄利克雷分布是多项分布的共轭先验


潜在狄利克雷分配

潜在狄利克雷分配(LDA)是文本集合的生成概率模型

模型假设话题由单词的多项分布表示,文本由话题的多项分布表示,单词分布和话题分布的先验分布都是狄利克雷分布

LDA模型属于概率图模型可以由板块表示法表示LDA模型中,每个话题的单词分布、每个文本的话题分布、文本的每个位置的话题是隐变量,文本的每个位置的单词是观测变量


LDA生成文本集合的生成过程如下:

  1. 话题的单词分布:随机生成所有话题的单词分布,话题的单词分布是多项分布,其先验分布是狄利克雷分布
  2. 文本的话题分布:随机生成所有文本的话题分布,文本的话题分布是多项分布,其先验分布是狄利克雷分布
  3. 文本的内容:随机生成所有文本的内容在每个文本的每个位置,按照文本的话题分布随机生成一个话题,再按照该话题的单词分布随机生成一个单词

LDA模型的学习与推理不能直接求解通常采用的方法是吉布斯抽样算法和变分EM算法,前者是蒙特卡罗法而后者是近似算法


LDA的收缩的吉布斯抽样算法的基本想法如下目标是对联合概率分布 p ( w , z , θ , φ ∣ α , β ) p ( w , z , \theta , \varphi | \alpha , \beta ) p(w,z,θ,φα,β)

进行估计通过积分求和将隐变量 θ \theta θ φ \varphi φ消掉,得到边缘概率分布 p ( w , z ∣ α , β ) p ( w , z | \alpha , \beta ) p(w,zα,β)

对概率分布 p ( w ∣ z , α , β ) p ( w | z , \alpha , \beta ) p(wz,α,β)进行吉布斯抽样,得到分布 p ( w ∣ z , α , β ) p ( w | z , \alpha , \beta ) p(wz,α,β)的随机样本

再利用样本对变量 z z z θ \theta θ φ \varphi φ的概率进行估计

最终得到LDA模型 p ( w , z , θ , φ ∣ α , β ) p ( w , z , \theta , \varphi | \alpha , \beta ) p(w,z,θ,φα,β)的参数估计具体算法如下对给定的文本单词序列

每个位置上随机指派一个话题,整体构成话题系列然后循环执行以下操作对整个文本序列进行扫描

在每一个位置上计算在该位置上的话题的满条件概率分布,然后进行随机抽样,得到该位置的新的话题,指派给这个位置


变分推理的基本想法如下假设模型是联合概率分布 p ( x , z ) p ( x , z ) p(x,z),其中 x x x是观测变量(数据)

z z z是隐变量目标是学习模型的后验概率分布 p ( z ∣ x ) p ( z | x ) p(zx)考虑用变分分布 q ( z ) q ( z ) q(z)近似条件概率分布 p ( z ∣ x ) p ( z | x ) p(zx)

用KL散度计算两者的相似性找到与 p ( z ∣ x ) p ( z | x ) p(zx)在KL散度意义下最近的 q ∗ ( z ) q ^ { * } ( z ) q(z)

用这个分布近似 p ( z ∣ x ) p ( z | x ) p(zx)假设 q ( z ) q ( z ) q(z)中的 z z z的所有分量都是互相独立的利用Jensen不等式

得到KL散度的最小化可以通过证据下界的最大化实现因此,变分推理变成求解以下证据下界最大化问题:

L ( q , θ ) = E q [ log ⁡ p ( x , z ∣ θ ) ] − E q [ log ⁡ q ( z ) ] L ( q , \theta ) = E _ { q } [ \operatorname { log } p ( x , z | \theta ) ] - E _ { q } [ \operatorname { log } q ( z ) ] L(q,θ)=Eq[logp(x,zθ)]Eq[logq(z)]

LDA的变分EM算法如下针对LDA模型定义变分分布

应用变分EM算法目标是对证据下界 L ( γ , η , α , φ ) L ( \gamma , \eta , \alpha , \varphi ) L(γ,η,α,φ)进行最大化

其中 α \alpha α φ \varphi φ是模型参数 γ \gamma γ η \eta η是变分参数交替迭代E步和M步,直到收敛

  • E步:固定模型参数 α \alpha α φ \varphi φ,通过关于变分参数 γ \gamma γ η \eta η的证据下界的最大化,估计变分参数 γ \gamma γ η \eta η
  • M步:固定变分参数 γ \gamma γ η \eta η,通过关于模型参数 α \alpha α φ \varphi φ的证据下界的最大化,估计模型参数 α \alpha α φ \varphi φ"

潜在狄利克雷分配(latent Dirichlet allocation,LDA)

作为基于贝叶斯学习的话题模型,是潜在语义分析、概率潜在语义分析的扩展

于2002年由Blei等提出dA在文本数据挖掘、图像处理、生物信息处理等领域被广泛使用

LDA模型是文本集合的生成概率模型假设每个文本由话题的一个多项分布表示

每个话题由单词的一个多项分布表示,特别假设文本的话题分布的先验分布是狄利克雷分布

话题的单词分布的先验分布也是狄利克雷分布先验分布的导入使LDA能够更好地应对话题模型学习中的过拟合现象

LDA的文本集合的生成过程如下

首先随机生成一个文本的话题分布,之后在该文本的每个位置,依据该文本的话题分布随机生成一个话题

然后在该位置依据该话题的单词分布随机生成一个单词,直至文本的最后一个位置,生成整个文本重复以上过程生成所有文本

LDA模型是含有隐变量的概率图模型模型中,每个话题的单词分布,每个文本的话题分布

文本的每个位置的话题是隐变量

文本的每个位置的单词是观测变量LDA模型的学习与推理无法直接求解

通常使用吉布斯抽样( Gibbs sampling)和变分EM算法(variational EM algorithm)

前者是蒙特卡罗法,而后者是近似算法


from gensim import corpora, models, similarities
from pprint import pprint
import warnings

Text = 
[['human', 'machine', 'interface', 'lab', 'abc', 'computer', 'applications'],
 ['survey', 'user', 'opinion', 'computer', 'system', 'response', 'time'],
 ['eps', 'user', 'interface', 'management', 'system'],
 ['system', 'human', 'system', 'engineering', 'testing', 'eps'],
 ['relation', 'user', 'perceived', 'response', 'time', 'error', 'measurement'],
 ['generation', 'random', 'binary', 'unordered', 'trees'],
 ['intersection', 'graph', 'paths', 'trees'],
 ['graph', 'minors', 'iv', 'widths', 'trees', 'well', 'quasi', 'ordering'],
 ['graph', 'minors', 'survey']]

dictionary = corpora.Dictionary(texts)
V = len(dictionary)
corpus = [dictionary.doc2bow(text) for text in texts]
corpus_tfidf = models.TfidfModel(corpus)[corpus]
corpus_tfidf = corpus
lsi = models.LsiModel(corpus_tfidf, num_topics=2, id2word=dictionary)
topic_result = [a for a in lsi[corpus_tfidf]]
pprint(lsi.print_topics(num_topics=2, num_words=5))
similarity = similarities.MatrixSimilarity(lsi[corpus_tfidf])   # similarities.Similarity()
num_topics = 2
lda = models.LdaModel(
    corpus_tfidf,
    num_topics=num_topics,
    id2word=dictionary,
    alpha='auto',
    eta='auto',
    minimum_probability=0.001,
    passes=10)
doc_topic = [doc_t for doc_t in lda[corpus_tfidf]]
for doc_topic in lda.get_document_topics(corpus_tfidf):
    print(doc_topic)
for topic_id in range(num_topics):
    print('Topic', topic_id)
    # pprint(lda.get_topic_terms(topicid=topic_id))
    pprint(lda.show_topic(topic_id))
similarity = similarities.MatrixSimilarity(lda[corpus_tfidf])
print('Similarity:')
pprint(list(similarity))

hda = models.HdpModel(corpus_tfidf, id2word=dictionary)
topic_result = [a for a in hda[corpus_tfidf]]
print('\n\nUSE WITH CARE--\nHDA Model:')
pprint(topic_result)
print('HDA Topics:')
print(hda.print_topics(num_topics=2, num_words=5))
11-29 11:42