美文网首页
基于用户的协同过滤算法

基于用户的协同过滤算法

作者: 不要重不要重 | 来源:发表于2019-04-26 19:05 被阅读0次

    看项亮的《推荐算法》记录如下,这是我看过最最最好理解的书:

    1. UserCF
    item_users = dict()
    for u, items in train.items():  
        for i in items.keys():
            if i not in item_users:
                item_users[i] = set()
            item_users[i].add(u)
    C = dict()
    N = dict()
    for i, users in item_users.items():
        for u in users:
            N[u] += 1
            for v in users:
                if u == v:
                    continue
                C[u][v] += 1
    W = dict()
    for u, related_users in C.items():
        for v, cuv in related_users.items():
            W[u][v] = cuv / math.sqrt(N[u] * N[v])
    return W
    

    (1).第一部分形成物品到用户的倒排表,索引为物品id ,指向-->所有产生过正向行为的用户id
    (2).从倒排表形成 二维数组,c[用户idA][用户idB]= A和B产生过正向行为的物品的交集数量
    (3).计算用户之间的相似度(余弦相似度公式)

    1. User-IIF UserCF的改进
      只有上面第二部分有改动
    for i, users in item_users.items():
        for u in users:
            N[u] += 1
            for v in users:
                if u == v:
                    continue
                C[u][v] += 1 / math.log(1 + len(users))
    

    可见只有 在用户的交集上有变化,不再是单纯的加1,而是加该物品的权重,以减少流行或热数据对于最后结果的影响

    1. UserCF 推荐算法
    def Recommend(user, train, W):
       rank = dict()
       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 in interacted_items:
                   #we should filter items user interacted before
                   continue
               rank[i] += wuv * rvi
    return rank
    

    对上述产生的用户相似度矩阵中关于 user 的列排序,找到前K个,然后把该K个用户的数据中产生过的物品 筛掉 本user产生过的物品,并计算出筛选后的数据的可推荐概率,最后返回该矩阵,调用者可以按需取需top n

    相关文章

      网友评论

          本文标题:基于用户的协同过滤算法

          本文链接:https://www.haomeiwen.com/subject/rvgqnqtx.html