使用保存的 W 矩阵应用矩阵分解进行分类

Applying a matrix decomposition for classification using a saved W matrix

我正在对 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

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

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

我想将主题术语关联保存到磁盘,以便稍后重新应用它们 - 并采用此处描述的方法[ 来存储 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,那我怎么returnH,给定 VW?

初始方程是:,我们这样求解 .

此处表示矩阵的逆矩阵,仅当为非奇异矩阵时才存在。

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

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

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

这 returns(假设词汇表对齐)文档到主题的映射 H 基于预生成的主题模型 W 和由 tfidf.

生成的文档特征矩阵 V