【问题标题】:Are Topic Distributions of Documents in LDA Space Probabilistic?LDA 空间中文档的主题分布是概率性的吗?
【发布时间】:2017-12-18 18:06:07
【问题描述】:

我知道 LDA 模型的创建是概率性的,在同一个语料库上以相同参数训练的两个模型不一定相同。但是,我想知道输入 LDA 模型的文档的主题分布是否也是概率性的。

我有一个 LDA 模型,如下所示:

lda = models.LdaMulticore(corpus=corpus, id2word=dictionary, num_topics=numTopics,passes=10)

还有两个文档,Doc1 和 Doc2。我想在lda空间中求两个文档的余弦相似度,这样:

x = cossim(lda[Doc1], lda[Doc2]).

我注意到的问题是,当我通过多次迭代运行它时,余弦相似度并不总是相同的。 (即使我使用相同的保存 LDA 模型)。相似度极其相似,但每次总是有点偏离。在我的实际代码中,我有数百个文档,因此我将主题分布转换为密集向量并使用 numpy 在矩阵中进行计算:

documentsList = np.array(documentsList)
calcMatrix=1-cdist(documentsList, documentsList, metric=self.metric)

我是否遇到了 numpy 的舍入错误(或我的代码中的另一个错误),还是我在使用 lda 查找文档的主题分布时应该预料到的这种行为?

编辑:我将使用我的 lda 模型对 2 个不同的文档运行简单的余弦相似度,并绘制结果的分布图。我会报告我的发现。

好的,这是使用相同的 LDA 模型对 2 个文档运行余弦相似度的结果。

这是我的代码:

def testSpacesTwoDocs(doc1, doc2, dictionary):
    simList = []
    lda = gensim.models.ldamodel.LdaModel.load('LDA_Models/lda_bow_behavior_allFields_t385_p10')
    for i in range(50):
        doc1bow = dictionary.doc2bow(doc1)
        doc2bow = dictionary.doc2bow(doc2)

        vec1 = lda[doc1bow]
        vec2 = lda[doc2bow]

        S = matutils.cossim(vec1, vec2)
        simList.append(S)


    for entry in simList:
        print entry

    sns.set_style("darkgrid")
    plt.plot(simList, 'bs--')
    plt.show()


    return

这是我的结果: 0.0082616863035, 0.00828413767524, 0.00826550453411, 0.00816756826185, 0.00829832701338, 0.00828970584276, 0.00828578705814, 0.00817109902484, 0.00817138247141, 0.00825297374028, 0.008269435921, 0.00826470121538, 0.00818282042634, 0.00824660449673, 0.00818087532906, 0.0081770261766, 0.00817128310123, 0.00817643202588, 0.00827404791376, 0.00832439428054, 0.00816643128216, 0.00828540881955, 0.00825746652101, 0.00816793513824, 0.00828471827526, 0.00827161219003, 0.00817773114553, 0.00826166001503, 0.00828048713541, 0.00817435544365, 0.0082956702812, 0.00826167470288, 0.00829873425476, 0.00825744872634, 0.00826802120149, 0.00829604894909, 0.0081776752236, 0.00817613482849, 0.00825839326441, 0.00817530362838, 0.0081747561999, 0.0082597447174, 0.00828958180101, 0.00827157760835, 0.00826939127657, 0.00826138381094, 0.00817755590806, 0.00827135780051, 0.00827314260067, 0.00817035250043

我是否正确假设 LDA 模型在每次迭代时都在推断两个文档的主题分布,因此余弦相似性是随机的而不是确定性的?如此多的变化是否表明我训练模型的时间不够长?还是我没有正确规范化向量?谢谢

谢谢

【问题讨论】:

  • 您能否进一步详细说明极其相似但不相同的部分?它们的差异有多大?
  • 我刚刚进行了测试,使用 numpy 获得了 0.0887、0.0901 和 0.0879 的平均相似度值,使用我原来的迭代方法获得了 0.0894 和 0.0884 的平均相似度值。我将在我原来的帖子中解释我所说的“平均”是什么意思。

标签: python numpy gensim lda


【解决方案1】:

尝试在训练 LDA 模型时将 random_state 设置为相同的状态。

lda = models.LdaMulticore(corpus=corpus, id2word=dictionary, num_topics=numTopics, passes=10, random_state=0)

当 LDA 初始化时,以及在推理过程中,它使用随机矩阵将噪声引入模型。这种噪音很小,一般不会对最终结果产生太大影响——只要提供足够的数据。

【讨论】:

    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2016-02-03
    相关资源
    最近更新 更多