2017-06-01 77 views
0

我正在为建议培训ALS模型。我从约1000万用户和3米产品获得约200米的收视率。我有一个拥有48个内核和120gb集群内存的小型集群。Spark mllib ALS建议

我的代码非常类似于示例代码 spark/examples/src/main/scala/org/apache/spark/examples/mllib/MovieLensALS.scala代码。

我有几个问题:

所有步骤高达模型训练运行速度相当快。模型训练在20分钟内不到10分钟。然而,model.recommendProductsForUsers步骤要么很慢,要么只是不起作用,因为代码似乎在这一点上悬而未决。我试过用户和产品模块大小为-1和20,40等,用执行器内存大小等进行播放。有人可以在这里说明什么可能是错误的?

此外,是否有ml.recommendation.ALS算法的任何示例代码?我可以弄清楚如何训练模型,但我不明白(从文档)如何执行预测?

感谢您提供任何信息。

回答

1

的ALS算法本质上输出两件事情:

  1. model.productFeatures: Int -> Array[Double]其中Int是产品ID,和Array[Double]是表示该产品的载体中。
  2. model.userFeatures: Int -> Array[Double]其中Int是用户ID,Array[Double]是表示该用户的向量。

为了进行预测,我们取两个向量的点积。为了计算相似度,我们取两个向量之间角度的余弦值。所以,对于:

  1. 为用户U预测产品P,我们计算U点P;我们计算(U1点U2)/(|| U1 || _2 x || U2 || _2);计算U1和U2之间的相似度。 P1和P2之间
  2. 计算相似性,我们计算(P1点P2)/(P1 || || _2 X || || P2 _2)

原因那么model.recommendProductsForUsers是如此之慢是因为它正在为所有用户计算所有产品的点积。给定模型中的等级r,这意味着您必须进行U x P x 2r计算。在你的情况下,这将是10米×3米×2×20 = 6×1.2^15的计算 - 很多!

一个更好的方法是忽略这个蛮力助手功能,引入一些启发式方法来减少每个用户可以预测的产品数量,并自己计算预测结果。例如,如果您有产品层次结构,则可以将可以预测的产品限制为用户以前浏览过的类别中的产品,或者可以将这些产品分类在一个分支中。这是每个推荐系统都面临的问题,但是没有一个适合所有人的解决方案。为了使事情变得更快,您需要使用一些过滤启发式技术来自己完成计算。

+0

非常感谢。这非常有帮助。 –