【问题标题】:Applying a matrix decomposition for classification using a saved W matrix使用保存的 W 矩阵应用矩阵分解进行分类
【发布时间】:2017-02-26 18:12:36
【问题描述】:

我正在对 tf-idf 输入执行 NMF 分解以执行主题分析。

def decomp(tfidfm, topic_count):
    model = decomposition.NMF(init="nndsvd", n_components=topic_count,     max_iter=500)
    H = model.fit_transform(tfidfm)
    W = model.components_
    return W, H

这将返回 W,一个由主题到术语分配的模型定义,以及 H,一个文档到主题分配矩阵

到目前为止一切都很好,我可以使用 H 根据它们通过词频与主题列表的关联对文档进行分类,而主题列表又基于它们与词频的关联。

我想将 topic-term-associations 保存到磁盘,以便稍后重新应用它们 - 并采用此处描述的方法 [https://stackoverflow.com/questions/8955448] 来存储 W 的稀疏矩阵表示。

所以我现在想做的是执行相同的过程,只修复主题定义矩阵 W。

在文档中,我似乎可以在调用参数中设置 W 类似的内容:

def applyModel(tfidfm,W,topic_count):
    model = decomposition.NMF(init="nndsvd", n_components=topic_count, max_iter=500)
    H = model.fit_transform(X=tfidfm, W=W)
    W = model.components_
    return W, H

我已经尝试过了,但它似乎不起作用。

我已经通过使用不同大小的词汇表编译 W 矩阵进行测试,然后将其输入到 applyModel 函数中,结果矩阵的形状应该被定义(或者我应该说,这就是我想要的) 由 W 模型,但事实并非如此。

这个问题的简短版本是:如何保存从矩阵分解生成的主题模型,以便我可以使用它来分类不同于最初生成它的文档集?

换句话说,如果 V=WH,那么我如何返回 H,给定 VW

【问题讨论】:

    标签: python scikit-learn tf-idf matrix-decomposition nmf


    【解决方案1】:

    为了完整起见,这里是重写的 applyModel 函数,它考虑了 ForceBru 的答案(使用 scipy.sparse.linalg 的导入)

    def applyModel(tfidfm,W):
        H = tfidfm * linalg.inv(W)
        return H
    

    这会返回(假设词汇表对齐)文档到主题 H 的映射,该映射基于预生成的主题模型 W 和文档特征矩阵 V 由 tfidf 生成。

    【讨论】:

      【解决方案2】:

      初始方程为:,我们为 求解它,如下所示:。

      这里 表示矩阵 的逆矩阵,它仅在 非奇异时才存在。

      乘法顺序一如既往地重要。如果您有,则需要将 乘以 的倒数,反之:。

      【讨论】:

      • 当然!数学又赢了。我将发布我用来执行矩阵乘法/求逆以获得 H 的解决方案。看起来我正在应用它的应用程序获得有意义的结果。我将很快标记为已回答,但我想保持开放以邀请任何其他答案 - 我期待一些东西融入 scikit,并且如果那里已经有一些东西,我不想复制一个过程。
      猜你喜欢
      • 2015-06-18
      • 2020-01-31
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      • 2012-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多