首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKLearn NMF与自定义NMF

SKLearn NMF与自定义NMF
EN

Stack Overflow用户
提问于 2018-03-17 14:23:30
回答 1查看 2K关注 0票数 5

我试图建立一个使用非负矩阵分解的推荐系统。以scikit学习NMF为模型,拟合数据,造成一定的损失(即重建误差)。然后,我使用转换方法生成新数据的推荐。

现在,我使用我在TensorFlow中构建的另一个模型来做同样的事情。训练后的重建误差与以前采用sklearn方法得到的误差相近。然而,潜在的因素既不是相互相似的,也不是最后的建议。

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

  1. 使用的损失函数是Frobenius范数
  2. 在这两种情况下都没有正规化
  3. 在相同的数据上使用相同的潜在维数进行测试

我正在使用的相关代码:

1.科学方法-学习方法:

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
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实现。如何使用自定义实现实现相同的功能?

EN

回答 1

Stack Overflow用户

发布于 2018-03-21 12:49:44

优化器的选择对训练质量有很大的影响。一些非常简单的模型(例如,我想到的是GloVe )确实与一些优化器一起工作,而对其他一些模型则完全不起作用。然后,回答你的问题:

  1. 我怎样才能确定哪一个是正确的?

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

  1. 如何使用自定义实现实现相同的功能?

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

最后,如果您的实现提供的建议如此糟糕,我建议您在其中出现错误。试着与一些现有码进行比较。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49337960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档