Spark mllib ALS建议

时间:2017-06-01 20:44:38

标签: apache-spark apache-spark-mllib

我正在训练ALS模型以获取建议。我从约1000万用户和300万产品获得约200米的评级。我有一个小型集群,有48个内核和120GB的集群范围内存。

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

我有几个问题:

模型训练的所有步骤都相当快。对于排名20,模型训练不到10分钟。但是,model.recommendProductsForUsers步骤要么很慢,要么就是不起作用,因为此时代码似乎挂起。我已经尝试了用户和产品块大小为-1和20,40等,与执行程序内存大小一起播放等。有人可以在这里说明可能出错的地方吗?

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

感谢您提供的任何信息。

1 个答案:

答案 0 :(得分:3)

ALS算法基本上输出两件事:

  1. model.productFeatures: Int -> Array[Double]其中Int是产品ID,Array[Double]是代表此产品的向量。
  2. model.userFeatures: Int -> Array[Double]其中Int是用户ID,Array[Double]是代表此用户的向量。
  3. 为了进行预测,我们采用两个向量的点积。为了计算相似性,我们采用两个向量之间的角度的余弦。所以,来:

    1. 为用户U预测产品P,我们计算U点P;
    2. 计算U1和U2之间的相似度,我们计算(U1点U2)/(|| U1 || _2 x || U2 || _2);
    3. 计算P1和P2之间的相似度,我们计算(P1点P2)/(|| P1 || _2 x || P2 || _2)
    4. model.recommendProductsForUsers之所以如此缓慢的原因是因为它为所有产品计算所有用户的点积。给定模型中的等级r,这意味着您必须进行U x P x 2r计算。在你的情况下,这将是10米x 3米x 2x20 = 6 x 1.2 ^ 15计算 - 很多!

      更好的方法是忽略这种强力辅助函数,引入一些启发式方法来减少每个用户可以预测的产品数量,并自己计算预测。例如,如果您有产品层次结构,则可以将可预测的产品限制为用户之前浏览过的类别中的产品,或者在这些类别的一个分支内。这是每个推荐系统面临的问题,但没有一个通用的解决方案。为了使事情快速,你需要使用一些过滤启发式自己进行计算。