2017-06-01 115 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

非常感謝。這非常有幫助。 –