我正在使用computeSVDSpark类的方法IndexedRowMatrix(在Scala中)。我注意到它没有setSeed()方法。对于同一输入矩阵的多次运行,我得到的结果略有不同,可能是由于Spark使用的内部算法。虽然它也实现了近似可扩展的SVD算法,但我会从源代码中说,computeSVD()来自IndexedRowMatrix不应用近似但确切的版本。
由于我正在使用SVD结果做推荐,并且用户和项目潜在因素矩阵不同,我实际上得到了不同的推荐列表:在一些运行中大致相同的项目以不同的顺序,有时一些新项目进入列表和有些人遗漏了,因为在对传递到的缺失输入评级矩阵进行估算后,预测评级通常几乎是平局的computeSVD()。
有没有人有这个问题?有没有办法让这完全确定,
当您在Apache Spark中使用数值计算时,您必须记住两件事:
FP算术不是关联的。
scala> (0.1 + 0.2) + 0.3 == 0.1 + (0.2 + 0.3)
res0: Boolean = false
Spark中的每次交换都是非决定论的潜在来源。为了实现最佳性能,Spark可以按任意顺序合并上游任务的部分结果。
这可以通过一些防御性编程来解决,但运行时开销通常很高,在实践中很有用。
因此,即使程序不依赖于随机数生成器(如computeSVD),或者如果设置了生成器种子,最终结果也会波动。
在实践中,除了重写内部之外,你真的没什么可做的。如果您怀疑问题在某种程度上是病态的,您可以尝试使用一些随机噪声构建多个模型,以查看最终预测的敏感程度,并在生成预测时将此考虑在内。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。