Scikit-学习稀疏矩阵的非负矩阵分解(NMF)

时间:2017-02-21 02:09:08

标签: python scikit-learn nmf

我正在使用Scikit-learn的非负矩阵分解(NMF)在稀疏矩阵上执行NMF,其中零条目缺少数据。我想知道Scikit-learn的NMF实现是否将零条目视为0或缺少数据。

谢谢!

2 个答案:

答案 0 :(得分:1)

在数据矩阵中,缺失值可以是0,但不是为非常稀疏的矩阵存储一堆零,而是通常存储COO矩阵,其中每行以CSR格式存储。

如果您正在使用NMF作为建议,那么您将通过找到W和H来分解数据矩阵X,使得W.H近似等于X,条件是所有三个矩阵都是非负的。当您重建此矩阵X时,某些缺失值(您将存储零的位置)可能变为非零,而某些可能保持为零。此时,在重建矩阵中,值是您的预测。

那么要回答你的问题,NMF模型中的数据是0还是缺少数据?一旦拟合,NMF模型将包含您的预测值,因此我将其计为零。这是一种预测数据中缺失值的方法。

答案 1 :(得分:0)

NMF将其计数为零。 我用以下代码弄清楚了:

from scipy import sparse
from sklearn.decomposition import NMF
import numpy as np

mat = np.array([[1,1,1],
                [1,1,0],
                [1,0,0]], 'float32')

ix = np.nonzero(mat)
sparse_mat = sparse.csc_matrix((mat[ix], ix))
print('training matrix:')
print(sparse_mat.toarray())

model = NMF(n_components=1).fit(sparse_mat)
reconstructed = model.inverse_transform(model.transform(sparse_mat))
print('reconstructed:')
print(reconstructed)

结果:

training matrix:
[[1. 1. 1.]
 [1. 1. 0.]
 [1. 0. 0.]]
reconstructed:
[[1.22 0.98 0.54]
 [0.98 0.78 0.44]
 [0.54 0.44 0.24]]

请注意,所有非零元素都是1,因此可以通过忽略其他元素来实现完美的重构,因此考虑此输出,并非如此。