推荐系统——协同过滤

在这里插入图片描述

协同过滤

协同过滤算法一般是通过用户之前的喜好或者相似的用户的喜好来推荐商品

基于领域的协同过滤算法一般有两种算法:

  • 基于用户的协同过滤算法(UserCF):基于与用户相似用户的喜好进行推荐
  • 基于物品的协同过滤算法(ItemCF):基于用户喜好的物品寻找相似的物品进行推荐

对于以上两种算法而言,我们要进行相似性的对比,首先需要进行相似度的计算,为相似度的计算可以使用以下方法。

相似性度量方法

相似度度量可以使用很多指标,其本质还是计算不同事物之间的距离,那么距离越大,相似性越小,距离越小,相似性越大,那么,除了学习资料中提到的3个系数之外,我觉得也可以使用欧式距离,曼哈顿距离,切比雪夫距离等等。但在这里我就只说明学习资料中几个系数。其他指标可以参考https://www.cnblogs.com/duanchw-37/archive/2012/08/24/2654019.html

  1. 杰卡德相似系数,给出定义

s i m u v = ∣ N ( u ) ∩ N ( v ) ∣ ∣ N ( u ) ∣ ∪ ∣ N ( v ) ∣ sim_{uv} = \frac{|N(u) \cap N(v)|}{|N(u)| \cup |N(v)|} simuv=N(u)N(v)N(u)N(v)

其中,N(u)代表喜欢物品u的用户的集合

  1. 余弦相似度

余弦相似度可以抽象的想象以下,两个向量在坐标系中的余弦夹角越小,那么它们的角度的余弦值就越接近于1,所以可以给出定义:

s i m u v = ∣ N ( u ) ∣ ∩ ∣ N ( v ) ∣ ∣ N ( u ) ⋅ ∣ N ( v ) ∣ sim_{uv} = \frac{|N(u)| \cap |N(v)|}{\sqrt{|N(u) \cdot |N(v)|}} simuv=N(u)N(v) N(u)N(v)

与杰卡德系数相比,余弦相似度的改变在于将分母中的“并”改变为“乘”

python中提供了计算余弦相似度的函数

from sklearn.metrics.pairwise import cosine_similarity

i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]

cosine_similarity([a,b])
  1. 皮尔逊相关系数

皮尔逊相关系数在统计学中经常被提到,在这里也很好理解,用来解释两个事物之间的相关性,所以可以作为相似性度量的一个指标。对于相关系数的理解,我们利用概率论与数理统计中的协方差进行理解,下面给出定义:

s i m ( u , v ) = ∑ i ∈ I ( r u i − r ‾ u ) ( r v i − r ‾ v ) ∑ i ∈ I ( r u i − r ‾ u ) 2 ∑ i ∈ I ( r v i − r ‾ v ) 2 sim(u,v) = \frac{\sum_{i\in I}(r_{ui}-\overline{r}_u)(r_{vi}-\overline{r}_v)}{\sqrt{\sum_{i\in I}(r_{ui}-\overline{r}_u)^2}\sqrt{\sum_{i\in I}(r_{vi}-\overline{r}_v)^2}} sim(u,v)=iI(ruiru)2 iI(rvirv)2 iI(ruiru)(rvirv)

其中, r ‾ u \overline{r}_u ru表示为用户打的所有分数的期望/物品被打的所有分的期望。

其中,皮尔逊相关系数可以结合余弦相似度的计算方法

计 算 r ‾ u 与 r ‾ v → 将 余 弦 相 似 度 的 计 算 公 式 中 的 分 子 改 成 减 去 r ‾ u 和 r ‾ v 计算\overline{r}_u与\overline{r}_v \rightarrow 将余弦相似度的计算公式中的分子改成减去\overline{r}_u和\overline{r}_v rurvrurv

python中也给出了计算皮尔逊相关系数的函数

from scipy.stats import pearsonr

i = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
pearsonr(i, j)

当然,我们也可以直接使用numpy库中的coefcorr函数进行计算

import numpy as np

i = [1, 0, 0, 0]
j = [1, 0.5, 0.5 , 0]
np.coefcorr(i, j)

给出一个三个相似性度量系数的比较

杰卡德系数余弦相似度皮尔逊相关系数
利用两个集合之间的交集来显示集合之间的相互覆盖率来体现集合间的相似度利用特征向量之间的夹角来体现两个集合之间的相似度在余弦相似度的基础上利用了期望的信息进行修正,减小了用户评分偏置的影响。

基于用户的协同过滤——UserCF

UserCF的主要思想是对于一个用户,找到与其相似的用户,将该用户喜好的物品推荐给该用户

所以首要目的即找到一个与当前用户相似的用户集合。

给出一个例子进行解释:

物品1物品2物品3物品4物品5
Alice5344?
用户131233
用户243435
用户333154
用户415521

对于这个例子来说,因为在这里物品5对于Alice而言是缺失的,那么每个用户的特征向量其实就只有4个维度,那么我们下面我们分别用余弦相似度和皮尔逊相似度去计算一下用户之间的相似度。

  1. 利用余弦相似度计算
    在这里插入图片描述

  2. 利用皮尔逊相关系数计算

在这里插入图片描述

计算出用户之间的相似度之后,此时我们需要补全二维表格中空缺的那个值,一般可以我们可以取与Alice相似的N个用户的评分的平均值,但是这样子无法保证用户的标准相同,所以在这里我们不采用该种方法,于是我们将用户打分的均值利用进来,有如下公式
R i , j = R i ‾ + ∑ k = 1 n ( S i , k ( R k , j − R ‾ k ) ) ∑ k = 1 n S j , k R_{i,j} = \overline{R_i} + \frac{\sum_{k=1}^n(S_{i,k}(R_{k,j}-\overline{R}_k))}{\sum_{k=1}^n S_{j,k}} Ri,j=Ri+k=1nSj,kk=1n(Si,k(Rk,jRk))
其中, R i , j R_{i,j} Ri,j为用户i对物品j的打分, R ‾ i \overline{R}_i Ri是用户i对所有物品打分的平均值, S i , k S_{i,k} Si,k为用户i与k的相似度(在这里,我们利用用户之间的相似度进行加权求和)。
假设我们取前2个最相似用户,那么如果采用余弦相似度(皮尔逊相关系数也是相同步骤)去计算用户相似度,那么有用户1和用户2与Alice最相似,于是,我们利用他们两个的评分去计算缺失得分。
利用上面的公式,我们可以计算出其得分为4.87
利用计算出的得分,我们可以对多个物品进行排序,其中有

物品1物品2物品3物品4物品5
Alice53444.87

于是推荐顺序为1>5>3=4>2

下面谈谈UserCF的缺点

  1. 对于UserCF而言,要求用户之间相似,但是(比如说利用用户打分的特征向量)不同用户之间的购买物品的重复率可能较低,导致无法找到较相似的用户或者足够数量的用户,所以对于正反馈获取困难的场景,UserCF并不适用
  2. 维护相似度矩阵的开销较大,不适合大用户数据量

基于物品的协同过滤——ItemCF

基于物品的协同过滤,ItemCF,利用用户过去的数据去为用户推荐物品,即利用物品之间的相似性去进行推荐而不是利用用户之间的相似性去推荐商品。算法认为:物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都喜欢物品B(对于物品的打分而言)
还是用UserCF的例子来解释

物品1物品2物品3物品4物品5
Alice5344?
用户131233
用户243435
用户333154
用户415521

在这里,如何评判物品之间的相似度呢,我们以每个用户为该物品打的分为特征。如物品1的特征向量为 ( 3 , 4 , 3 , 1 ) (3, 4, 3, 1) (3,4,3,1)因为Alice对物品5的打分缺失,所以在这里Alice的打分在计算相似度时并不用计算入。
那么在这里,我们还是利用余弦相似度进行物品相似度的计算
在这里插入图片描述

在这里,我们要计算物品5与其他物品的相似度,所以,观察结果,可以发现物品5与其他几个物品的相似度分别为 0.994 , 0.739 , 0.723 , 0.940 0.994, 0.739, 0.723, 0.940 0.994,0.739,0.723,0.940,所以选择相似度较高的前两个物品,即物品1和4。
同样的,我们利用
R i , j = R i ‾ + ∑ k = 1 n ( S i , k ( R k , j − R ‾ k ) ) ∑ k = 1 n S j , k R_{i,j} = \overline{R_i} + \frac{\sum_{k=1}^n(S_{i,k}(R_{k,j}-\overline{R}_k))}{\sum_{k=1}^n S_{j,k}} Ri,j=Ri+k=1nSj,kk=1n(Si,k(Rk,jRk))
去计算缺失数据,此时, S i , j S_{i,j} Si,j的值代表物品i与j的相似度,则最终我们可以计算出来得分为4.6
那么,将得分排序

物品1物品2物品3物品4物品5
Alice53444.6

则选取两个物品进行推荐,我们选择物品1和物品5

协同过滤算法的改进

对于协同过滤算法,我们可以对其的相关度的计算方法进行改进
在这里插入图片描述

对于一号计算相关度的公式,如果物品i很受欢迎,那很多喜欢物品j的人也喜欢物品i,那么 w i j w_{ij} wij就会变得很大,那么对于物品i而言,很多物品和物品i的相关度都会很大,即存在不合理性,所以我们可以引入 N ( j ) N(j) N(j)来惩罚物品i的热度,如二号所示,但是如果物品i十分受欢迎,导致所有人都会买i,那么 w i j w_{ij} wij还是会很大,俗称Harry Potter Problem,所以在这里我们控制 N ( j ) N(j) N(j) N ( i ) N(i) N(i)的权重,来定制不同的惩罚程度,如三号所示。
此外,对于ItemCF而言,我们需要对用户活跃度进行惩罚(存在刷单现象,仅针对ItemCF),所以出现四号的计算方法。

解释一下第四个式子, N ( u ) N(u) N(u)在这里代表用户 u u u的活跃程度,那么对于既喜欢物品 i i i又喜欢物品 j j j的用户而言,如果用户 u u u的活跃度越高,那么这个用户的评价的权重就越低。

协同过滤算法的分析

协同过滤算法存在泛化能力弱的问题,导致协同过滤算法无法将相似物品的相似信息推广到其他物品上(这么解释,就是两个物品,我们知道他们很相似,但是为什么相似我们是不知道的,所以无法利用这两个物品之间的相似程度去为其他物品之间是否相似提供信息,我们只能单纯地知道它们相似),从而导致热门物体具有较强的头部效应,导致它和其他很多物品相似;而尾部物品由于特征向量稀疏,导致不经常被推荐。不过话虽然这么说,但是不是有个指标叫新颖程度吗,那尾部物品的新颖程度应该比较高吧,那这样它作为指标的话,尾部物品还是很大程度可以占用一定比例的
个人觉得还是因为协同过滤算法并没有用上语义的信息,只能单纯的依赖其他信息。

参考资料

https://www.cnblogs.com/duanchw-37/archive/2012/08/24/2654019.html

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值