开发者社区> 问答> 正文

Spark SVD不可重复

社区小助手 2018-12-06 15:41:34 437

我正在使用computeSVDSpark类的方法IndexedRowMatrix(在Scala中)。我注意到它没有setSeed()方法。对于同一输入矩阵的多次运行,我得到的结果略有不同,可能是由于Spark使用的内部算法。虽然它也实现了近似可扩展的SVD算法,但我会从源代码中说,computeSVD()来自IndexedRowMatrix不应用近似但确切的版本。

由于我正在使用SVD结果做推荐,并且用户和项目潜在因素矩阵不同,我实际上得到了不同的推荐列表:在一些运行中大致相同的项目以不同的顺序,有时一些新项目进入列表和有些人遗漏了,因为在对传递到的缺失输入评级矩阵进行估算后,预测评级通常几乎是平局的computeSVD()。

有没有人有这个问题?有没有办法让这完全确定,

分布式计算 算法 Scala Spark
分享到
取消 提交回答
全部回答(1)
  • 社区小助手
    2019-07-17 23:18:35

    当您在Apache Spark中使用数值计算时,您必须记住两件事:

    FP算术不是关联的。

    scala> (0.1 + 0.2) + 0.3 == 0.1 + (0.2 + 0.3)
    res0: Boolean = false
    Spark中的每次交换都是非决定论的潜在来源。为了实现最佳性能,Spark可以按任意顺序合并上游任务的部分结果。

    这可以通过一些防御性编程来解决,但运行时开销通常很高,在实践中很有用。

    因此,即使程序不依赖于随机数生成器(如computeSVD),或者如果设置了生成器种子,最终结果也会波动。

    在实践中,除了重写内部之外,你真的没什么可做的。如果您怀疑问题在某种程度上是病态的,您可以尝试使用一些随机噪声构建多个模型,以查看最终预测的敏感程度,并在生成预测时将此考虑在内。

    0 0
+ 订阅

大数据计算实践乐园,近距离学习前沿技术

推荐文章
相似问题