我正在训练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算法的示例代码?我可以弄清楚如何训练模型,但我不明白(从文档中)如何进行预测?
感谢您提供的任何信息。
答案 0 :(得分:3)
ALS算法基本上输出两件事:
model.productFeatures: Int -> Array[Double]
其中Int
是产品ID,Array[Double]
是代表此产品的向量。model.userFeatures: Int -> Array[Double]
其中Int
是用户ID,Array[Double]
是代表此用户的向量。为了进行预测,我们采用两个向量的点积。为了计算相似性,我们采用两个向量之间的角度的余弦。所以,来:
model.recommendProductsForUsers
之所以如此缓慢的原因是因为它为所有产品计算所有用户的点积。给定模型中的等级r,这意味着您必须进行U x P x 2r计算。在你的情况下,这将是10米x 3米x 2x20 = 6 x 1.2 ^ 15计算 - 很多!
更好的方法是忽略这种强力辅助函数,引入一些启发式方法来减少每个用户可以预测的产品数量,并自己计算预测。例如,如果您有产品层次结构,则可以将可预测的产品限制为用户之前浏览过的类别中的产品,或者在这些类别的一个分支内。这是每个推荐系统面临的问题,但没有一个通用的解决方案。为了使事情快速,你需要使用一些过滤启发式自己进行计算。