SKLearn NMF与自定义NMF

时间:2018-03-17 14:23:30

标签: python tensorflow scikit-learn recommendation-engine nmf

我正在尝试使用非负矩阵分解来构建推荐系统。使用scikit-learn NMF作为模型,我适合我的数据,导致一定的损失(即重建错误)。然后,我使用inverse_transform方法生成新数据的建议。

现在我使用我在TensorFlow中构建的另一个模型来做同样的事情。训练后的重建误差接近于早先使用sklearn方法获得的重建误差。 但是,潜在因素也不是相似的,也不是最终的推荐。

我所知道的两种方法之间的区别是: 在sklearn中,我使用的是Coordinate Descent求解器,而在TensorFlow中,我使用的是基于Gradient Descent的AdamOptimizer。 其他一切似乎都是一样的:

  1. 使用的损失函数是Frobenius Norm
  2. 两种情况都没有正规化
  3. 使用相同数量的潜在维度对相同数据进行测试
  4. 我正在使用的相关代码:

    1。 scikit-learn方法:

    model =  NMF(alpha=0.0, init='random', l1_ratio=0.0, max_iter=200, 
    n_components=2, random_state=0, shuffle=False, solver='cd', tol=0.0001, 
    verbose=0)
    model.fit(data)
    result = model.inverse_transform(model.transform(data))
    

    2。 TensorFlow方法:

    w = tf.get_variable(initializer=tf.abs(tf.random_normal((data.shape[0], 
    2))), constraint=lambda p: tf.maximum(0., p))
    h = tf.get_variable(initializer=tf.abs(tf.random_normal((2, 
    data.shape[1]))), constraint=lambda p: tf.maximum(0., p))
    loss = tf.sqrt(tf.reduce_sum(tf.squared_difference(x, tf.matmul(w, h))))
    

    我的问题是,如果这两种方法产生的建议不匹配,那么我该如何确定哪些是正确的? 根据我的用例,sklearn的NMF给了我很好的结果,但不是TensorFlow的实现。如何使用我的自定义实现实现相同的目标?

1 个答案:

答案 0 :(得分:2)

优化程序的选择对培训质量有很大影响。一些非常简单的模型(我正在考虑GloVe)可以与一些优化器一起使用,而不与其他一些优化器一起使用。然后,回答你的问题:

  1.   

    我如何确定哪些是正确的?

  2. 评估与模型的设计同样重要,并且它很难,即您可以尝试这两个模型和几个可用数据集,并使用一些指标对它们进行评分。您还可以在实际案例应用程序上使用A / B测试来估计您的建议的相关性。

    1.   

      如何使用自定义实现实现相同目的?

    2. 首先,尝试为 Tensorflow 找到坐标下降优化器,并确保您实施的所有步骤与 scikit-learn 中的步骤完全相同。然后,如果你不能重现相同的,尝试不同的解决方案(为什么你不首先尝试一个简单的梯度下降优化器?)并利用 Tensorflow 提供的伟大的模块化!

      最后,如果您的实施提供的建议很糟糕,我建议您输入错误。尝试与某些existing codes进行比较。