基于物品的协同过滤推荐算法_《推荐系统实践》3.基于物品的协同过滤算法

基于物品的协同过滤算法不依赖物品内容,通过用户行为记录计算物品相似度。算法包括计算物品相似度和生成推荐列表。相似度公式考虑物品共现和热门物品惩罚。推荐列表通过用户历史行为和物品相似度生成。此外,文中还讨论了用户活跃度影响、相似度归一化等改进策略。
摘要由CSDN通过智能技术生成

ad4875f2101e85ee0d5a8194a08226d3.png

基于物品的协同过滤算法(item-based collaborative filtering,以下简称ItemCF)算法思想:给用户推荐那些和他们之前喜欢的物品相似的物品。

不过,ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。该算法认为,物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。

基于物品的协同过滤算法可以利用用户的历史行为给推荐结果提供推荐解释,比如给用户推荐《天龙八部》的解释可以是因为用户之前喜欢《射雕英雄传》。

ItemCF算法主要分为两步。 (1) 计算物品之间的相似度。 (2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。

计算物品相似度

可以用下面的公式定义物品的相似度:

equation?tex=w_%7Bij%7D+%3D+%5Cfrac+%7B%7CN%28i%29+%5Ccap+N%28j%29%7C%7D+%7B%7CN%28i%29%7C%7D

这里,分母|N(i)|是喜欢物品i的用户数,而分子

equation?tex=%7CN%28i%29+%5Ccap+N%28j%29%7C 是同时喜欢物品i和物品j的用户数。因此,上述公式可以理解为
喜欢物品i的用户中有多少比例的用户也喜欢物品j

如果物品j很热门,很多人都喜欢, 那么

equation?tex=w_%7Bij%7D 就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度。为了避免推荐出热门的物品,可以用下面的公式:

equation?tex=w_%7Bij%7D+%3D+%5Cfrac%7B%7CN%28i%29+%5Ccap+N%28j%29%7C%7D%7B%5Csqrt%7B%7CN%28i%29%7C%7CN%28j%29%7C%7D%7D

这个公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。

计算物品相似度时可以首先建立用户—物品倒排表(即对每个用户建立一个包含他喜欢的物品的列表),然后对于每个用户,将他物品列表中的物品两两在共现矩阵C中加1。

import math
from collections import defaultdict
​
def item_similarity(self, trainset):
    # 物品相似度矩阵
    item_similarity_matrix = {}
    # 物品流行度
    item_popularity = {}
​
    for user, items in trainset.items():
        for item1 in items:
            # 构造物品相似度矩阵,计算物品共现次数
            item_similarity_matrix.setdefault(item1, defaultdict(int))
            for item2 in items:
                if item1 == item2:
                    continue
                    item_similarity_matrix[item1][item2] += 1
​
                    # 统计喜欢item1的用户数
                    if item1 not in item_popularity:
                        item_popularity[item1] = 0
                        item_popularity[item1] += 1
​
                        # 计算最终的相似度矩阵
                        for item1, releated_items in item_similarity_matrix.items():
                            for item2, count in releated_items.items():
                                self.item_similarity_matrix[item1][item2] = count / 
                                math.sqrt(item_popularity[item1] * item_popularity[item2])
return item_similarity_matrix

产生推荐列表

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

equation?tex=Interestingness_%7Buj%7D+%3D+%5Csum_%7Bi+%5Cin+N%28u%29+%5Ccap+S%28j%2CK%29%7D+w_%7Bji%7Dr_%7Bui%7D

这里N(u)是用户喜欢的物品的集合,S(j,K)是和物品j最相似的K个物品的集合,

equation?tex=w_%7Bji%7D 是物品j和i的相似度,
equation?tex=r_%7Bui%7D 是用户u对物品i的兴趣(对于隐反馈数据集,如果用户u对物品i有过行为,即可令
equation?tex=r_%7Bui%7D%3D1 。)该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。

关于物品相似度的一些改进

  • 用户活跃度对物品相似度的影响

John S. Breese在论文“Empirical Analysis of Predictive Algorithms for Collaborative Filtering ”中提出了一个称为IUF(Inverse User Frequence),即用户活跃度对数的倒数的参数,他认为活跃用户对物品相似度的贡献应该小于不活跃的用户,他提出应该增加IUF参数来修正物品相似度的计算公式:

equation?tex=w_%7Bij%7D+%3D+%5Cfrac%7B%5Csum_%7Bu+%5Cin+N%28i%29+%5Ccap+N%28j%29%7D+%5Cfrac%7B1%7D%7B%5Clog%7B%281%2B%7CN%28u%29%7C%29%7D%7D%7D%7B%5Csqrt%7B%7CN%28i%29%7C%7CN%28j%29%7C%7D%7D

当然,上面的公式只是对活跃用户做了一种软性的惩罚,但对于很多过于活跃的用户,为了避免相似度矩阵过于稠密,我们在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。

  • 物品相似度归一化

研究发现,如果将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。如果已经得到了物品相似度矩阵w,那么可以用如下公式得到归一化之后的相似度矩阵w':

equation?tex=w_%7Bij%7D%5E%7B%27%7D+%3D+%5Cfrac%7Bw_%7Bij%7D%7D%7B%5Cmax_j+%7Bw_%7Bij%7D%7D%7D

归一化的好处不仅仅在于增加推荐的准确度,它还可以提高推荐的覆盖率和多样性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值