我正在尝试使用非负矩阵分解来构建推荐系统。使用scikit-learn NMF作为模型,我拟合了我的数据,导致了一定的损失(即重建错误)。然后我使用inverse_transform方法为新数据生成推荐。
现在我使用我在 TensorFlow 中构建的另一个模型做同样的事情。训练后的重建误差与之前使用 sklearn 的方法获得的误差接近。但是,潜在因素和最终建议都不是彼此相似的。
我知道的两种方法之间的一个区别是:在 sklearn 中,我使用的是坐标下降求解器,而在 TensorFlow 中,我使用的是基于梯度下降的 AdamOptimizer。其他一切似乎都一样:
- 使用的损失函数是 Frobenius 范数
- 在这两种情况下都没有正则化
- 使用相同数量的潜在维度对相同数据进行测试
我正在使用的相关代码:
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 实现。如何使用我的自定义实现来实现相同的目标?