推薦系統是一種信息過濾系統,用於預測用戶對物品的評分或偏好。解決的是信息過載和長尾問題(長尾理論)。它的本質是通過一定的方式將用戶和物品聯系起來。
推薦系統在為用戶推薦物品時通常有兩種方式:
1.評分預測
2.TopN推薦
主流的推薦系統算法可以分為協同過濾推薦(Collaborative Filtering Recommendation)、基於內容推薦(Content-basedRecommendation)和混合推薦等。
協同過濾
僅僅基於用戶行為數據設計的推薦算法一般稱為協同過濾算法。
主要包括基於鄰域的方法(neighborhood-based)、 隱語義模型(latent factor model)、 基於圖的隨機游走算法(random walk on graph)等。而基於鄰域的方法主要包含基於用戶的協同過濾算法和基於物品的協同過濾算法。
1)基於用戶的協同過濾算法
基於用戶的協同過濾算法主要包括兩個步驟。
(1) 找到和目標用戶興趣相似的用戶集合。
(2) 找到這個集合中的用戶喜歡的,且目標用戶沒有聽說過的物品推薦給目標用戶
步驟(1)的關鍵就是計算兩個用戶的興趣相似度。可以通過Jaccard(傑卡德)公式或者通過余弦相似度計算
Jaccard(傑卡德)公式:
余弦相似度:
2)基於物品的協同過濾算法
基於物品的協同過濾(item-based collaborative filtering)算法是目前業界應用最多的算法。基於物品的協同過濾算法主要分為兩步。
(1) 計算物品之間的相似度。
(2) 根據物品的相似度和用戶的歷史行為給用戶生成推薦列表
- 改進
協同過濾可能會帶來馬太效應,所以會有一些常見的改進方法。
基於用戶的協同過濾主要改進在用戶對物品的喜好程度上,比如懲罰對熱門物品的喜好程度,增加喜好程度的時間衰減等方法;
基於物品的改進主要有物品中心化和用戶中心化,即先分別減去物品、用戶分數的均值,再進行相似度計算。
UserCF和ItemCF的綜合比較
UserCF的推薦結果着重於反映和用戶興趣相似的小群體的熱點,而ItemCF的推薦結果着重於維系用戶的歷史興趣。換句話說, UserCF的推薦更社會化,反映了用戶所在的小型興趣群體中物品的熱門程度,而ItemCF的推薦更加個性化,反映了用戶自己的興趣傳承。
例如,UserCF適合用於新聞推薦;ItemCF適合用於圖書、電子商務和電影網站。
3)隱語義模型
核心思想是通過隱含特征(latent factor)聯系用戶興趣和物品,找出潛在的主題和分類。LFM(latent factor model)通過如下公式計算用戶u對物品i的興趣:
定義P矩陣是user-class矩陣,矩陣值\(P_{ij}\)表示的是user i對class j的興趣度;Q矩陣式class-item矩陣,矩陣值Qij表示的是item j在class i中的權重,權重越高越能作為該類的代表。那么,用戶U對物品I的興趣度為:
使用LFM后,我們不需要關心分類的角度,結果都是基於用戶行為統計自動聚類的;不需要關心分類粒度的問題,通過設置LFM的最終分類數就可控制粒度,分類數越大,粒度約細
在user-item集K={(U,I)},其中如果(U,I)是正樣本,則RUI=1,否則RUI=0。損失函數如下所示:
對\(p_{u,k}\),\(q_{k,i})\)分別求偏導數,根據隨機梯度下降法,將參數沿着最速下降方向向前推進
- 優缺點
優點:
- LFM具有比較好的理論基礎
- LFM大量節省了訓練過程中的內存
缺點:
- 很難實現實時的推薦。經典的LFM模型每次訓練時都需要掃描所有的用戶行為記錄,這樣才能計算出用戶隱類向量和物品隱類向量。而且LFM的訓練需要在用戶行為記錄上反復迭代才能獲得比較好的性能;
- LFM無法提供很好的推薦解釋
4)基於隨機游走的PersonalRank算法
將用戶行為表示為二分圖模型。假設給用戶u進行個性化推薦,要計算所有節點相對於用戶u的相關度,則PersonalRank從用戶u對應的節點開始游走,每到一個節點都以1-d的概率停止游走並從u重新開始,或者以d的概率繼續游走,從當前節點指向的節點中按照均勻分布隨機選擇一個節點往下游走。這樣經過很多輪游走之后,每個頂點被訪問到的概率也會收斂趨於穩定,這個時候我們就可以用概率來進行排名了。
在執行算法之前,我們需要初始化每個節點的初始概率值。如果我們對用戶u進行推薦,則令u對應的節點的初始訪問概率為1,其他節點的初始訪問概率為0,然后再使用迭代公式計算。
算法優化方法:
(1)三分圖(user,tag,item)
(2)轉移矩陣算法,降低時間復雜度
矩陣化實現:
其中,r是m+n行,1列的矩陣,每一行代表該頂點對固定頂點的PR值;是m+n行,1列的矩陣,負責選取某一個頂點作為固定頂點,其數值只有1行為1,其余為0。M是m+n行,m+n列的矩陣,是轉移矩陣,其值\(M_{ij}=\frac{1}{out(i)},j \in out(i) \ else \ 0\),即為頂點的出度倒數,若沒有連接邊則為0。上式可轉換為:
其中,\((E-\alpha M^T)^{-1}\)可以看做所有頂點的推薦結果,每一列代表一個頂點項,對該頂點的PR值。
- 特點:
- 主題無關性
- 對新物品不利
5)Slope One算法
Slope One 算法 是一種基於評分的預測算法, 本質上也是一種基於項目的算法。與一般的基於項目的算法不同, 該算法不計算項目之間的相似度, 而是用一種簡單的線性回歸模型進行預測(可以擴展) 算法易於實現, 計算速度快, 可擴展性好, 同時對數據稀疏性有較好的適應性。
主要兩步:
Step1:計算物品之間的評分差的均值,記為物品間的評分偏差(兩物品同時被評分);
Step2:根據物品間的評分偏差和用戶的歷史評分,預測用戶對未評分的物品的評分。
該算法適用於物品更新不頻繁,數量相對較穩定並且物品數目明顯小於用戶數的場景。依賴用戶的用戶行為日志和物品偏好的相關內容。
- 優缺點
優點:
- 算法簡單,易於實現,執行效率高;
- 可以發現用戶潛在的興趣愛好;
缺點:
- 依賴用戶行為,存在冷啟動問題和稀疏性問題。
協同過濾算法優缺點:
- 協同過濾算法只是使用“用戶”和“物品”兩個變量,並且只是根據相似性這個變量計算,是基於統計的低階推薦算法,不具有精准推薦
- 對於新物品的曝光,協同過濾效果很差
內容推薦
它的思想非常簡單:根據用戶過去喜歡的物品(本文統稱為 item),為用戶推薦和他過去喜歡的物品相似的物品。而關鍵就在於這里的物品相似性的度量,這才是算法運用過程中的核心。
CB的過程一般包括以下三步:
物品表示(Item Representation):為每個item抽取出一些特征(也就是item的content了)來表示此item;
特征學習(Profile Learning):利用一個用戶過去喜歡(及不喜歡)的item的特征數據,來學習出此用戶的喜好特征(profile);
生成推薦列表(Recommendation Generation):通過比較上一步得到的用戶profile與候選item的特征,為此用戶推薦一組相關性最大的item。
CB的優點:
- 用戶之間的獨立性(User Independence):既然每個用戶的profile都是依據他本身對item的喜好獲得的,自然就與他人的行為無關。而CF剛好相反,CF需要利用很多其他人的數據。CB的這種用戶獨立性帶來的一個顯著好處是別人不管對item如何作弊(比如利用多個賬號把某個產品的排名刷上去)都不會影響到自己。
- 好的可解釋性(Transparency):如果需要向用戶解釋為什么推薦了這些產品給他,你只要告訴他這些產品有某某屬性,這些屬性跟你的品味很匹配等等。
- 新的item可以立刻得到推薦(New Item Problem):只要一個新item加進item庫,它就馬上可以被推薦,被推薦的機會和老的item是一致的。而CF對於新item就很無奈,只有當此新item被某些用戶喜歡過(或打過分),它才可能被推薦給其他用戶。所以,如果一個純CF的推薦系統,新加進來的item就永遠不會被推薦:( 。
CB的缺點: - item的特征抽取一般很難(Limited Content Analysis):如果系統中的item是文檔(如個性化閱讀中),那么我們現在可以比較容易地使用信息檢索里的方法來“比較精確地”抽取出item的特征。但很多情況下我們很難從item中抽取出准確刻畫item的特征,比如電影推薦中item是電影,社會化網絡推薦中item是人,這些item屬性都不好抽。其實,幾乎在所有實際情況中我們抽取的item特征都僅能代表item的一些方面,不可能代表item的所有方面。這樣帶來的一個問題就是可能從兩個item抽取出來的特征完全相同,這種情況下CB就完全無法區分這兩個item了。比如如果只能從電影里抽取出演員、導演,那么兩部有相同演員和導演的電影對於CB來說就完全不可區分了。
- 無法挖掘出用戶的潛在興趣(Over-specialization):既然CB的推薦只依賴於用戶過去對某些item的喜好,它產生的推薦也都會和用戶過去喜歡的item相似。如果一個人以前只看與推薦有關的文章,那CB只會給他推薦更多與推薦相關的文章,它不會知道用戶可能還喜歡數碼。
- 無法為新用戶產生推薦(New User Problem):新用戶沒有喜好歷史,自然無法獲得他的profile,所以也就無法為他產生推薦了。當然,這個問題CF也有。
矩陣分解
矩陣分解乃是實現隱語義模型的基石。
矩陣分解根據用戶對物品的評分, 推斷出用戶和物品的隱語義向量, 然后根據用戶和物品的隱語義向量來進行推薦。
推薦系統用到的數據可以有顯式評分和隱式評分. 顯式評分時用戶對物品的打分, 顯式評分矩陣通常非常稀疏. 隱式評分是指用戶的瀏覽, 購買, 搜索等歷史記錄, 表示的是用戶行為的有無, 所以是一個密集矩陣。
矩陣分解也有FunkSVD,BiasSVD,SVD++等常用形式,三種形式的差別就是在不同的預置Bias做了不同考慮
1)傳統的奇異值分解SVD
奇異值分解(SVD)原理與主要應用在數據降維中,可以將這個用戶物品對應的m×n矩陣M進行SVD分解,並通過選擇部分較大的一些奇異值來同時進行降維
API:
sklearn.decomposition. import TruncatedSVD
問題:
1.基於稠密向量分解,稀疏向量無法計算
2.O(n^3)的計算計算復雜度,計算復雜,智能用在簡單數據降維,不可用在大數據推薦
2)FunkSVD推薦算法/LFM算法
ALS是交替最小二乘的簡稱,在機器學習上下文中,ALS特指使用交替最小二乘求解的一個協同過濾推薦算法。它通過觀察到的所有用戶給物品的打分,來推斷每個用戶的喜好並向用戶推薦合適的物品。例如:將用戶(user)對商品(item)的評分矩陣分解為兩個矩陣:一個是用戶對商品隱含特征的偏好矩陣,另一個是商品所包含的隱含特征的矩陣。在這個矩陣分解的過程中,評分缺失項得到了填充,也就是說我們可以基於這個填充的評分來給用戶最商品推薦了。
API:pyspark.mllib.recommendation import ALS
說明:
1,利用了梯度下降求解,考慮了正則化過擬合
2.沒解決樣本偏差
3)BiasSVD推薦算法:
在LFM中提到的\(\hat{r_{u,i}}\)中加入偏置項,即得到SVD模型。
其中\(\mu\)表示訓練集中物品的所有評分的平均值,\(b_u\)是用戶偏置項,表示一個用戶評分的平均值,\(b_i\)是物品偏置項,表示一個物品被評分的平均值。偏置項是固有屬性,每個用戶和物品都有自己的值,代表該物品被大眾喜愛程度或某個用戶對物品的苛刻程度。
新的代價函數為:
通過隨機梯度下降,可以得到
說明:
1,利用了梯度下降求解,正在了正則化,增加了偏置項
2,沒有解決反饋回執
4)SVD++
SVD++算法就是在BiasSVD算法上進一步做優化,增加考慮用戶的隱式反饋。
我們從上一步的BiasLFM(即SVD)繼續演化就可以得到SVD++。SVD++在前面的基礎上增加了隱式反饋和用戶屬性等基本信息,在學習的過程中又多了兩個向量:隱式反饋的物品向量,用戶屬性的特征向量。
假設某個用戶對某個物品進行了評分,這樣的行為事實上蘊含了一定的信息,從側面反映了用戶的喜好,可以將這樣的反映通過隱式參數的形式體現在模型中,從而得到一個更為精細的模型
其中\(I_u\)是該用戶評價過的所有物品的集合,\(y_j\)是隱藏的評價了物品j反映出的個人喜好偏置。收縮因子取集合大小的根號是一個經驗公式,並沒有理論依據。
說明:
1,利用了梯度下降求解,正在了正則化,增加了偏置項,增加了反饋回執
2,沒有解決時間序列的額權重衰減
5)Time SVD++
TIME SVD ++: 添加了時間動態
時間序列這個會引起兩個狀態變化:
①:物品的流行度或者是隨時間的變化程度,原則大部分是會隨時間衰減的,因為人的審美隨時間變化,當然,沒有隨時間變化的那部分我們都稱呼為“經典款”
②:人的評分標准也是隨時間變化的,比如年輕時要求更嚴格,中年會更隨和,年老會更和藹。
③:同一天的人的審美變化應該不會有太大變化,有變化也是輕微的變化。
說明:
1,利用了梯度下降求解,正在了正則化,增加了偏置項,增加了反饋回執
2,解決了時間序列的額權重衰減
矩陣分解優劣勢
主要的優勢如下:
- 比較容易編程實現,隨機梯度下降方法依次迭代即可訓練出模型。
- 預測的精度比較高,預測准確率要高於基於領域的協同過濾以及基於內容CBR等方法。
- 比較低的時間和空間復雜度,高維矩陣映射為兩個低維矩陣節省了存儲空間,訓練過程比較費時,但是可以離線完成;評分預測一般在線計算,直接使用離線訓練得到的參數,可以實時推薦。
- 非常好的擴展性,如由SVD拓展而來的SVD++和 TIME SVD++。
矩陣分解的不足主要有:
- 訓練模型較為費時。
- 推薦結果不具有很好的可解釋性,無法用現實概念給分解出來的用戶和物品矩陣的每個維度命名,只能理解為潛在語義空間。
關聯規則
關聯分析又稱關聯挖掘,就是在交易數據、關系數據或其他信息載體中,查找存在於項目集合或對象集合之間的頻繁模式、關聯、相關性或因果結構。或者說,關聯分析是發現交易數據庫中不同商品(項)之間的聯系。關聯分析的一個典型例子是購物籃分析。該過程通過發現顧客放人其購物籃中的不同商品之間的聯系,分析顧客的購買習慣。通過了解哪些商品頻繁地被顧客同時購買,這種關聯的發現可以幫助零售商制定營銷策略。其他的應用還包括價目表設計、商品促銷、商品的排放和基於購買模式的顧客划分。
常用的關聯規則算法有Apripri、FP-Tree算法,這樣的算法也是基於統計模型的。同樣使用“支持度”的指標做依據,只不過后者建立了項目表和權重書模型來處理,加速了掃描判別的磁盤IO。
常用的頻繁項集的評估標准有支持度,置信度和提升度三個
- 支持度:幾個關聯的數據在數據集中出現的次數占總數據集的比重
- 置信度:一個數據出現后,另一個數據出現的概率,或者說數據的條件概率。
- 提升度:表示含有Y的條件下,同時含有X的概率,與X總體發生的概率之比
1)Apriori算法
該算法主要包含兩個步驟:首先找出數據集中所有的頻繁項集,這些項集出現的頻繁性要大於或等於最小支持度;然后根據頻繁項集產生強關聯規則,這些規則必須滿足最小支持度和最小置信度。
算法原理:
如果一個項集是頻繁項集,則它的所有子集都是頻繁項集
如果一個集合不是頻繁項集,則它的所有父集(超集)都不是頻繁項集
關聯分析的目標:
發現頻繁項集:發現滿足最小支持度的所有項集
發現關聯規則:從頻繁項集中提取所有高置信度的規則
Apriori算法采用了迭代的方法
1.先搜索出候選1項集及對應的支持度,剪枝去掉低於支持度的1項集,得到頻繁1項集。
2.對剩下的頻繁1項集進行連接,得到候選的頻繁2項集,篩選去掉低於支持度的候選頻繁2項集,得到真正的頻繁二項集,
3.以此類推,迭代下去,直到無法找到頻繁k+1項集為止,對應的頻繁k項集的集合即為算法的輸出結果
2)FP-growth算法
在FP-growth算法中,通過兩次掃描事務數據庫,把每個事務所包含的頻繁項目按其支持度降序壓縮存儲到FP—tree中。在以后發現頻繁模式的過程中,不需要再掃描事務數據庫,而僅在FP-Tree中進行查找即可,並通過遞歸調用FP-growth的方法來直接產生頻繁模式,因此在整個發現過程中也不需產生候選模式。該算法克服了Apriori算法中存在的問顥.在執行效率上也明顯好於Apriori算法。
FP-growth算法通過構建FP-tree來壓縮事務數據庫中的信息,從而更加有效地產生頻繁項集。FP-tree其實是一棵前綴樹,按支持度降序排列,支持度越高的頻繁項離根節點越近,從而使得更多的頻繁項可以共享前綴。
基於深度學習的召回算法
1)item2vec
item2vec將用戶的行為序列轉化成item組成的句子,模仿word2vec訓練word embedding將item embedding。基本思想是把原來高維稀疏的表示方式(one_hot)映射到低維稠密的向量空間中,這樣我們就可以用這個低維向量來表示該項目(電影),進而通過計算兩個低維向量之間的相似度來衡量兩個項目之間的相似性。
embedding就是用一個低維的向量表示一個物體,可以是一個詞,或是一個商品,或是一個電影等等。這個embedding向量的性質是能使距離相近的向量對應的物體有相近的含義
類似於Word2vec,item2vec有兩種方式:CBOW和skip-gram模型。
CBOW使用的是詞袋模型,模型的訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。
Skip-Gram模型和CBOW的思路是反着來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。
word2vec有兩種改進方法,一種是基於Hierarchical Softmax的,另一種是基於Negative Sampling的。
首先,對於從輸入層到隱藏層的映射,沒有采取神經網絡的線性變換加激活函數的方法,而是采用簡單的對所有輸入詞向量求和並取平均的方法。
第二個改進就是從隱藏層到輸出的softmax層這里的計算量個改進。為了避免要計算所有詞的softmax概率,word2vec采樣了霍夫曼樹來代替從隱藏層到輸出softmax層的映射。
由於我們把之前所有都要計算的從輸出softmax層的概率計算變成了一顆二叉霍夫曼樹,那么我們的softmax概率計算只需要沿着樹形結構進行就可以了。
和之前的神經網絡語言模型相比,我們的霍夫曼樹的所有內部節點就類似之前神經網絡隱藏層的神經元,其中,根節點的詞向量對應我們的投影后的詞向量,而所有葉子節點就類似於之前神經網絡softmax輸出層的神經元,葉子節點的個數就是詞匯表的大小。在霍夫曼樹中,隱藏層到輸出層的softmax映射不是一下子完成的,而是沿着霍夫曼樹一步步完成的,因此這種softmax取名為"Hierarchical Softmax"。
如何“沿着霍夫曼樹一步步完成”呢?在word2vec中,我們采用了二元邏輯回歸的方法,即規定沿着左子樹走,那么就是負類(霍夫曼樹編碼1),沿着右子樹走,那么就是正類(霍夫曼樹編碼0)。判別正類和負類的方法是使用sigmoid函數
關於嵌入維度數量(New Embedding維度)的一般經驗法則:embedding_dimensions = number_of_categories**0.25
- 優缺點
缺點:
- 用戶的行為序列時序性缺失
- 用戶行為序列中的item強度是無區分性的
Item2Vec算法主流程
- 從log中抽取用戶行為序列
- 將行為序列當成預料訓練word2Vec得到item embedding
- 得到item sim關系用於推薦
