基于協(xié)同過濾的推薦算法

1. 基本思想

協(xié)同過濾推薦算法是最經(jīng)典的推薦算法,它的算法思想為物以類聚,人以群分,基本的協(xié)同過濾算法基于以下的假設(shè):

  • User-based CF 基于用戶的協(xié)同過濾推薦:“跟你愛好相似的人喜歡的東西你也可能會喜歡”
  • Item-based CF 基于物品的協(xié)同過濾推薦:“跟你喜歡的東西相似的東西你也可能會喜歡”

實(shí)現(xiàn)協(xié)同過濾的步驟:
1). 找到相似的Top-N個(gè)人或者物品:計(jì)算兩兩的相似度并進(jìn)行排序
2). 根據(jù)相似的人或物品產(chǎn)生推薦結(jié)果:利用Top-N生成初始推薦結(jié)果,然后過濾掉用戶已經(jīng)有過記錄或者明確表示不喜歡的物品

那么,如何計(jì)算相似度呢?

2. 相似度計(jì)算

根據(jù)數(shù)據(jù)類型的不同,相似度的計(jì)算方式也不同,數(shù)據(jù)類型有:

  • 實(shí)數(shù)型(物品評分情況)
  • 布爾型(用戶的行為:是否點(diǎn)擊、是否收藏、是否點(diǎn)贊等)

一般的,相似度計(jì)算有杰卡德相似度、余弦相似度、皮爾遜相關(guān)系數(shù)

  • 余弦相似度

    • 度量的是兩個(gè)向量之間的夾角,用夾角的余弦值來度量相似的情況

    • 余弦相似度與向量長度無關(guān),一般計(jì)算時(shí)都要對向量長度進(jìn)行歸一化,兩個(gè)向量只要方向一致,無論程度強(qiáng)弱,都視為“相似”

      n維空間點(diǎn)a(x_{11},x_{12},...,x_{1n})與b(x_{21},x_{22},...,x_{2n})間的余弦相似度(兩個(gè)n維向量):
      \cos{\theta} = \dfrac{a \cdot b}{\lvert a \rvert \lvert b \rvert}=\dfrac{\sum_{k=1}^n x_{1k} x_{2k}}{\sqrt{\sum_{k=1}^n x_{1k}^2} \sqrt{\sum_{k=1}^n x_{2k}^2}}

  • 皮爾遜相關(guān)系數(shù)

    • 實(shí)際上也是一種余弦相似度,不過先對向量做了中心化,向量a,b各自減去向量的均值后,再計(jì)算余弦相似度
    • 度量的是兩個(gè)變量的變化趨勢是否一致,不適合計(jì)算布爾值向量之間的相關(guān)度
    • 計(jì)算結(jié)果在[-1,1]之間,-1表示負(fù)相關(guān),1表示正相關(guān)
      n維空間點(diǎn)a(x_{11},x_{12},...,x_{1n})與b(x_{21},x_{22},...,x_{2n})間的皮爾遜相關(guān)系數(shù)(兩個(gè)n維向量):
      corr(a,b) =\dfrac{\sum_{k=1}^n (x_{1k}-\overline{x_1}) (x_{2k}-\overline{x_2})}{\sqrt{\sum_{k=1}^n (x_{1k}-\overline{x_1})^2} \sqrt{\sum_{k=1}^n (x_{2k}-\overline{x_2})^2}}
  • 杰卡德相似度

    • 兩個(gè)集合的交集元素個(gè)數(shù)在并集中所占的比例,非常適用于布爾向量表示

余弦相似度和皮爾遜相關(guān)系數(shù)適合用戶評分?jǐn)?shù)據(jù)(實(shí)數(shù)值)
杰卡德相似度適用于隱式反饋數(shù)據(jù)(0,1 布爾值)

3. 關(guān)于用戶-物品評分矩陣

在協(xié)同過濾推薦算法中,我們更多的是利用用戶對物品的評分?jǐn)?shù)據(jù)集,預(yù)測用戶對沒有評分過的物品的評分結(jié)果。

用戶-物品的評分矩陣,根據(jù)評分矩陣的稀疏程度會有不同的解決方案。

  • 稠密評分矩陣

    用戶/物品 物品A 物品B 物品C 物品D 物品E
    用戶1 5 3 4 4 ?
    用戶2 3 1 2 3 3
    用戶3 4 3 4 3 5
    用戶4 3 3 1 5 4
    用戶5 1 5 5 2 1
  • 稀疏評分矩陣

    用戶/物品 物品A 物品B 物品C 物品D 物品E
    用戶1 5 3 4 ? ?
    用戶2 ? ? ? 3 3
    用戶3 4 3 4 ? 5
    用戶4 ? 3 ? 5 ?
    用戶5 1 ? 5 ? 1
使用協(xié)同過濾推薦算法預(yù)測評分-稠密評分矩陣

目的:預(yù)測用戶1對于物品E的評分

步驟分析:

  • 構(gòu)架數(shù)據(jù)集
  • 計(jì)算用戶兩兩之間及物品兩兩之間相似度,對于評分?jǐn)?shù)據(jù)這里我們采用皮爾遜相關(guān)系數(shù)
  • 評分預(yù)測:
    • User-based CF:取出與用戶1正相關(guān)的用戶,使用用戶間相似度。公式如下,該方案考慮了用戶本身的評分及近鄰用戶的加權(quán)評分相似度打分:
      pred(u,i)=\hat{r_{ui}}=\dfrac {\sum_{v∈U} sim(u,v)*r_{vi}}{\sum_{v∈U} \vert sim(u,v) \vert}
    • Item-based CF:取出與物品E正相關(guān)的物品,使用物品間相似度。公式如下,該方案結(jié)合了預(yù)測物品與相似物品的加權(quán)評分相似度打分:
      pred(u,i)=\hat{r_{ui}}=\dfrac {\sum_{j∈I_{rated}} sim(i,j)*r_{uj}}{\sum_{j∈I_{rated}} sim(i,j) }

實(shí)現(xiàn)過程

  1. 構(gòu)建數(shù)據(jù)集:注意構(gòu)建評分矩陣時(shí),對于缺失的部分需要保留為None,如果設(shè)置為0那么會被當(dāng)做評分0
import pandas as pd

users = ["User1", "User2", "User3", "User4", "User5"]
items = ["Item A", "Item B", "Item C", "Item D", "Item E"]
# 用戶購買記錄數(shù)據(jù)集
datasets = [
    [5,3,4,4,None],
    [3,1,2,3,3],
    [4,3,4,3,5],
    [3,3,1,5,4],
    [1,5,5,2,1],
]
  1. 計(jì)算用戶兩兩之間及物品兩兩之間相似度,對于評分?jǐn)?shù)據(jù)這里我們采用皮爾遜相關(guān)系數(shù)

pandas中corr方法可直接用于計(jì)算皮爾遜相關(guān)系數(shù)

df = pd.DataFrame(datasets,index=users,columns=items)

print("用戶之間的兩兩相似度:")
# 直接計(jì)算皮爾遜相關(guān)系數(shù)
# 默認(rèn)是按列進(jìn)行計(jì)算,因此如果計(jì)算用戶間的相似度,當(dāng)前需要進(jìn)行轉(zhuǎn)置
user_similar = df.T.corr()
user_similar.round(4)

print("物品之間的兩兩相似度:")
item_similar = df.corr()
item_similar.round(4)

用戶之間的兩兩相似度:

- User1 User2 User3 User4 User5
User1 1.0000 0.8528 0.7071 0.0000 -0.7921
User2 0.8528 1.0000 0.4677 0.4900 -0.9001
User3 0.7071 0.4677 1.0000 -0.1612 -0.4666
User4 0.0000 0.4900 -0.1612 1.0000 -0.6415
User5 -0.7921 -0.9001 -0.4666 -0.6415 1.0000

物品之間的兩兩相似度:

- Item A Item B Item C Item D Item E
Item A 1.0000 -0.4767 -0.1231 0.5322 0.9695
Item B -0.4767 1.0000 0.6455 -0.3101 -0.4781
Item C -0.1231 0.6455 1.0000 -0.7206 -0.4276
Item D 0.5322 -0.3101 -0.7206 1.0000 0.5817
Item E 0.9695 -0.4781 -0.4276 0.5817 1.0000
  1. 評分預(yù)測
    基于用戶相似度計(jì)算 用戶1對于商品E的評分
    1).根據(jù)user_similar獲取用戶1相似的兩個(gè)用戶為:User2,User3
    2).User2,User3對商品E的評分分別為3.0和5.0
    3).計(jì)算用戶1對于商品E的評分:(0.85283.0+0.70715.0)/(0.8528+0.7071)=3.91

    基于物品相似度計(jì)算 用戶1對于商品E的評分
    1).根據(jù)item_similar獲取商品E相似的兩個(gè)商品為商品A和商品D
    2).用戶1對于商品A和商品D的評分分別為5和4
    3).計(jì)算用戶1對于商品E的評分:(0.96955+0.58174)/(0.9695+0.5817)=4.625

對比可見,User-based CF 和 Item-based CF 的結(jié)果是有差異的,因?yàn)閲?yán)格意義上他們應(yīng)該是屬于兩種不同的推薦算法,各自在不同的領(lǐng)域,會比另一種更佳,但是具體場景下哪種更合適,需要進(jìn)行合理的評估,因此在實(shí)現(xiàn)推薦系統(tǒng)時(shí),這兩種算法往往都是需要實(shí)現(xiàn)的,然后根據(jù)推薦的效果分析選出更優(yōu)方案。

對于稀疏矩陣,使用基于模型的協(xié)同過濾是更高級的算法,如基于圖的模型、基于矩陣分解的方法,這個(gè)下篇文章再介紹。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容