基于物品的协同过滤算法itemCF原理及python代码实现

基于物品的协同过滤算法主要分为两步:

(1)计算物品之间的相似度;

(2)根据物品之间的相似度以及用户历史行为给用户生成推荐列表。

计算物品之间的相似度公式:


|N(i)|是喜欢物品i的用户数,所以分子是同时喜欢物品i和物品j的用户数。上述公式可以理解为喜欢物品i的用户中有多少比例的用户也喜欢物品j。分母惩罚了物品j的权重,可以避免推荐出热门的物品,从而使推荐系统更致力于挖掘长尾信息。

   用itemCF算法计算物品的相似首先度时,建立用户-物品倒排表,然后对于每个用户,将他物品列表中的物品两两在共现矩阵C中加1.详细代码如下所示:

 

#建立物品倒排表,计算物品相似度
def itemCF(user_dict):
    N=dict()
    C=defaultdict(defaultdict)
    W=defaultdict(defaultdict)
    for key in user_dict:
        for i in user_dict[key]:
            if i[0] not in N.keys(): #i[0]表示movie_id
                N[i[0]]=0
            N[i[0]]+=1               #N[i[0]]表示评论过某电影的用户数
            for j in user_dict[key]:
                if i==j:
                    continue
                if j[0] not in C[i[0]].keys():  ##这里一开始用的是if j[0] not in C[i[0]].keys()是不对的;感谢评论区同学的指正。大家下载代码后要改过来。
                    C[i[0]][j[0]]=0
                C[i[0]][j[0]]+=1      #C[i[0]][j[0]]表示电影两两之间的相似度,eg:同时评论过电影1和电影2的用户数
    for i,related_item in C.items():
        for j,cij in related_item.items():
            W[i][j]=cij/math.sqrt(N[i]*N[j]) 
    return W

在得到物品之间的相似度后,itemCF算法通过如下公式计算用户u对一个物品j的兴趣:


这里N(u)是用户喜欢的物品的集合,S(j,K)是和物品j最相似的K个物品的集合,w是物品j和i的相似度,r是用户u对物品i的兴趣。该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。(这是《推荐系统实践》的公式)

按我对其代码的理解,公式写成下面形式可能更好理解:


S(i,K)是和物品i最相似的K个物品的集合,对于不同的i,物品j都必须满足与i的相似度在前K个,否则跳过该物品i。最后得到的是物品j在用户喜欢的物品中的加权和,再进行排序即可向用户推荐其最感兴趣的物品。(这里解释得有点乱,具体可以看我的代码,当然也有可能是我理解错误,望指正)

该公式的详细代码如下所示:

 

#结合用户喜好对物品排序
def recommondation(user_id,user_dict,K):
    rank=defaultdict(int)
    l=list()
    W=itemCF(user_dict)
    for i,score in user_dict[user_id]: #i为特定用户的电影id,score为其相应评分
        for j,wj in sorted(W[i].items(),key=itemgetter(1),reverse=True)[0:K]: #sorted()的返回值为list
            if j in user_dict[user_id]:
                continue
            rank[j]+=score*wj #先找出用户评论过的电影集合,对每一部电影id,假设其中一部电影id1,找出与该电影最相似的K部电影,计算出在id1下用户对每部电影的兴趣度,接着迭代整个用户评论过的电影集合,求加权和,再排序,可推荐出前n部电影,我这里取10部。
    l=sorted(rank.items(),key=itemgetter(1),reverse=True)[0:10]
    return l

结果如下:

 

第一列为用户Id,每个用户评论过多部电影,所以这里展示的不是具体的电影名称,而是具体的某一用户,第二列为我们为该用户推荐的十部电影。

干货:附上基于物品的协同过滤算法数据集及代码,开发环境是Python2.7,代码包含详细解释,有兴趣的童鞋可以了解一下,有问题可以和我交流。

参考:

《推荐系统实践》作者: 项亮


  

  • 2
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值