开发者社区> 问答> 正文

Spark SVD不可重复

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

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

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

展开
收起
社区小助手 2018-12-06 15:41:34 1727 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

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

    FP算术不是关联的。

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

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

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

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

    2019-07-17 23:18:35
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
Spark优化实践 立即下载
SPARK ML WITH HIGH DIMENSIONAL 立即下载
Apache Spark MLlib's past traj 立即下载