Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SKLearn NMF Vs定制NMF_Python_Tensorflow_Scikit Learn_Recommendation Engine_Nmf - Fatal编程技术网

Python SKLearn NMF Vs定制NMF

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

我正在尝试使用非负矩阵分解构建一个推荐系统。作为模型,我拟合数据,导致一定的损失(即重建误差)。然后,我使用该方法生成新数据的推荐

现在我使用TensorFlow中构建的另一个模型做同样的事情。训练后的重建误差与之前使用sklearn方法得到的重建误差接近。 然而,潜在因素和最终建议都不相似

我知道这两种方法之间的一个区别是: 在sklearn中,我使用坐标下降解算器,而在TensorFlow中,我使用基于梯度下降的AdamOptimizer。 其他一切似乎都是一样的:

  • 使用的损失函数是Frobenius范数
  • 在这两种情况下都没有正规化
  • 使用相同数量的潜在维度对相同数据进行测试
  • 我正在使用的相关代码:

    1。scikit学习方法:

    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实现。如何使用自定义实现实现同样的效果?

    优化器的选择对培训质量有很大影响。一些非常简单的模型(例如,我在考虑手套)与一些优化器一起工作,而与其他一些完全不工作。然后,回答您的问题:

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

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

  • 如何使用自定义实现实现相同的功能

  • 首先,尝试为Tensorflow找到一个坐标下降优化器,并确保您实现的所有步骤与scikit learn中的步骤完全相同。然后,如果您不能复制相同的,那么尝试不同的解决方案(为什么不先尝试一个简单的梯度下降优化器?),并从Tensorflow提供的强大模块化中获益


    最后,如果您的实现提供的建议有那么糟糕,我建议您有一个错误。试着与一些进行比较。

    一个人可以写关于所有这些组件的多页,但我们只需说:这是非凸优化,收敛(如果发生)取决于初始值(可能存在不同的局部极小值)。如果看不到代码,就很难准确地理解您正在做什么。(此外:如果没有正则化,您可能无法在推荐设置中获得良好的结果;此外:大多数推荐人不使用NMF,那么您使用它的原因是什么?@sascha-修改了帖子以包含代码。我确实意识到多个局部极小值,它们很可能不会收敛到同一点。但是,我想了解如何使用自定义实现获得良好的结果。我知道为了获得更好的结果,正则化是必要的,但这只是一个基本的例子,我想首先使用这两种方法获得可比较的结果。你是说协同过滤,基于内容的方法?然后研究所有组件,使用相同的初始点,调整优化器,使其更保守/更本地化(不是Adam;简单的香草SGD;小步长,多its)。但我认为这样做没有任何好处。我在备选方案方面的意思是具有更好的秩代理(跟踪范数或最大范数)的低秩矩阵分解。简言之:不同的损失,更难优化,但可行,即使在大规模(在某些假设下)。已经使用相同的初始值,也尝试使用SGD和一系列超参数。NMF是否也是低秩矩阵分解的一种形式,因为与原始维数相比,潜在维数非常小?已经使用SGD进行了尝试,与使用Adam相比,最终结果没有太大差异(不考虑收敛时间)。我还遵循了与您链接的代码完全相同的代码,上面的结果就是基于此。您所说的“从Tensorflow提供的强大模块化中获利”是什么意思?您能详细说明一下吗?模块化是指您可以轻松地更改代码的某些部分(优化器、约束、丢失、正则化等)