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

时间:2016-10-17 16:57:08

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

我在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将基于其关联的文档通过术语频率分类到主题列表,而这些主题又基于它们与术语频率的关联。

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

所以我现在要做的是执行相同的过程,只修复主题定义矩阵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 ,那么如果 V ,我该如何返回 H w ^

2 个答案:

答案 0 :(得分:1)

初始等式为:initial equation我们为H解决此问题:How to solve it for H

此处inverse of W表示矩阵W的倒数,仅当W为非奇异时才存在。

乘法顺序一如既往地很重要。如果您有if the order is changed,则需要将V乘以W的倒数乘以no description

答案 1 :(得分:0)

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

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

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