1. 協同過濾
協同過濾(Collaborative Filtering,CF)——經典/老牌
只用戶行為數據得到。對於 個用戶, 個物品,則有共現矩陣 :
對於有正負反饋的情況,如「贊」是1和「踩」是-1,無操作是0:
對於只有顯示反饋,如點擊是1,無操作是0:
演算法步驟:
1)得到共現矩陣 ;
2)計算 任意兩行 用戶相似度,得到用戶相似度矩陣 ;
3)針對某個用戶 選出與其最相似的 個用戶, 是超參數;——召回階段
4)基於這 個用戶,計算 對每個物品的得分;
5)按照用戶 的物品得分進行排序,過濾已推薦的物品,推薦剩下得分最高的 個。——排序階段
第2步中,怎麼計算用戶相似度?——使用共現矩陣的行
以餘弦相似度為標准,計算 和 之間的相似度:
第4步中,怎麼每個用戶對每個物品的得分?
假如和用戶 最相似的2個為 和 :
對物品 的評分為1,用戶 對物品 的評分也為1,那麼用戶 對 的評分為:
也就是說:利用用戶相似度對用戶評分進行加權平均:
其中, 為用戶 和用戶 之間的相似度, 為用戶 和物品 之間的相似度。
UserCF的缺點
1、現實中用戶數遠遠大於物品數,所以維護用戶相似度矩陣代價很大;
2、共現矩陣是很稀疏的,那麼計算計算用戶相似度的准確度很低。
演算法步驟:
1)得到共現矩陣 ;
2)計算 任意兩列 物品相似度,得到物品相似度矩陣 ;
3)對於有正負反饋的,獲得用戶 正反饋的物品;
4)找出用戶 正反饋的物品最相似的 個物品,組成相似物品集合;——召回階段
5)利用相似度分值對相似物品集合進行排序,生產推薦列表。——排序階段
最簡單情況下一個物品(用戶未接觸的)只出現在另一個物品(用戶已反饋的)的最相似集合中,那麼每個用戶對每個物品的得分就是相似度。如果一個物品和多個物品最相似怎麼辦?
如用戶正反饋的是 和 ,對於物品 其最相似的是 ,相似度為0.7,對於物品 其最相似的也是 ,相似度為0.6,那麼 相似度為:
也就是說:如果一個物品出現在多個物品的 個最相似的物品集合中,那麼該物品的相似度為多個相似度乘以對應評分的累加。
其中, 是物品p與物品h的相似度, 是用戶u對物品p的評分。
第2步中,怎麼計算物品相似度?——使用共現矩陣的列
以餘弦相似度為標准,計算 和 之間的相似度:
餘弦相似度
皮爾遜相關系數
基於皮爾遜相關系數的改進
UserCF適用於用戶興趣比較分散變換較快的場景,如新聞推薦。
IteamCF適用於用戶情趣不叫穩定的場景,如電商推薦。
優點:直觀,可解釋性強。
缺點:
2. 利用 SVD 實現協同過濾推薦演算法
奇異值分解(Singular Value Decomposition,以下簡稱SVD)
是在機器學習領域廣泛應用的演算法,它不光可以用於 降維演算法中的特徵分解 ,還可以用於 推薦系統 ,以及自然語言處理等領域。
優點: 簡化數據,去除雜訊,提高演算法的結果。
缺點: 數據的轉換可能難以理解。
應用領域: 推薦引擎(協同過濾、相似度計算)、圖像壓縮等。
SVD定義: 如果我們求出了矩陣A的n個特徵值λ1≤λ2≤...≤λn,以及這n個特徵值所對應的特徵向量{w1,w2,...wn},如果這n個特徵向量線性無關,那麼矩陣A就可以用下式的特徵分解表示:A=WΣW−1,其中W是這n個特徵向量所張成的n×n維矩陣,而Σ為這n個特徵值為主對角線的n×n維矩陣。一般我們會把W的這n個特徵向量標准化,即滿足||wi||2=1, 或者wiTwi=1,此時W的n個特徵向量為標准正交基,滿WTW=I,即WT=W−1, 也就是說W為酉矩陣。要進行特徵分解,矩陣A必須為方陣。那麼如果A不是方陣,則用到SVD。
矩陣A的SVD為:A=UΣVT,其中U是一個m×m的矩陣,Σ是一個m×n的矩陣,除了主對角線上的元素以外全為0,主對角線上的每個元素都稱為奇異值,V是一個n×n的矩陣。U和V都是酉矩陣,即滿足UTU=I,VTV=I。
對於奇異值,它跟我們特徵分解中的特徵值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就佔了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。
因此SVD 也是一種強大的降維工具 ,可以利用 SVD 來逼近矩陣並從中獲得主要的特徵。通過保留矩陣的 80%~90% 的能量,就可以得到重用的特徵並去除雜訊。
推薦系統 是利用電子商務網站向客戶提供商品信息和建議,幫助用戶決定應該購買什麼產品,模擬銷售人員幫助客戶完成購買過程。
主要有以下幾種推薦演算法:
基於內容的推薦(用到自然語言處理), 協同過濾(主流) ,基於規則推薦(基於最多用戶點擊,最多用戶瀏覽等),混合推薦(類似集成演算法,投票決定),基於人口統計信息的推薦(根據用戶基本信息)
協同過濾推薦分為三種類型。 第一種是基於用戶(user-based)的協同過濾(需要在線找用戶和用戶之間的相似度關系),第二種是基於項目(item-based)的協同過濾(基於項目的協同過濾可以離線找物品和物品之間的相似度關系), 第三種是基於模型(model based)的協同過濾(用戶和物品,主流)。
一般在推薦系統中,數據往往是使用 用戶-物品 矩陣來表示的。 用戶對其接觸過的物品進行評分,評分表示了用戶對於物品的喜愛程度,分數越高,表示用戶越喜歡這個物品。而這個矩陣往往是稀疏的,空白項是用戶還未接觸到的物品,推薦系統的任務則是選擇其中的部分物品推薦給用戶。
對於這個 用戶-物品 矩陣,用已有的部分稀疏數據來預測那些空白的物品和數據之間的評分關系,找到最高評分的物品推薦給用戶。
具體基於模型的方法有:
用關聯演算法做協同過濾(Apriori演算法、FP Tree演算法)
用聚類演算法做協同過濾(針對基於用戶或者基於模型,Kmeans,DBSCAN)
用分類演算法做協同過濾(設定評分閾值,高於推薦,低於不推薦,邏輯回歸和樸素貝葉斯,解釋性很強)
用回歸演算法做協同過濾(Ridge回歸,回歸樹)
用矩陣分解做協同過濾(由於傳統的奇異值分解SVD要求矩陣不能有缺失數據,必須是稠密的,而用戶物品評分矩陣是一個典型的稀疏矩陣,主要是SVD的一些變種,比如FunkSVD,BiasSVD和SVD++。這些演算法和傳統SVD的最大區別是不再要求將矩陣分解為UΣVT的形式,而變是兩個低秩矩陣PTQ的乘積形式。)
用神經網路做協同過濾(限制玻爾茲曼機RBM)
在 Python 的 numpy 中,linalg已經實現了SVD
3. 協同過濾與分類
[TOC]
本文是《寫給程序員的數據挖掘實踐指南》的一周性筆記總結。主要涵蓋了以下內容:
所謂推薦系統就是系統根據你的行為操作為你推薦你可能想要的其他物品。這在電商平台、音樂平台、資訊推送平台等多有見到。而協同過濾簡單來說是利用某興趣相投、擁有共同經驗之群體的喜好來推薦用戶感興趣的信息,個人通過合作的機制給予信息相當程度的回應(如評分)並記錄下來以達到過濾的目的進而幫助別人篩選信息。其推薦基礎是用戶評分。這里可以分為兩種用戶評分,即顯式評分與隱式評分。顯式評分即日常見到的為物品打分,如對喜好音樂評級等;隱式評分是通過對用戶行為的持續性觀察,進而發現用戶偏好的一種方法,如新聞網頁中的推送你經常閱讀過的相關內容等。兩種評分方法都有自己的問題。
總體來說,協同過濾其運作機制也可以分為兩種:
基於用戶的推薦是指通過用戶的行為偏好,劃分相似用戶。在相似用戶群體之間互相推送一方喜歡而另一方未有過的物品。核心在於相似用戶群體的劃分。這種推薦方法有自己的局限:
基於用戶的過濾其核心是用戶群體的劃分,其實也就是分類。
這里的距離函數包括三種:曼哈頓距離和歐氏距離。這里以二維舉例,更多維情況下類推即可。
兩距離函數可以一般化為:
其中,當r=1時,函數為曼哈頓距離;當r=2時,函數為歐氏距離。
演算法實現:
在算出距離函數後,通過比對目標用戶與所有用戶群體的偏好,找到最近鄰的用戶並給予推薦。
基於用戶距離的推薦有一個明顯的問題,就是用戶評分體系的差異。比如評分極端的用戶給喜歡的評最高分,給不喜歡的評最低分;而有些用戶傾向於不出現極端評分。即所謂「分數貶值」( Grade Inflation )問題。這種問題的存在可能讓基於距離的評分產生偏差。皮爾遜相關系數可以緩解這種問題。
原皮爾遜相關系數公式在實際運用的時候會出現多次迭代的問題,影響計算效率,這里給出了近似公式:
皮爾遜相關系數的用戶判斷依據不是單純的用戶距離,而是用戶的評分一致性:取值在[-1, 1]之間,越接近1則表示兩用戶的評分一致性越好;反之則反。
python實現:
基於用戶推薦的過程中,另一個存在的問題就是由於大部分人的喜愛物品集合的交集過少,存在大量計算值為0的feature的情況。即所謂 稀疏性 問題。一個較容易理解的例子是對書本內容的挖掘。餘弦相似度會忽略這種0-0匹配。
餘弦相似度:
python實現:
如此多的評估系數,如何進行抉擇呢?根據數據特徵:
另外值得考慮的一點是,目前為止的推薦都是基於單用戶的。即對一個用戶的推薦系統只是基於另一個用戶。這會存在一些問題。比如雖然雖然兩者相似度很高,但是另外一個人有一些怪癖,怪癖的推薦就是不合理的;又比如,在相似度極高的情況下,你不能確定統一賬戶下的操作是同一個人做出的或者說操作行為是為了用戶自身。比如用戶考慮購買某件商品作為禮物送給別人,這就是基於別人喜好的購買行為,這種推薦也是不合適的。
對這種問題的解決可以使用群體劃分的方法。原理與單用戶類似,但是用戶的匹配是k個。在這k位最優匹配的用戶之間,以相似度的大小為依據設定權重作為物品推薦的條件。此即協同過濾的k近鄰。
正如前面提到的基於用戶的推薦有復雜度、稀疏性的問題,而基於物品的過濾則可以緩解這些問題。所謂基於物品的過濾是指,我們事先找到最相似的物品,並結合用戶對物品的評級結果來生成推薦。前提是要對物品進行相似度匹配,找到一種演算法。
這里的調整是指為了減輕用戶評分體系的不一致情況(抵消分數貶值),從每個評級結果中減去該用戶所有物品的平均分的評級結果。
其中,U表示所有同時對i, j進行評級過的用戶的集合。 表示用戶u給物品i的評分減去用戶u對所有物品的評分的平均值。
在得到所有物品的餘弦相似度後,我們就可以通過該指數預測用戶對某件物品的偏好程度。方法就是所有相似物品的相似度乘以得分的總和。
其中p(u, i)指的是用戶u對物品i評分的預測值。N是用戶u的所有評級物品中每個和i得分相似的物品。這里的相似指的是矩陣中存在N和i的一個相似度得分。 是i和N之間的相似度得分。 是u給N的評級結果。公式較好運行的條件是 取值在(-1, 1)之間,這里就要使用歸一化概念。
另一種常用的基於物品過濾的演算法就是 slope one 演算法。它的大概原理是預測用戶u對產品j的評分時,預先計算包含所有物品的兩物品偏差表;根據u的已評價的所有物品評分與該物品和產品j的偏差( )之和並乘以所有對此兩類物品有過評分的用戶個數,一一加總,除以所有同時對產品i與u評價過的所有物品有過評分的用戶的人數,得到得分。公式如下:
其中, ; 是利用加權s1演算法給出的用戶u對物品j的預測值。 指的是對所有除j之外u打過分的物品。
python實現:
在前面兩節中,基於物品和基於用戶的過濾其前提都是用戶需要對已有的item進行評分。而實際上,如果一個新的item出現,由於缺乏別人的偏好,他永遠不會被推薦。這就是推薦系統中所謂的—— 冷啟動 問題。基於用戶評價的系統就會出現這種問題。
冷啟動 問題的解決方案之一就是 基於物品屬性的過濾 來進行推薦:對物品自身的屬性進行歸納總結,並以此進行物品推薦。基於物品屬性的過濾存在一個問題同樣是量綱的不統一。如果量綱不統一極端值將會對推薦系統造成大麻煩。解決方法也很簡單:歸一化。此章使用的是z-評分。
使用z得分也存在問題,就是極易受到離群值的影響。這里可以使用 改進的標准分數 來緩解這個問題:
什麼時候可以進行歸一化呢?
這里用曼哈頓距離舉例基於物品屬性的過濾:
在上一章最後一節對於用戶是否喜歡某件item的判別中,實際上包含了分類器的思想:分類器就是利用對象屬性判定對象屬於哪個組或類別的程序。這里簡單用另一個小項目來說明。
簡單來說就是根據運動員的某些指標來判斷這位運動員屬於什麼類別的運動員。
准確率有0.8。