3

我寫了一個火花程序來提出建議。然後我使用了ALS.recommendation庫。我做了一個小測試一個名爲trainData以下數據集:錯誤的推薦ALS.recommendation

(u1, m1, 1) 
(u1, m4, 1) 
(u2, m2, 1) 
(u2, m3, 1) 
(u3, m1, 1) 
(u3, m3, 1) 
(u3, m4, 1) 
(u4, m3, 1) 
(u4, m4, 1) 
(u5, m2, 1) 
(u5, m4, 1) 

第一列包含用戶,第二個包含由用戶評價的項目和第三包含的收視率。

myModel = ALS.trainImplicit(trainData, 3, 5, 0.01, 1.0) 

我嘗試使用這個指令來檢索U1一些建議:

recommendations = myModel.recommendProducts(idUser, 2) 

其中ID用戶包含ID影響

在用Scala編寫我的代碼使用訓練模式給用戶u1 作爲推薦,我獲得:

(u1, m1, 1.0536233346170754) 
(u1, m4, 0.8540954252858661) 
(u1, m3, 0.09069877419040584) 
(u1, m2, -0.1345521479521654) 

正如您所看到的,前兩行顯示建議的項目是u1已經評級的項目(m1和m4)。 無論我選擇何種用戶來獲得建議,我總是會得到相同的行爲(建議的第一項是用戶已經評分的項目)。

我覺得很奇怪!任何地方都有問題嗎?

回答

2

我認爲這是使用recommendProducts的預期行爲,當您正在訓練矩陣分解算法(如ALS)時,您試圖找到將每個用戶與每個項目相關聯的評分。

ALS根據用戶已經評價過的項目來做這件事,所以當你找到給定用戶的建議時,模型會對它已經看到的評級保持最肯定的態度,所以它會在大多數時候推薦產品已經評分。

您需要做的是將每個用戶的產品列表保留爲評級,並在提出建議時對其進行過濾。

編輯:

我挖了一下到源代碼和本細則,以確保我在說什麼的。

ALS.recommendProducts在類別MatrixFactorizationModel (source code)中實施。您可以在那裏看到,建議的模型不關心用戶是否已經對該項目進行評估。

而且您應該注意,如果您使用隱式評級,那麼您最希望推薦已經由用戶隱式評級的產品: 想象一下您的隱式評級是在線商店中產品的頁面瀏覽量以及你想要的是用戶購買產品。

我無權訪問那本書使用Spark進行高級分析,因此我無法評論此處的說明和示例。

文檔:

+0

我不同意你的答案達成一致。因爲您描述的預期行爲與「Spark with Advanced analytics」一書中提出的解釋和示例不符。 – semteu

+0

使用來源和文檔中的信息更新了我的答案 –