推荐系统——协同过滤
協同過濾
協同過濾算法一般是通過用戶之前的喜好或者相似的用戶的喜好來推薦商品
基于領域的協同過濾算法一般有兩種算法:
- 基于用戶的協同過濾算法(UserCF):基于與用戶相似用戶的喜好進行推薦
- 基于物品的協同過濾算法(ItemCF):基于用戶喜好的物品尋找相似的物品進行推薦
對于以上兩種算法而言,我們要進行相似性的對比,首先需要進行相似度的計算,為相似度的計算可以使用以下方法。
相似性度量方法
相似度度量可以使用很多指標,其本質還是計算不同事物之間的距離,那么距離越大,相似性越小,距離越小,相似性越大,那么,除了學習資料中提到的3個系數之外,我覺得也可以使用歐式距離,曼哈頓距離,切比雪夫距離等等。但在這里我就只說明學習資料中幾個系數。其他指標可以參考https://www.cnblogs.com/duanchw-37/archive/2012/08/24/2654019.html
simuv=∣N(u)∩N(v)∣∣N(u)∣∪∣N(v)∣sim_{uv} = \frac{|N(u) \cap N(v)|}{|N(u)| \cup |N(v)|}simuv?=∣N(u)∣∪∣N(v)∣∣N(u)∩N(v)∣?
其中,N(u)代表喜歡物品u的用戶的集合
余弦相似度可以抽象的想象以下,兩個向量在坐標系中的余弦夾角越小,那么它們的角度的余弦值就越接近于1,所以可以給出定義:
simuv=∣N(u)∣∩∣N(v)∣∣N(u)?∣N(v)∣sim_{uv} = \frac{|N(u)| \cap |N(v)|}{\sqrt{|N(u) \cdot |N(v)|}}simuv?=∣N(u)?∣N(v)∣?∣N(u)∣∩∣N(v)∣?
與杰卡德系數相比,余弦相似度的改變在于將分母中的“并”改變為“乘”
python中提供了計算余弦相似度的函數
from sklearn.metrics.pairwise import cosine_similarityi = [1, 0, 0, 0] j = [1, 0.5, 0.5, 0]cosine_similarity([a,b])皮爾遜相關系數在統計學中經常被提到,在這里也很好理解,用來解釋兩個事物之間的相關性,所以可以作為相似性度量的一個指標。對于相關系數的理解,我們利用概率論與數理統計中的協方差進行理解,下面給出定義:
sim(u,v)=∑i∈I(rui?r ̄u)(rvi?r ̄v)∑i∈I(rui?r ̄u)2∑i∈I(rvi?r ̄v)2sim(u,v) = \frac{\sum_{i\in I}(r_{ui}-\overline{r}_u)(r_{vi}-\overline{r}_v)}{\sqrt{\sum_{i\in I}(r_{ui}-\overline{r}_u)^2}\sqrt{\sum_{i\in I}(r_{vi}-\overline{r}_v)^2}}sim(u,v)=∑i∈I?(rui??ru?)2?∑i∈I?(rvi??rv?)2?∑i∈I?(rui??ru?)(rvi??rv?)?
其中,r ̄u\overline{r}_uru?表示為用戶打的所有分數的期望/物品被打的所有分的期望。
其中,皮爾遜相關系數可以結合余弦相似度的計算方法
計算r ̄u與r ̄v→將余弦相似度的計算公式中的分子改成減去r ̄u和r ̄v計算\overline{r}_u與\overline{r}_v \rightarrow 將余弦相似度的計算公式中的分子改成減去\overline{r}_u和\overline{r}_v計算ru?與rv?→將余弦相似度的計算公式中的分子改成減去ru?和rv?
python中也給出了計算皮爾遜相關系數的函數
from scipy.stats import pearsonri = [1, 0, 0, 0] j = [1, 0.5, 0.5, 0] pearsonr(i, j)當然,我們也可以直接使用numpy庫中的coefcorr函數進行計算
import numpy as npi = [1, 0, 0, 0] j = [1, 0.5, 0.5 , 0] np.coefcorr(i, j)給出一個三個相似性度量系數的比較
| 利用兩個集合之間的交集來顯示集合之間的相互覆蓋率來體現集合間的相似度 | 利用特征向量之間的夾角來體現兩個集合之間的相似度 | 在余弦相似度的基礎上利用了期望的信息進行修正,減小了用戶評分偏置的影響。 |
基于用戶的協同過濾——UserCF
UserCF的主要思想是對于一個用戶,找到與其相似的用戶,將該用戶喜好的物品推薦給該用戶。
所以首要目的即找到一個與當前用戶相似的用戶集合。
給出一個例子進行解釋:
| Alice | 5 | 3 | 4 | 4 | ? |
| 用戶1 | 3 | 1 | 2 | 3 | 3 |
| 用戶2 | 4 | 3 | 4 | 3 | 5 |
| 用戶3 | 3 | 3 | 1 | 5 | 4 |
| 用戶4 | 1 | 5 | 5 | 2 | 1 |
對于這個例子來說,因為在這里物品5對于Alice而言是缺失的,那么每個用戶的特征向量其實就只有4個維度,那么我們下面我們分別用余弦相似度和皮爾遜相似度去計算一下用戶之間的相似度。
利用余弦相似度計算
利用皮爾遜相關系數計算
計算出用戶之間的相似度之后,此時我們需要補全二維表格中空缺的那個值,一般可以我們可以取與Alice相似的N個用戶的評分的平均值,但是這樣子無法保證用戶的標準相同,所以在這里我們不采用該種方法,于是我們將用戶打分的均值利用進來,有如下公式
Ri,j=Ri ̄+∑k=1n(Si,k(Rk,j?R ̄k))∑k=1nSj,kR_{i,j} = \overline{R_i} + \frac{\sum_{k=1}^n(S_{i,k}(R_{k,j}-\overline{R}_k))}{\sum_{k=1}^n S_{j,k}}Ri,j?=Ri??+∑k=1n?Sj,k?∑k=1n?(Si,k?(Rk,j??Rk?))?
其中,Ri,jR_{i,j}Ri,j?為用戶i對物品j的打分,R ̄i\overline{R}_iRi?是用戶i對所有物品打分的平均值,Si,kS_{i,k}Si,k?為用戶i與k的相似度(在這里,我們利用用戶之間的相似度進行加權求和)。
假設我們取前2個最相似用戶,那么如果采用余弦相似度(皮爾遜相關系數也是相同步驟)去計算用戶相似度,那么有用戶1和用戶2與Alice最相似,于是,我們利用他們兩個的評分去計算缺失得分。
利用上面的公式,我們可以計算出其得分為4.87
利用計算出的得分,我們可以對多個物品進行排序,其中有
| Alice | 5 | 3 | 4 | 4 | 4.87 |
于是推薦順序為1>5>3=4>2
下面談談UserCF的缺點
基于物品的協同過濾——ItemCF
基于物品的協同過濾,ItemCF,利用用戶過去的數據去為用戶推薦物品,即利用物品之間的相似性去進行推薦而不是利用用戶之間的相似性去推薦商品。算法認為:物品A和物品B具有很大的相似度是因為喜歡物品A的用戶大都喜歡物品B(對于物品的打分而言)
還是用UserCF的例子來解釋
| Alice | 5 | 3 | 4 | 4 | ? |
| 用戶1 | 3 | 1 | 2 | 3 | 3 |
| 用戶2 | 4 | 3 | 4 | 3 | 5 |
| 用戶3 | 3 | 3 | 1 | 5 | 4 |
| 用戶4 | 1 | 5 | 5 | 2 | 1 |
在這里,如何評判物品之間的相似度呢,我們以每個用戶為該物品打的分為特征。如物品1的特征向量為(3,4,3,1)(3, 4, 3, 1)(3,4,3,1)因為Alice對物品5的打分缺失,所以在這里Alice的打分在計算相似度時并不用計算入。
那么在這里,我們還是利用余弦相似度進行物品相似度的計算
在這里,我們要計算物品5與其他物品的相似度,所以,觀察結果,可以發現物品5與其他幾個物品的相似度分別為0.994,0.739,0.723,0.9400.994, 0.739, 0.723, 0.9400.994,0.739,0.723,0.940,所以選擇相似度較高的前兩個物品,即物品1和4。
同樣的,我們利用
Ri,j=Ri ̄+∑k=1n(Si,k(Rk,j?R ̄k))∑k=1nSj,kR_{i,j} = \overline{R_i} + \frac{\sum_{k=1}^n(S_{i,k}(R_{k,j}-\overline{R}_k))}{\sum_{k=1}^n S_{j,k}}Ri,j?=Ri??+∑k=1n?Sj,k?∑k=1n?(Si,k?(Rk,j??Rk?))?
去計算缺失數據,此時,Si,jS_{i,j}Si,j?的值代表物品i與j的相似度,則最終我們可以計算出來得分為4.6
那么,將得分排序
| Alice | 5 | 3 | 4 | 4 | 4.6 |
則選取兩個物品進行推薦,我們選擇物品1和物品5
協同過濾算法的改進
對于協同過濾算法,我們可以對其的相關度的計算方法進行改進
對于一號計算相關度的公式,如果物品i很受歡迎,那很多喜歡物品j的人也喜歡物品i,那么wijw_{ij}wij?就會變得很大,那么對于物品i而言,很多物品和物品i的相關度都會很大,即存在不合理性,所以我們可以引入N(j)N(j)N(j)來懲罰物品i的熱度,如二號所示,但是如果物品i十分受歡迎,導致所有人都會買i,那么wijw_{ij}wij?還是會很大,俗稱Harry Potter Problem,所以在這里我們控制N(j)N(j)N(j)和N(i)N(i)N(i)的權重,來定制不同的懲罰程度,如三號所示。
此外,對于ItemCF而言,我們需要對用戶活躍度進行懲罰(存在刷單現象,僅針對ItemCF),所以出現四號的計算方法。
解釋一下第四個式子,N(u)N(u)N(u)在這里代表用戶uuu的活躍程度,那么對于既喜歡物品iii又喜歡物品jjj的用戶而言,如果用戶uuu的活躍度越高,那么這個用戶的評價的權重就越低。
協同過濾算法的分析
協同過濾算法存在泛化能力弱的問題,導致協同過濾算法無法將相似物品的相似信息推廣到其他物品上(這么解釋,就是兩個物品,我們知道他們很相似,但是為什么相似我們是不知道的,所以無法利用這兩個物品之間的相似程度去為其他物品之間是否相似提供信息,我們只能單純地知道它們相似),從而導致熱門物體具有較強的頭部效應,導致它和其他很多物品相似;而尾部物品由于特征向量稀疏,導致不經常被推薦。不過話雖然這么說,但是不是有個指標叫新穎程度嗎,那尾部物品的新穎程度應該比較高吧,那這樣它作為指標的話,尾部物品還是很大程度可以占用一定比例的。
個人覺得還是因為協同過濾算法并沒有用上語義的信息,只能單純的依賴其他信息。
參考資料
https://www.cnblogs.com/duanchw-37/archive/2012/08/24/2654019.html
總結
以上是生活随笔為你收集整理的推荐系统——协同过滤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos安装无线网卡驱动_CentO
- 下一篇: 华为数通HCIE面试题目解密系列之RST