我试图建立一个使用非负矩阵分解的推荐系统。以scikit学习NMF为模型,拟合数据,造成一定的损失(即重建误差)。然后,我使用转换方法生成新数据的推荐。
现在,我使用我在TensorFlow中构建的另一个模型来做同样的事情。训练后的重建误差与以前采用sklearn方法得到的误差相近。然而,潜在的因素既不是相互相似的,也不是最后的建议。
我所知道的两种方法之间的一个不同之处是:在sklearn中,我使用坐标下降求解器,而在TensorFlow中,我使用的是基于梯度下降的AdamOptimizer。其他一切似乎都是一样的:
我正在使用的相关代码:
1.科学方法-学习方法:
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实现。如何使用自定义实现实现相同的功能?
发布于 2018-03-21 12:49:44
优化器的选择对训练质量有很大的影响。一些非常简单的模型(例如,我想到的是GloVe )确实与一些优化器一起工作,而对其他一些模型则完全不起作用。然后,回答你的问题:
评估和模型的设计一样重要,而且很难--您可以尝试这两个模型和几个可用的数据集,并使用一些度量来对它们进行评分。您还可以在实际案例应用程序上使用A/B测试来估计建议的相关性。
首先,尝试为Tensorflow找到一个坐标下降优化器,并确保您实现的所有步骤都与scikit中的步骤完全相同。然后,如果您不能复制相同的,尝试不同的解决方案(为什么不首先尝试一个简单的梯度下降优化器?)并从Tensorflow提供的巨大模块化中获益!
最后,如果您的实现提供的建议如此糟糕,我建议您在其中出现错误。试着与一些现有码进行比较。
https://stackoverflow.com/questions/49337960
复制相似问题