【问题标题】:Scikit-learn non-negative matrix factorization (NMF) for sparse matrix用于稀疏矩阵的 Scikit-learn 非负矩阵分解 (NMF)
【发布时间】:2017-07-10 11:50:03
【问题描述】:

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

谢谢!

【问题讨论】:

    标签: python scikit-learn nmf


    【解决方案1】:

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

    如果您使用 NMF 进行推荐,那么您将通过查找 W 和 H 来分解您的数据矩阵 X,使得 W.H 大约等于 X,条件是所有三个矩阵都是非负的。当您重建此矩阵 X 时,一些缺失值(您将在其中存储零)可能变为非零,而一些可能保持为零。此时,在重构矩阵中,这些值就是您的预测。

    那么回答您的问题,它们是 0 还是 NMF 模型中的缺失数据?拟合后的 NMF 模型将包含您的预测值,因此我会将它们视为零。这是一种预测数据中缺失值的方法。

    【讨论】:

    • “把它们算为零”——你的意思是什么?我认为@cech 是在询问是否在损失函数中考虑了稀疏矩阵隐含的零条目(是 $WH$ 产品试图重建 0 条目)还是损失函数忽略隐含的零条目以便稍后进行推理(即用户A 没有给产品 B 打分,如果他给 B 打分,他会给什么打分……而不是用户 A 给产品 B 打分 0)
    【解决方案2】:

    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,因此可以通过忽略其他元素进行完美重构,因此考虑到此输出,情况并非如此。

    【讨论】:

      猜你喜欢
      • 2015-08-04
      • 2019-05-29
      • 1970-01-01
      • 2015-10-11
      • 2017-09-06
      • 2018-05-12
      • 1970-01-01
      • 2018-09-25
      • 2012-11-24
      相关资源
      最近更新 更多