Python SKLearn NMF Vs定制NMF
我正在尝试使用非负矩阵分解构建一个推荐系统。作为模型,我拟合数据,导致一定的损失(即重建误差)。然后,我使用该方法生成新数据的推荐 现在我使用TensorFlow中构建的另一个模型做同样的事情。训练后的重建误差与之前使用sklearn方法得到的重建误差接近。 然而,潜在因素和最终建议都不相似 我知道这两种方法之间的一个区别是: 在sklearn中,我使用坐标下降解算器,而在TensorFlow中,我使用基于梯度下降的AdamOptimizer。 其他一切似乎都是一样的:Python SKLearn NMF Vs定制NMF,python,tensorflow,scikit-learn,recommendation-engine,nmf,Python,Tensorflow,Scikit Learn,Recommendation Engine,Nmf,我正在尝试使用非负矩阵分解构建一个推荐系统。作为模型,我拟合数据,导致一定的损失(即重建误差)。然后,我使用该方法生成新数据的推荐 现在我使用TensorFlow中构建的另一个模型做同样的事情。训练后的重建误差与之前使用sklearn方法得到的重建误差接近。 然而,潜在因素和最终建议都不相似 我知道这两种方法之间的一个区别是: 在sklearn中,我使用坐标下降解算器,而在TensorFlow中,我使用基于梯度下降的AdamOptimizer。 其他一切似乎都是一样的: 使用的损失函数是Frob
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))
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))))
2。TensorFlow方法:
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))
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实现。如何使用自定义实现实现同样的效果?优化器的选择对培训质量有很大影响。一些非常简单的模型(例如,我在考虑手套)与一些优化器一起工作,而与其他一些完全不工作。然后,回答您的问题:
最后,如果您的实现提供的建议有那么糟糕,我建议您有一个错误。试着与一些进行比较。一个人可以写关于所有这些组件的多页,但我们只需说:这是非凸优化,收敛(如果发生)取决于初始值(可能存在不同的局部极小值)。如果看不到代码,就很难准确地理解您正在做什么。(此外:如果没有正则化,您可能无法在推荐设置中获得良好的结果;此外:大多数推荐人不使用NMF,那么您使用它的原因是什么?@sascha-修改了帖子以包含代码。我确实意识到多个局部极小值,它们很可能不会收敛到同一点。但是,我想了解如何使用自定义实现获得良好的结果。我知道为了获得更好的结果,正则化是必要的,但这只是一个基本的例子,我想首先使用这两种方法获得可比较的结果。你是说协同过滤,基于内容的方法?然后研究所有组件,使用相同的初始点,调整优化器,使其更保守/更本地化(不是Adam;简单的香草SGD;小步长,多its)。但我认为这样做没有任何好处。我在备选方案方面的意思是具有更好的秩代理(跟踪范数或最大范数)的低秩矩阵分解。简言之:不同的损失,更难优化,但可行,即使在大规模(在某些假设下)。已经使用相同的初始值,也尝试使用SGD和一系列超参数。NMF是否也是低秩矩阵分解的一种形式,因为与原始维数相比,潜在维数非常小?已经使用SGD进行了尝试,与使用Adam相比,最终结果没有太大差异(不考虑收敛时间)。我还遵循了与您链接的代码完全相同的代码,上面的结果就是基于此。您所说的“从Tensorflow提供的强大模块化中获利”是什么意思?您能详细说明一下吗?模块化是指您可以轻松地更改代码的某些部分(优化器、约束、丢失、正则化等)