基本步骤:
1- 找到和目标用户兴趣相同的用户集合
2- 找到这个集合中用户喜欢的,且目标用户没有听过的物品推荐给用户
用户兴趣相似度计算
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:根据物品建立倒排法,在倒排中计算用户的相似度
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 # 计数
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算法
如果两个用户都买过新华字典,这丝毫不能说明他们兴趣相似。因为绝大多数人都要买。但是两个用户都买过数据挖掘,说明兴趣相似。
所以需要惩罚热门的相似物品。
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 覆盖度和召回率会略优于UserCF.
实际应用:
Digg