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(
)與b(
)間的余弦相似度(兩個(gè)n維向量):
-
皮爾遜相關(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()與b(
)間的皮爾遜相關(guān)系數(shù)(兩個(gè)n維向量):
-
杰卡德相似度
- 兩個(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)評分相似度打分:
- Item-based CF:取出與物品E正相關(guān)的物品,使用物品間相似度。公式如下,該方案結(jié)合了預(yù)測物品與相似物品的加權(quán)評分相似度打分:
- User-based CF:取出與用戶1正相關(guān)的用戶,使用用戶間相似度。公式如下,該方案考慮了用戶本身的評分及近鄰用戶的加權(quán)評分相似度打分:
實(shí)現(xiàn)過程
- 構(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],
]
- 計(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 |
-
評分預(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)方案。