LatentDirichletAllocation python

时间:2018-05-28 10:16:40

标签: python scikit-learn lda

我通过python库的scikit使用以下代码进行LatentDirichletAllocation:

tf_vectorizer = CountVectorizer(max_df=0.95, min_df=2, stop_words='english')
tf = tf_vectorizer.fit_transform(documents)

lda_model = LatentDirichletAllocation(n_components=10, max_iter=5, 
learning_method='online', learning_offset=50.,random_state=0).fit(tf)
lda_W = lda_model.transform(tf)
lda_H = lda_model.components_

当我打印lda_H的形状它返回(10,236)时,我知道10是主题编号,236是单词。我希望看到alpha对此的影响,所以我将上面的代码更改为:

lda_model = LatentDirichletAllocation(n_components=10,doc_topic_prior=.01, max_iter=5, 
learning_method='online', learning_offset=50.,random_state=0).fit(tf)
lda_W = lda_model.transform(tf)
lda_H = lda_model.components_

然而我发现alpha对主题中的单词没有影响,lda_H仍然返回(10,236)。我想知道为什么alpha不会改变主题中的单词。我尝试了不同的alpha值,但在lda_H中没有观察到变化 如有任何意见,请表示赞赏。

1 个答案:

答案 0 :(得分:0)

Alpha是一个控制每个文档主题分布形状的参数,不会影响主题数量。主题数量未推断,但先验地由no_topics确定。

每个文档始终是所有主题的混合分布,alpha控制每个文档的所有主题的概率分布。我们可以根据我们先验是否期望每个文档在所有主题上相对均匀混合,或者我们是否期望将大部分概率分配给每个文档的较小主题集来设置它。

带有alpha的更改应反映在transform来电的回复中,您已将其分配给lda_W。这给出了每个文档主题分布的矩阵。它仍然是相同的形状:(n_samples, n_topics),但您应该看到每行(文档)的概率平均值的变化。例如,您可以通过设置阈值概率并检查超出此概率的每个文档的主题数量来衡量这一点,在所有文档中进行平均,并比较两个alpha值。

主题分布也被推断为所有单词的混合分布,因此单词的数量不会改变,而是每个主题分配给每个单词的概率。

值得给original paper on LDA一个读数,以便更深入地解释算法正在做什么。