基本步驟:
1- 找到和目標(biāo)用戶興趣相同的用戶集合
2- 找到這個集合中用戶喜歡的,且目標(biāo)用戶沒有聽過的物品推薦給用戶
用戶興趣相似度計算
1- jaccard : (N(u) && N(v)) / (N(u) || N(v))
2- 余弦相似度 len(N(u)&& N(v)) / (len(N(u))x len(N(v)))
算法1:簡單直接法
def UserSimiliar(train):
W=dict()
for u in train.keys():
for v in train.keys():
if (u==v) :
continue
W[u][v]=len(train[u] & train[v]) / math.sqrt(len(train[u])*len(train[v]) *1)
return W
算法2:根據(jù)物品建立倒排法,在倒排中計算用戶的相似度
def UserSimiliar(train):
item_users = {}
for u,items in train:
for item in items.keys():
if item is not in item_users.keys():
item_users[item]=set()
item_users[item].add[user] 倒排...
C =N= {}
for i,users in item_users:
for u in users :
N[u]+=1 # 計數(shù)
for v in users:
if u!=v:
c[u][v]+=1 # cuv
W=dict()
for u,related_users in C:
for v,cuv in related_usres.items():
W[u][v] = cuv/math.sqrt(N[u]*N[v])
return W
UserCF 算法
推薦和他興趣類似的K 個用戶喜歡的物品
def Recommend(user,train,W):
rank ={}
interacted_items = train[user] 用戶喜歡的物品
for v, wuv in sorted(W[u].items, key = itemgetter(1)), reverse= True)[0:k]:
for i,rvi in train[v].items:
if i not in interactive_items: # 不是用戶U 喜歡的,就推薦
rank[i]+=wuv*rvi
return rank .
UserCF-IIF算法
如果兩個用戶都買過新華字典,這絲毫不能說明他們興趣相似。因?yàn)榻^大多數(shù)人都要買。但是兩個用戶都買過數(shù)據(jù)挖掘,說明興趣相似。
所以需要懲罰熱門的相似物品。
def UserSimilarity(train):
for i,users in item_users.items():
for u in users:
C[u][v]+= 1/math.log(1+len(users)) #
UserCF-IIF 覆蓋度和召回率會略優(yōu)于UserCF.
實(shí)際應(yīng)用:
Digg