基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦系統(一) 協同過濾演算法概述&&基於模型的協同過濾的演算法思想(演算法模型和結構待補充)
本文暫時分為三部分:
(一)基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦系統(一)
→ 協同過濾演算法概述&&基於模型的協同過濾的演算法思想
(二)基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦系統(二)
→ 程式碼實現
(三)基於Spark MLlib平臺和基於模型的協同過濾演算法的電影推薦系統(二)
→作業裡的拓展
本文基於Spark MLlib平臺實現一個向用戶推薦電影的簡單應用。其中,主要包括三部分內容:
一、協同過濾演算法概述二、基於模型的協同過濾應用---電影推薦
三、實時推薦架構分析
關於協同過濾的一個最經典的例子就是看電影,有時候不知道哪一部電影是我們喜歡的或者評分比較高的,那麼通常的做法就是問問周圍的朋友,看看最近有什麼好的電影推薦。在問的時候,都習慣於問跟自己口味差不多的朋友,這也是協同過濾的核心思想:在海量資料中挖掘出小部分與你品味類似的使用者,在協同過濾中,這些使用者成為鄰居,然後根據他們喜歡的東西組織成一個排序的目錄推薦給你。
所以就有如下兩個核心問題:
(1)如何確定一個使用者是否與你有相似的品味?
(2)如何將鄰居們的喜好組織成一個排序目錄?
協同過濾演算法的出現標誌著推薦系統的產生,協同過濾演算法包括:
1)基於使用者(UserCF)的協同過濾演算法
2)基於商品(ItemCF)的協同過濾演算法
3)基於模型(ModelCF)的協同過濾演算法
基於模型的協同過濾演算法,又可以分為:
1)最近鄰模型:基於距離的協同過濾演算法
2)矩陣分解模型:基於矩陣分解的模型 Latent Factor Mode(SVD)
3)圖模型:社會網路圖模型(Graph)
本文中,使用的協同過濾演算法是基於矩陣分解的模型。
先簡單介紹一下基於使用者和基於物品的協同過濾演算法
1、基於使用者(UserCF)---基於使用者相似性
簡單來講,就是給使用者推薦和他興趣相似的其他使用者喜歡的物品。
舉個例子:
如圖,有三個使用者A、B、C,四個物品A、B、C、D,需要向用戶A推薦物品。
這裡,由於使用者A和使用者C都買過物品A和物品C,所以,我們認為使用者A和使用者C非常相似,同時,使用者C又買過物品D,那麼就需要給A使用者推薦物品D。
計算上,將一個使用者對所有物品的偏好作為一個向量來計算使用者之間的相似度,找到K鄰居後,根據鄰居的相似度權重以及他們對物品的偏好,預測當前使用者沒有偏好的未涉及物品,計算得到一個排序的物品列表作為推薦。
【可參考一個參加完阿里大資料競賽的人寫的《基於使用者的協同過濾(UserCollaborativeFilter)C++實現》的文章網址為:http://www.tuicool.com/articles/AN7Rf2】
2、基於商品(ItemCF)---基於商品相似性
基於商品的協同過濾,通過使用者對不同item的評分來評測item之間的相似性,基於item之間的相似性做出推薦。
簡單來講,就是給使用者推薦和他之前喜歡的物品相似的物品。
舉個例子:
這裡,由於使用者A買過物品A和C,使用者B買過物品A、B、C,使用者C買過物品A,從使用者A和B可以看出,這兩個使用者都買過物品A和C,說明物品A和C非常相似,同時,使用者C又買過物品A,所以,將物品C推薦給使用者C。
基於ItemCF的原理和基於UserCF類似,只是在計算鄰居時採用物品本身,而不是從使用者的角度,即基於使用者對物品的偏好找到相似的物品,然後根據使用者的歷史偏好,推薦相似的物品給他。
從計算角度,即將所有使用者對某個物品的偏好作為一個向量來計算物品之間的相似度,得到物品的相似物品後,根據使用者歷史的偏好預測當前使用者還沒有表示偏好的物品,計算得到一個排序的物品列表作為推薦。
二、基於Spark MLlib平臺的協同過濾演算法---電影推薦系統
介紹完基於使用者的協同過濾和基於物品的協同過濾,現在進入正題,介紹基於模型的協同過濾演算法:
基於模型(ModelCF)有三種:
1)最近鄰模型:基於距離的協同過濾演算法
2)矩陣分解模型:基於矩陣分解的模型 Latent Factor Mode(SVD)
3)圖模型:社會網路圖模型(Graph)
關於1)和3),本文不贅述,但附上一篇還湊活的連結
【基於鄰域的演算法是推薦系統中最基本的演算法 可參考《推薦系統實踐--基於使用者的協同過濾演算法》 網址為:http://www.tuicool.com/articles/6vqyYfR】
下面開始對 “ 2)矩陣分解模型:基於矩陣分解的模型 Latent Factor Mode(SVD)”的講解:
基於模型的協同過濾推薦就是基於樣本的使用者喜好資訊,訓練一個推薦模型,然後根據實時的使用者喜好的資訊進行預測,計算推薦。
演算法如圖:Spark MLlib當前支援基於模型的協同過濾,其中使用者和商品通過一小組隱性因子進行表達,並且這些因子也用於預測缺失的元素。
MLlib使用交替最小二乘法(ALS)來學習這些隱性因子。
(關於模型和演算法結構 這部分待補充)
補充:
ALS演算法
1含義
在現實中使用者-物品-評分矩陣是及其大的,使用者消費有限,對單個使用者來說,消費的物品的非常有限的,產生的評分也是比較少的,這樣就造成了使用者-物品矩陣有大量的空值。
假定使用者的興趣只受少數因素的影響,所以使用者-物品矩陣可以分解為使用者的特徵向量矩陣和物品的特徵向量矩陣(降維了)。使用者的特徵向量距離表示使用者的興趣(U),物品的特徵向量矩陣代表使用者的特點(V),合起來(內積)表示使用者對物品的特點的興趣,也就是喜好程度。
M=U*V
2協同過濾矩陣分解演算法
2.1奇異值分解(SVD)
矩陣的奇異值分解是最簡單的一種矩陣分解演算法,主要是在U*V中間加了個一個奇異值矩陣,公式如下:
M=U*(奇異值矩陣)*(V的共軛)
奇異值矩陣是對角矩陣,奇異值分解的缺點(沒試過不知道,書上說的),1不允許分解矩陣有null值,需要進行填分,2如果填分,又有兩個問題:1增加資料量,增加演算法複雜度,2簡單粗暴的填分方式會導致資料失真,如果將null值設定為0,那麼會導致過度學習問題。
奇異值分解方式,感覺用的不多,我自己接觸的話。
2.2正則化矩陣分解
加入正則化是為了解決稀疏矩陣可能過學習問題,評價矩陣分解是RMSE,通過最小化RMSE來學習使用者特徵矩陣U和物品特徵矩陣V,在RMSE函式中加入了正則化項減少過擬合,公式如下,公式都是書上寫的哈,這裡截圖:
K表示評分記錄(u使用者對I物品的評分),Ru,i表示使用者u對物品i的真實評分,誒夢達表示正則化係數,誒夢達後面的表示防止過擬合的正則化項。
加入正則化的含義可以理解為,修改rmse,不要其太大或者太小。
假設使用者特徵矩陣為Umt,物品評分矩陣為Vtn,其中t特徵<
2.3帶偏置的矩陣分解(說的很有道理,但是比較難評估)
理論就不說了,舉個例子,u1對v1的評分為4表示u1對v1這個物品非常喜歡,u2對v1的評分為4表示u1對v1一般喜歡,對用使用者來說,即使他們對同一物品的評分相同,但是表示他們的喜好程度並不是一樣的。同理對於物品來說也是一樣。把這種獨立於使用者和獨立於物品的影響因素成為偏置,偏置一共有3個部分組成。
1訓練集中所有評分記錄的全域性平均,表示訓練集中總體評分情況,一般是一個常數。
2使用者偏置bu,獨立於物品特徵因素,表示使用者特定的打分習慣。
3物品偏置bi,表示獨立於使用者特徵因素,舉個列子,好片子一般總體評分偏高,爛片一般評分偏低,偏置就是表示這種特徵。
以上的所有偏置對使用者對物品喜好無關,得到的預測評分公式如下:
按照這種思路,其實還要很多其他優化,比如加入時間因素,社會流行因素等。
Spark使用的是帶正則化矩陣分解,優化函式的方式選用的是交叉最小二乘法ALS