2.2 基于物品的协同过滤算法
基于物品的协同过滤(item-based collaborative filtering) 算法是目前业界应用最多的算法。
2.2.1 基础算法
基于用户的协同过滤算法,主要存在以下两个缺点:
(1) 随着网站的用户数目越来越大,计算用户兴趣相似度矩阵将越来越困难,其运算时间复杂度和空
间复杂度的增长和用户数的增长近似于平方关系。
(2) 基于用户的协同过滤很难对推荐结果作出解释。
由此,提出了基于物品的协同过滤算法(简称ItemCF) ,即,给用户推荐那些和他们之前喜欢的物品相似的物品。
ItemCF算法并不利用物品的内容属性计算物品之间的相似度,它主要通过分析用户的行为记录计算物品之间的相似度。
该算法认为:物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都也喜欢物品B。
主要包括两个步骤:
(1) 计算物品之间的相似度。
(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。
物品的相似度
定义物品的相似度,有简单公式:
W i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ W_{ij}=\frac {|N(i) \cap N(j)|}{|N(i)|} Wij=∣N(i)∣∣N(i)∩N(j)∣
其中,分母
∣
N
(
i
)
∣
|N(i)|
∣N(i)∣是喜欢物品
i
i
i的用户数,而分子
∣
N
(
i
)
∩
N
(
j
)
∣
|N(i) \cap N(j)|
∣N(i)∩N(j)∣是同时喜欢物品
i
i
i和物品
j
j
j的用户
数。
因此,上述公式可以理解为喜欢物品
i
i
i的用户中有多少比例的用户也喜欢物品
j
j
j。
该公式的局限性:
若物品
j
j
j很热门,那么
W
i
j
W_{ij}
Wij会接近1,从而造成任何物品都会和热门的物品有很大的相似度,显然
不利于挖掘长尾信息。
为了避免推荐出热门的物品,有改进公式如下:
W i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ W_{ij}=\frac {|N(i) \cap N(j)|}{\sqrt{|N(i)| |N(j)|}} Wij=∣N(i)∣∣N(j)∣∣N(i)∩N(j)∣
该公式惩罚了物品j的权重,因此减轻了热门物品会和很多物品相似的可能性。
ItemCF算法
- 思想
与UserCF算法类似, 用ItemCF算法计算物品相似度时也可以首先建立用户-物品倒排表(即,对每个用户建立一个包含他喜欢的物品的列表);
然后对于每个用户,将他物品列表中的物品两两在共现矩阵
C
C
C中加1。
- 步骤及示例
(1) 计算物品之间的相似度,得到矩阵 W W W。
如下图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/eb67786317e94acc423c26149e7d7f53.png)
图中最左边是输入的用户行为记录,每一行代表一个用户感兴趣的物品集合。
然后,对于每个物品集合,将里面的物品两两加一,得到一个矩阵。
之后,将这些矩阵相加得到上面的
C
C
C矩阵(图中最右边;其中,
C
[
i
]
[
j
]
C[i][j]
C[i][j]记录了同时喜欢物品
i
i
i和物品
j
j
j的用户数)。
最后,将
C
C
C矩阵归一化可以得到物品之间的余弦相似度矩阵
W
W
W。
(2) 计算用户 u u u对一个物品 j j j的兴趣,公式如下:
p u j = ∑ i ∈ N ( u ) ∩ S ( j , K ) w j i r u i p_{uj}=\sum_{i \in N(u) \cap S(j, K) }w_{ji}r_{ui} puj=i∈N(u)∩S(j,K)∑wjirui
其中, N ( u ) N(u) N(u)是用户喜欢的物品的集合, S ( j , K ) S(j, K) S(j,K)是和物品 i i i最相似的 K K K个物品的集合, w j i w_{ji} wji是物品 j j j和 i i i的相似度, r u i r_{ui} rui是用户 u u u对物品 i i i的兴趣(对于隐反馈数据集,如果用户 u u u对物品 i i i有过行为,即可令 r u i = 1 r_{ui}=1 rui=1)。
该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。
具体计算示例:
![](https://i-blog.csdnimg.cn/blog_migrate/8abb85b1ae883dded6170cfacdaa4e9a.png)
其中,1.3为用户对该书的兴趣度,0.7为两书之间的相似度,0.91为最终计算的用户对该书的兴趣度结果。
ItemCF的一个优势就是可以提供推荐解释,即,利用用户历史上喜欢的物品为现在的推荐结果进行解释。
- 参数
类似地,参数 K K K是ItemCF的一个重要参数,它的调整对推荐算法的各种指标都会产生一定的影响。
(1) 精确率和召回率
类似地,推荐系统的精度指标(精确率和召回率)并不和参数
K
K
K成线性关系,需要选择合适的K以获得高精度。
(2) 流行度
与UserCF不同,参数
K
K
K对ItemCF推荐结果流行度的影响也不是完全正相关的。
随着
K
K
K的增加,结果流行度会逐渐提高,但当
K
K
K增加到一定程度,流行度就不会再有明显变化。
(3) 覆盖率
K
K
K越大则ItemCF推荐结果的覆盖率越低。
2.2.2 用户活跃度对物品相似度的影响
思想:活跃用户对物品相似度的贡献应该小于不活跃的用户。
JohnS.Breese在论文中提出了IUF(Inverse User Frequence)的概念,即,用户活跃度对数的倒数的参数。基于上述思想,他提出应该增加IUF参数来修正物品相似度的计算公式:
W i j = ∑ u ∈ N ( i ) ∩ N ( j ) 1 l o g 1 + ∣ N ( u ) ∣ ∣ N ( i ) ∣ ∣ N ( j ) ∣ W_{ij}=\frac {\sum_{u \in \,N(i) \cap N(j)} \frac {1}{log1+|N(u)|}}{\sqrt{|N(i)| |N(j)|}} Wij=∣N(i)∣∣N(j)∣∑u∈N(i)∩N(j)log1+∣N(u)∣1
注意:
上述公式仅做了一种软性惩罚。对于很多活跃的用户,为了避免相似度矩阵过于稠密,在实际计算中一般直接忽略他的兴趣列表,而不将其纳入到相似度计算的数据集中。
2.2.3 物品相似度的归一化
思想:将ItemCF的相似度矩阵按最大值归一化,可以提高推荐的准确率。
若已经得到了物品相似度矩阵 w w w,可以用如下公式得到归一化之后的相似度:
w i j = w i j m a x j w i j w_{ij}=\frac {w_{ij}}{\mathop{max}\limits_{j} \,w_{ij}} wij=jmaxwijwij
优点:归一化的好处不仅在于增加推荐的准确度,还可以提高推荐的覆盖率和多样性。
举例说明,一般来说,物品总是属于很多不同的类,每一类中的物品联系比较紧密。
假设物品分为两类——A和B,A类物品之间的相似度为0.5,B类物品之间的相似度为0.6,而A类物品和B类物品之间的相似度是0.2。
此时,若一个用户喜欢了5个A类物品和5个B类物品,用ItemCF给他进行推荐,推荐的就都是B类物品,因为B类物品之间的相似度大;
但若归一化之后,A类物品之间的相似度变成了1,B类物品之间的相似度也是1,那么此时,他的推荐列表中A类物品和B类物品的数目也应该是大致相等的。
由此,相似度的归一化可以提高推荐的多样性。
一般来说,热门的类其类内物品相似度一般比较大。
如果不进行归一化,就会推荐比较热门的类里面的物品,而这些物品也是比较热门的。因此,推荐的覆盖率就比较低。
相反,如果进行相似度的归一化,则可以提高推荐系统的覆盖率。
参考
《推荐系统实践》—— 2.4.2 基于物品的协同过滤算法