协同过滤是在推荐系统召回阶段常用的算法。只用到了用户的行为信息,而没有考虑到用户和推荐内容的具体信息。
协同过滤相关的计算是围绕user-item矩阵展开的,矩阵中的每个元素代表用户对该物品的评分或是否有点击这个行为。
基于用户的协同过滤
基于用户的协同过滤本质上是找到和待推荐用户相似的用户,根据相似用户对某物品的评分来确定待推荐的用户对该物品的评分。
一般评价用户之间相似度采用person相关系数的方法。具体公
s i m ( a , b ) = ∑ p ∈ P ( r a , p − r ‾ a ) ( r b , p − r ‾ b ) ∑ p ∈ P ( r a , p − r ‾ a ) 2 ∑ p ∈ P ( r b , p − r ‾ b ) 2 sim(a,b)=\frac{\sum_{p\in P} (r_{a,p}-\overline{r}_{a})(r_{b,p}-\overline{r}_{b})}{\sqrt{\sum_{p\in P} (r_{a,p}-\overline{r}_{a})^{2}}\sqrt{\sum_{p\in P} (r_{b,p}-\overline{r}_{b})^{2}}} sim(a,b)=∑p∈P(ra,p−ra)2∑p∈P(rb,p−rb)2∑p∈P(ra,p−ra)(rb,p−rb)
一般来说,不会用到所有的用户的评分信息,而主要是用到最近邻的K个用户的评分信息。一方面是这样能简化计算,另一方面这样也能提高推荐精度。一般通过限定相似度的阈值或者限定K值来确定用到的相似用户的数量。
由于有些物品是大多数用户都喜欢的(热门物品),有些物品是被少数人喜欢的,这两类物品放映用户特性的程度不一样,被少数人喜欢的物品更能体现用户的特性。所以可以考虑类似文本检索中tfidf的方法,对物品加权处理。
一般采用正相关的用户来计算评分而不考虑负相关的用户。
由于不同用户评分习惯不同,有的用户倾向于给高分,有的用户倾向于给低分,所以采用用户对指定物品相对于平均的评分作为依据确定关注的用户对关注的物品的评分。即可以采用一下公式确定最终评分:
p r e d ( a , p ) = r a ‾ + ∑ b ∈ N s i m ( a , b ) ∗ ( r b , p − ( ‾ r b ) ) ∑ b ∈ N s i m ( a , b ) pred(a,p)=\overline{r_{a}}+\frac{\sum_{b\in N}sim(a,b)*(r_{b,p}-\overline(r_{b}))}{\sum_{b\in N}sim(a,b)} pred(a,p)=ra+∑b∈Nsim(a,b)∑b∈Nsim(a,b)∗(rb,p−(rb))
基于物品的协同过滤
基于物品的协同过滤本质上是找到用户评价过的和待评分物品相似的物品,根据用户对已评分过物品的评分和该物品与待评分物品间的相似度来确定。一般相似度的计算采用余弦相似度,计算公式如下:
s i m ( a → , b → ) = a → ⋅ b → ∣ a → ∣ ∗ ∣ b → ∣ sim(\overrightarrow{a},\overrightarrow{b})=\frac{\overrightarrow{a}\cdot \overrightarrow{b}}{\left | \overrightarrow{a} \right |*\left | \overrightarrow{b} \right |} sim(a,b)=∣∣∣a∣∣∣∗∣∣∣b∣∣∣a⋅b
同样考虑到不同用户评分行为的差异,计算时将每个用户对该物品的评分减去该用户的平均评分,修正的公式如下:
s i m ( a , b ) = ∑ u ∈ U ( r u , a − r u ‾ ) ( r u , b − r u ‾ ) ∑ u ∈ U ( r u , a − r u ‾ ) 2 ∑ u ∈ U ( r u , b − r u ‾ ) 2 sim(a,b)=\frac{\sum_{u\in U}(r_{u,a}-\overline{r_{u}})(r_{u,b}-\overline{r_{u}})}{\sqrt{\sum_{u\in U}(r_{u,a}-\overline{r_{u}})^{2}}\sqrt{\sum_{u\in U}(r_{u,b}-\overline{r_{u}})^{2}}} sim(a,b)=∑u∈U(ru,a−ru)2∑u∈U(ru,b−ru)2∑u∈U(ru,a−ru)(ru,b−ru)
和基于用户的方法一样,并不是所有的物品都会纳入考虑,只有部分相似的物品会用作计算。
最终预测评分的公式为:
p r e d ( u , p ) = ∑ i ∈ r a t e d I t e m s ( u ) s i m ( i , p ) ∗ r u , i ∑ i ∈ r a t e d I t e m s ( a ) s i m ( i , p ) pred(u,p)=\frac{\sum_{i\in ratedItems(u)} sim(i,p)*r_{u,i}}{\sum_{i\in ratedItems(a)} sim(i,p)} pred(u,p)=∑i∈ratedItems(a)sim(i,p)∑i∈ratedItems(u)sim(i,p)∗ru,i
在实际操作中,为了简化计算可以考虑将近邻物品数限制在一定范围,或者只将共同评分用户数大于某一值的物品纳入考虑。
由于一般用户数M大于物品数N,故采用基于物品的协同过滤计算量较小,计算速度更快。同时一般不同物品间有共同评分的用户数比不同用户间有共同评分的物品数要多,故采用基于物品的协同过滤受到小的额外评分的影响更小。
基于用户的推荐容易受到攻击,即攻击者可以通过特定群体的评分特点,伪造一批假的用户,这批假的用户拥有和特定用户相似的评分(即作为特定群体的相似用户),通过故意对某物品给高分或低分实现抬高或打压的目的。由于用户特点比较抽象,故无法从直观的角度发现这批作弊的客户(基于物品的推荐则不会出现这样的情况,基于物品的推荐对于作弊物品很容易从直观上发现异常)。