【问题标题】:probability distribution of topics using NMF使用 NMF 的主题概率分布
【发布时间】:2017-10-10 07:14:42
【问题描述】:

我使用以下代码对我的文档进行主题建模:

from sklearn.feature_extraction.text import TfidfVectorizer, CountVectorizer
tfidf_vectorizer = TfidfVectorizer(tokenizer=tokenize, max_df=0.85, min_df=3, ngram_range=(1,5))

tfidf = tfidf_vectorizer.fit_transform(docs)
tfidf_feature_names = tfidf_vectorizer.get_feature_names()


from sklearn.decomposition import NMF

no_topics = 50

%time nmf = NMF(n_components=no_topics, random_state=11,  init='nndsvd').fit(tfidf)
topic_pr= nmf.transform(tfidf)

我认为 topic_pr 为我提供了每个文档的不同主题的概率分布。换句话说,我预计输出(topic_pr)中的数字将是第 X 行中的文档属于模型中 50 个主题中的每一个的概率。但是,这些数字加起来不等于 1。这些真的是概率吗?如果不是,有没有办法将它们转换为概率?

谢谢

【问题讨论】:

    标签: scikit-learn topic-modeling nmf


    【解决方案1】:

    NMF 返回一个非负分解,与概率没有任何关系(据我所知)。如果你只想要概率,你可以转换 NMF 的输出(L1 归一化)

    probs = topic_pr / topic_pr.sum(axis=1, keepdims=True)
    

    这假设 topic_pr 是一个非负矩阵,这在您的情况下是正确的。


    编辑:显然有一个概率版本的 NMF。

    引用sklearn's documetation:

    非负矩阵分解应用于两个不同的目标函数:Frobenius 范数和广义 Kullback-Leibler 散度。后者相当于概率潜在语义索引。

    从同一个链接应用后者,这是您似乎需要的:

    lda = LatentDirichletAllocation(n_components=no_topics, max_iter=5)
    topic_pr = lda.fit_transform(tfidf)
    

    【讨论】:

    • 感谢您的帮助。我试过code nmf = NMF(n_components=no_topics, random_state=1, beta_loss='kullback-leibler', solver='mu', alpha=.1, l1_ratio=.5).fit(tfidf) 但仍然是结果加起来不等于 1。我做错了什么吗?
    • 您是否尝试使用我答案的最后两行而不是 NMF?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    相关资源
    最近更新 更多