一、概述:
基于近邻的推荐算法在推荐系统中占有重要的地位,是学术界的一个重点研究方向,在产业界也得到了广泛的应用。基于近邻的推荐算法大致可以分为user-based和item-based两类,关于近邻推荐算法的基础性介绍,请参见博文: “推荐系统笔记一、基于近邻的推荐系统(基础篇)”。由于user-based方法和item-based方法的相似性,本文主要讨论item-based方法上的一些技术,这些技术可以被直接套用到user-based方法上。本文主要介绍五种近邻模型。
二、符号定义:
- U:用户集合;I:item集合;
- R:评分集合, rui 表示用户 u∈U 对item i∈I 的评分;
- Ui :已经给item i打分的用户集合; Iu :已经被用户u打分的item集合;
- Iuv : Iu∩Iv ,同时被用户u和用户v打过分的item集合; Uij :同时对item i和j打过分的用户集合;
- wuv :用户u和v之间的相似度; wij :item i和j之间的相似度;
三、相似权值计算:
两个用户或者item间的近邻关系是由他们之间的相似度来判断的,与一个用户(或item)相似度最大的k个用户(或item)称为他的k近邻。
cosine相似度是其中一种常用的度量方法:
cos(i,j)=∑u∈Uijruiruj∑u∈Uir2ui∑v∈Ujr2vj−−−−−−−−−−−−−−−−√
即
Ui 和
Uj 的相似度。在前面符号定义小节已经提到过
Uij 表示同时对item i和item j打过分的用户集合。
如果考虑均值和方差,则得到Pearson相关系数:
PearsonCorrelation(i,j)=∑u∈Uij(rui−r¯i)(ruj−r¯j)∑v∈Uij(rvi−r¯i)2∑k∈Uij(rkj−r¯j)2−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
Pearson Correlation是 在集合
Uij 上计算的,其他的评分都忽略,所以在分母上和cosine有一个小小的区别。另外,由于Pearson Correlation 的分子分母都要除以标准差项,所以可以分子分母同时约去。
相似权值改进:
在实际中,不同用户或者item的评分往往是带偏差的,例如A和B两个用户的偏好类似,但是A比较容易满足,倾向于给item打高分;而B倾向于给item打低分(Item 上也有类似的情况)。为了解决这个问题,需要为每个用户和item增加一个偏置项。在前面的式子中,用均值 r¯i 作为这个偏置项,也可以用学习的方法得到一个较好的偏置项:
minb∗∑(u,i)∈K(rui−μ−bu−bi)2+λ(∑ub2u+∑ib2i)
其中
μ 是整体评分偏置,
bu 和
bi 是用户u和item i上额外的偏置。那么评分
rui 的偏置就等于:
bui=μ+bu+bi
把这个偏置代入Pearson Correlation,得到:
PearsonCorrelation(i,j)=∑u∈Uij(rui−bui)(ruj−buj)∑v∈Uij(rvi−bvi)2∑k∈Uij(rkj−bkj)2−−−−−−−−−−−−−−−−−−−−−−−−−−−−−√
当使用Pearson Correlation方法时,如果item i和j只被一个用户同时评分过,并且恰好在这两个item上的评分相同,那么根据Pearson公式他们之间的相似度等于1,这显然不大合理。可以用以下方法对权值进行收缩:
sij=|Uij|−1|Uij|−1+β⋅PearsonCorrelation(i,j)
β 的值可以通过交叉验证选择(例如
β=100 )。
四、相似度插值:
Similarity-Based Interpolation:定义 Sk(i;u) 为用户u评分的item集合中和item i最相似的k个近邻。由用户对item的历史评分来预测评分:
r^ui=bui+∑j∈Sk(i;u)sij(ruj−buj)∑j∈Sk(i;u)sij
这可以看做一个插值函数,
sij 是插值系数。这种方法主要有一下两个优点:
- 可解释性。通过用户对item的历史评分(喜好)推荐新的item。
- 实时性。一旦用户给出新的评分,item-based模型可以立即提供新的推荐,而不需要重新训练模型或计算参数(通常认为item间的相似度在短时间内是恒定的,只需每隔较长一段时间重新计算)。
五、联合派生插值权重:
Jointly Derived Interpolation Weights:相似度插值方法直接使用item间的相似度作为插值权重(系数),忽略了近邻间的相互关系,为了更好的预测评分,需要重新学习插值权重 {θuij|j∈Sk(i;u)} 。
r^ui=bui+∑j∈Sk(i;u)θuij(ruj−buj)
插值权重通过求解一个最小二乘问题得到:
minθu∑v≠u{(rvi−bvi)−∑j∈Sk(i;u)θuij(rvj−bvj)}2
如果写成 Aw=b 的形式,则:
Ajl=∑v≠u(rvj−bvj)(rvl−bvl)bj=∑v≠u(rvj−bvj)(rvi−bvi)
由于评分矩阵是稀疏的,很少有用户v对
Sk(i;u) 都进行了评分。可以同时用正则化和平滑的方式进行处理(结果会向avg收缩):
A^jl=Ajl+β⋅avg|Ujl|+βb^j=bj+β⋅avg|Uij|+β
六、全局近邻模型:
前面介绍的近邻模型都是局部的(k近邻),全局近邻模型吸取了矩阵分解模型的优点,从而可以得到更优的结果。这种模型可以使用隐式反馈,并且具有较好的实时性。重新定义预测函数:
r^ui=μ+bu+bi+|Rk(i;u)|−12∑j∈Rk(i;u){wij(ruj−buj)+cij}
R(u) 是用户u的所有评分, cij 是用户u的隐式反馈,如租借、购买等。 Rk(i;u) 是item项的集合,这些item需要同时满足两个条件:一是用户u评过分;二是item i的k近邻。所以 Rk(i;u) 中item的个数通常是小于k的。需要学习的参数有: bu,bi,wij,cij ,同过梯度下降最优化下面这个目标函数来学习参数:
minb∗,w∗,c∗=∑(u,i){rui−μ−bu−bi−|Rk(i;u)|−12∑j∈Rk(i;u)(wij(ruj−buj)+cij)}2+λ{b2u+b2i+∑j∈Rk(i;u)(w2ij+c2ij)}2
七、因子分解近邻模型:
可以对全局近邻模进行因子分解以减少时间和空间复杂度,提高准确率:
r^ui=μ+bu+bi+|Rk(i;u)|−12∑j∈Rk(i;u){wij(ruj−buj)+cij}=μ+bu+bi+|Rk(i;u)|−12∑j∈Rk(i;u){q⊤ixj(ruj−buj)+q⊤iyj}=μ+bu+bi+q⊤i|Rk(i;u)|−12∑j∈Rk(i;u){xj(ruj−buj)+yj}
可以发现最后的表示和SVD++很相似。
八、近邻模型添加时间信息:
用户的偏好是随着时间不断发生变化的,\emph{如一个人喜欢的电影在2年前和2年后很可能是不同的}。在全局近邻模型中可以很容易加入时间信息:
r^ui=μ+bu(tui)+bi(tui)+|Rk(i;u)|−12∑j∈Rk(i;u)e−βu|tui−tuj|{wij(ruj−buj)+cij}
bu(tui),bi(tui) 是
bu,bi 的时间函数,详见博文” 矩阵分解协同过滤“。
e−βu|tui−tuj| 是指数衰退函数,如果用户u对item j的评分是在很久之前,那么item j的评分对现在的影响不大,用指数函数缩小其权重。其他项和原始的全局近邻模型一样,保持不变。
九、参考资料
Recommender Systems Handbook