amazon , netflix, hulu , youtube
基本思想
ItemCF 并不利用物品的內(nèi)容屬性計(jì)算物品之間的相似度,他主要通過(guò)分析用戶行為記錄物品的相似度。
算法認(rèn)為:A 和B 相似,是由于喜歡A 的用戶大都也喜歡B
利用用戶的歷史行為給推薦結(jié)果提供推薦解釋。例如喜歡或者收藏過(guò)的射雕,推薦天龍八部。
基本步驟:
1、計(jì)算物品相似度
2、根據(jù)物品相似度和用戶的歷史行為生成推薦列表
物品相似度計(jì)算
Wij = |同時(shí)喜歡物品i,j 的人數(shù)| / |喜歡物品i的人數(shù)|
懲罰熱門物品:
Wij = |同時(shí)喜歡物品i,j 的人數(shù)| / sqrt(喜歡i 的人數(shù)x 喜歡j的人數(shù))**
物品相似矩陣計(jì)算
def ItemSimilarity(train):
c=N={}
for u,items in train.items(): 建立用戶物品倒排表
for i in items :
N[i] +=1
for j in items;
c[i,j]+=1
S = {}
for i , related_items in C.items
for j,cij in related_items.items():
Sij = cij /match.sqrt(N[i]*N[j]) 計(jì)算物品相似度
return S
計(jì)算用戶u對(duì)一個(gè)物品的興趣:
Puj = sum(Sji, Rui) j (- 和j 最類似的k個(gè)物品集合
該公式的含義是:
**和用戶歷史上感興趣的物品越相似的物品,越可能在用戶的推薦列表中獲得高排名。
def Recommendation(train , user_id, S,K) :
rank = {}
ru = train[user_id]
for rui , pi in ru.items(): # pi 可以簡(jiǎn)單的命名為1
for j,sj in sorted (S[i].items, key= itemgetter(1),reverse=True)[0:k]
最相似的K個(gè)物品
rank[j].weight +=pi*sj
rank[j].reason[i]=pi*wj
return rank .
itemCF 流行度效果更好些,但是準(zhǔn)確率隨k值提高沒(méi)有改善。
剔除用戶活躍度對(duì)物品相似度的影響
1、IUF
Sij = cij /match.sqrt(N[i]*N[j]) 計(jì)算物品相似度
弱化,那么僅僅忽略 Cij = (1+1/log(1+N(u))
2、當(dāng)然也可以忽略掉活躍度過(guò)高的用戶。
物品相似度的歸一化
W' ij = wij / maxJ(wij) 按類歸一化
歸一化后,覆蓋率能夠提高4個(gè)百分點(diǎn)