推荐算法-协同过滤2 基于用户

基本步骤:

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

你可能感兴趣的:(推荐算法-协同过滤2 基于用户)