我正在使用 Scikit-learn 的非负矩阵分解 (NMF) 在零条目缺失数据的稀疏矩阵上执行 NMF。我想知道 Scikit-learn 的 NMF 实现是否将零条目视为 0 或缺少数据。
谢谢!
我正在使用 Scikit-learn 的非负矩阵分解 (NMF) 在零条目缺失数据的稀疏矩阵上执行 NMF。我想知道 Scikit-learn 的 NMF 实现是否将零条目视为 0 或缺少数据。
谢谢!
在您的数据矩阵中,缺失值可以为 0,但您通常不会为非常稀疏的矩阵存储一堆零,而是通常存储一个 COO 矩阵,其中每一行都以 CSR 格式存储。
如果您使用 NMF 进行推荐,那么您将通过查找 W 和 H 来分解您的数据矩阵 X,使得 WH 大约等于 X,条件是所有三个矩阵都是非负的。当您重建此矩阵 X 时,一些缺失值(您将在其中存储零)可能变为非零,而一些可能保持为零。此时,在重构矩阵中,这些值就是您的预测。
因此,要回答您的问题,它们是 0 还是 NMF 模型中的缺失数据?拟合后的 NMF 模型将包含您的预测值,因此我会将它们视为零。这是一种预测数据中缺失值的方法。
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,因此可以通过忽略其他元素来完美重建,因此考虑到此输出,情况并非如此。