我正在尝试使用非负矩阵分解来构建推荐系统。使用scikit-learn NMF作为模型,我适合我的数据,导致一定的损失(即重建错误)。然后,我使用inverse_transform方法生成新数据的建议。
现在我使用我在TensorFlow中构建的另一个模型来做同样的事情。训练后的重建误差接近于早先使用sklearn方法获得的重建误差。 但是,潜在因素也不是相似的,也不是最终的推荐。
我所知道的两种方法之间的区别是: 在sklearn中,我使用的是Coordinate Descent求解器,而在TensorFlow中,我使用的是基于Gradient Descent的AdamOptimizer。 其他一切似乎都是一样的:
我正在使用的相关代码:
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的实现。如何使用我的自定义实现实现相同的目标?
答案 0 :(得分:2)
优化程序的选择对培训质量有很大影响。一些非常简单的模型(我正在考虑GloVe)可以与一些优化器一起使用,而不与其他一些优化器一起使用。然后,回答你的问题:
我如何确定哪些是正确的?
评估与模型的设计同样重要,并且它很难,即您可以尝试这两个模型和几个可用数据集,并使用一些指标对它们进行评分。您还可以在实际案例应用程序上使用A / B测试来估计您的建议的相关性。
如何使用自定义实现实现相同目的?
首先,尝试为 Tensorflow 找到坐标下降优化器,并确保您实施的所有步骤与 scikit-learn 中的步骤完全相同。然后,如果你不能重现相同的,尝试不同的解决方案(为什么你不首先尝试一个简单的梯度下降优化器?)并利用 Tensorflow 提供的伟大的模块化!
最后,如果您的实施提供的建议很糟糕,我建议您输入错误。尝试与某些existing codes进行比较。