基于Spark实现推荐算法-2:基于用户的协同过滤(理论篇)
基于用户的协同过滤
基于用户的协同过滤,即User-Based CF (User-Based Collaborative Filtering),是基于一个这样的假设“跟你爱好相同的人喜欢的物品,你很可能也喜欢”,所以User-Based CF主要的任务就是找出用户的最近邻居,从而根据最近邻居的喜好做出未知项的评分预测。
User-Based CF算法可以分为4个步骤:数据表示、最近邻查询、评分预测、推荐结果产生。
1.数据表示
User-Based CF使用的用户—项目数据可以表示为二维矩阵。以用户对项目的评分数据为例,评分数据可以用如下方法表示,
- 用户评分数据表
Item/User | User 1 | … | User k | … | User n |
---|---|---|---|---|---|
Item 1 | R1,1 | ||||
… | |||||
Item j | Rj,k | ||||
… | |||||
Item m | Rm,n |
其中每一行代表物品所获得的评分。以Item j为例,Rj,k代表用户k给物品j的评分,但并不是所有用户都会对Item j进行评分,所以Rj,k可能存在也可能不存在。这里设用户数为n,物品数目为m,可以将数据转换为评分值组成的二维矩阵R,则R是维度为(m×n)的评分矩阵。
2.最近邻查询
所谓“最近邻居”是指与当前用户最相似的其他若干用户,为了防止单个用户评分对推荐结果影响过大,导致偏差,通常取N(N为大于1的整数)个相似用户的数据。没有度量就没有比较,所以需要某种方法度量用户间的相似程度,这里相似程度简称为相似度。
相似度的计算方法较多,以余弦相似度计算为例说明。余弦相似度(Cosine-based Similarity)是用两个向量间夹角的余弦值来衡量相似性。若要计算用户间的相似度,也就是要计算上一步中矩阵R的列向量间的相似度,取User X和User Y的向量分别为如下公式所示,
$$
x ⃗=(R_{1,x},…,R_{m,x} )
$$
$$
y ⃗=(R_{1,y},…,R_{m,y} )
$$
那么User X与User Y间的余弦相似度为,
$$
sim(X,Y)=cos(x ⃗,y ⃗ )=\frac{x ⃗∙y ⃗}{‖x ⃗ ‖*‖y ⃗ ‖}
$$
其中$x ⃗∙y ⃗$表示向量间的内积,$‖x ⃗ ‖$是向量 x ⃗$的模,sim(X,Y)就是相似度的值。依次计算当前用户与其他所有用户的相似度,选取相似度最大的前K个用户作为该用户的最近邻居集合。
3.评分预测
评分预测的方法也有多种,常用的是加权求和的方法计算预测值。将用户u的最近邻居用户对物品i的打分进行加权求和,权值为各个最近邻居用户与用户u的相似度,然后对加权求和的结果求平均,计算得到用户u对物品i的预测打分,公式如下:
$$
P_{u,i}=\frac{\sum_{n∈N}S_{u,n}*R_{n,i}}
{\sum_{n∈N}(|S_{u,n}|)}
$$
N代表用户u的最近邻居用户集合,n是属于N中的一个用户, $S_{u,n}$ 表示用户u和用户n的相似度,$R_{n,i}$ 表示用户n对物品i的评分。根据该公式逐个计算出用户u未评分的所有物品的预测评分,得到预测评分集合。
4.推荐结果产生
从上一步得到的预测评分集合中,选出评分最高的若干个物品作为推荐物品集,也就是最终的推荐结果。