推薦系統| ② 離線推薦&基於隱語義模型的協同過濾推薦


 

一、離線推薦服務

      離線推薦服務是綜合用戶所有的歷史數據,利用設定的離線統計算法和離線推薦算法周期性的進行結果統計與保存,計算的結果在一定時間周期內是固定不變的,變更的頻率取決於算法調度的頻率。

  離線推薦服務主要計算一些可以預先進行統計和計算的指標,為實時計算和前端業務相應提供數據支撐。

離線推薦服務主要分為統計性算法、基於ALS的協同過濾推薦算法以及基於ElasticSearch的內容推薦算法。

在recommender下新建子項目StatisticsRecommender,pom.xml文件中只需引入spark、scala和mongodb的相關依賴:

離線統計服務

    1. 歷史熱門電影統計

根據所有歷史評分數據,計算歷史評分次數最多的電影。

實現思路:

通過Spark SQL讀取評分數據集,統計所有評分中評分數最多的電影,然后按照從大到小排序,將最終結果寫入MongoDB的RateMoreMovies數據集中。

  2 最近熱門電影統計

根據評分,按月為單位計算最近時間的月份里面評分數最多的電影集合。

實現思路:

通過Spark SQL讀取評分數據集,通過UDF函數將評分的數據時間修改為月,然后統計每月電影的評分數。統計完成之后將數據寫入到MongoDB的RateMoreRecentlyMovies數據集中。

  3 電影平均得分統計

根據歷史數據中所有用戶對電影的評分,周期性的計算每個電影的平均得分。

實現思路:

通過Spark SQL讀取保存在MongDB中的Rating數據集,通過執行以下SQL語句實現對於電影的平均分統計:

  4 每個類別優質電影統計

根據提供的所有電影類別,分別計算每種類型的電影集合中評分最高的10個電影。

實現思路:

在計算完整個電影的平均得分之后,將影片集合與電影類型做笛卡爾積,然后過濾掉電影類型不符合的條目,將DataFrame輸出到MongoDB的GenresTopMovies集合中。

二、基於隱語義模型的協同過濾推薦

項目采用ALS作為協同過濾算法,分別根據MongoDB中的用戶評分表和電影數據集計算用戶電影推薦矩陣以及電影相似度矩陣。

    1 用戶電影推薦矩陣

通過ALS訓練出來的Model來計算所有當前用戶電影的推薦矩陣,主要思路如下:

  1. UserId和MovieID做笛卡爾積,產生(uid,mid)的元組
  2. 通過模型預測(uid,mid)的元組。
  3. 將預測結果通過預測分值進行排序。
  4. 返回分值最大的K個電影,作為當前用戶的推薦。

最后生成的數據結構如下:將數據保存到MongoDB的UserRecs表中

   

 

 

    新建recommender的子項目OfflineRecommender,引入spark、scala、mongo和jblas的依賴:

   2 電影相似度矩陣

通過ALS計算電影見相似度矩陣,該矩陣用於查詢當前電影的相似電影並為實時推薦系統服務。

離線計算的ALS 算法,算法最終會為用戶、電影分別生成最終的特征矩陣,分別是表示用戶特征矩陣的U(m x k)矩陣,每個用戶由 k個特征描述;表示物品特征矩陣的V(n x k)矩陣,每個物品也由 k 個特征描述。

V(n x k)表示物品特征矩陣,每一行是一個 k 維向量,雖然我們並不知道每一個維度的特征意義是什么,但是k 個維度的數學向量表示了該行對應電影的特征。

所以,每個電影用V(n x k)每一行的向量表示其特征,於是任意兩個電影 p:特征向量為,電影q:特征向量為之間的相似度sim(p,q)可以使用和的余弦值來表示:

 

數據集中任意兩個電影間相似度都可以由公式計算得到,電影與電影之間的相似度在一段時間內基本是固定值。最后生成的數據保存到MongoDB的MovieRecs表中。

  

 

 

   3 模型評估和參數選取

在上述模型訓練的過程中,我們直接給定了隱語義模型的rank,iterations,lambda三個參數。對於我們的模型,這並不一定是最優的參數選取,所以我們需要對模型進行評估。通常的做法是計算均方根誤差(RMSE),考察預測評分與實際評分之間的誤差。

 

有了RMSE,我們可以就可以通過多次調整參數值,來選取RMSE最小的一組作為我們模型的優化選擇。

   新建單例對象ALSTrainer,

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM