协同过滤
协同过滤算法一般是通过用户之前的喜好或者相似的用户的喜好来推荐商品
基于领域的协同过滤算法一般有两种算法:
- 基于用户的协同过滤算法(UserCF):基于与用户相似用户的喜好进行推荐
- 基于物品的协同过滤算法(ItemCF):基于用户喜好的物品寻找相似的物品进行推荐
对于以上两种算法而言,我们要进行相似性的对比,首先需要进行相似度的计算,为相似度的计算可以使用以下方法。
相似性度量方法
相似度度量可以使用很多指标,其本质还是计算不同事物之间的距离,那么距离越大,相似性越小,距离越小,相似性越大,那么,除了学习资料中提到的3个系数之外,我觉得也可以使用欧式距离,曼哈顿距离,切比雪夫距离等等。但在这里我就只说明学习资料中几个系数。其他指标可以参考https://www.cnblogs.com/duanchw-37/archive/2012/08/24/2654019.html
- 杰卡德相似系数,给出定义
simuv=∣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,所以可以给出定义:
simuv=∣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_similarityi = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]cosine_similarity([a,b])
- 皮尔逊相关系数
皮尔逊相关系数在统计学中经常被提到,在这里也很好理解,用来解释两个事物之间的相关性,所以可以作为相似性度量的一个指标。对于相关系数的理解,我们利用概率论与数理统计中的协方差进行理解,下面给出定义:
sim(u,v)=∑i∈I(rui−r‾u)(rvi−r‾v)∑i∈I(rui−r‾u)2∑i∈I(rvi−r‾v)2sim(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)=∑i∈I(rui−ru)2∑i∈I(rvi−rv)2∑i∈I(rui−ru)(rvi−rv)
其中,r‾u\overline{r}_uru表示为用户打的所有分数的期望/物品被打的所有分的期望。
其中,皮尔逊相关系数可以结合余弦相似度的计算方法
计算r‾u与r‾v→将余弦相似度的计算公式中的分子改成减去r‾u和r‾v计算\overline{r}_u与\overline{r}_v \rightarrow 将余弦相似度的计算公式中的分子改成减去\overline{r}_u和\overline{r}_v计算ru与rv→将余弦相似度的计算公式中的分子改成减去ru和rv
python中也给出了计算皮尔逊相关系数的函数
from scipy.stats import pearsonri = [1, 0, 0, 0]
j = [1, 0.5, 0.5, 0]
pearsonr(i, j)
当然,我们也可以直接使用numpy库中的coefcorr函数进行计算
import numpy as npi = [1, 0, 0, 0]
j = [1, 0.5, 0.5 , 0]
np.coefcorr(i, j)
给出一个三个相似性度量系数的比较
杰卡德系数 | 余弦相似度 | 皮尔逊相关系数 |
---|---|---|
利用两个集合之间的交集来显示集合之间的相互覆盖率来体现集合间的相似度 | 利用特征向量之间的夹角来体现两个集合之间的相似度 | 在余弦相似度的基础上利用了期望的信息进行修正,减小了用户评分偏置的影响。 |
基于用户的协同过滤——UserCF
UserCF的主要思想是对于一个用户,找到与其相似的用户,将该用户喜好的物品推荐给该用户。
所以首要目的即找到一个与当前用户相似的用户集合。
给出一个例子进行解释:
物品1 | 物品2 | 物品3 | 物品4 | 物品5 | |
---|---|---|---|---|---|
Alice | 5 | 3 | 4 | 4 | ? |
用户1 | 3 | 1 | 2 | 3 | 3 |
用户2 | 4 | 3 | 4 | 3 | 5 |
用户3 | 3 | 3 | 1 | 5 | 4 |
用户4 | 1 | 5 | 5 | 2 | 1 |
对于这个例子来说,因为在这里物品5对于Alice而言是缺失的,那么每个用户的特征向量其实就只有4个维度,那么我们下面我们分别用余弦相似度和皮尔逊相似度去计算一下用户之间的相似度。
-
利用余弦相似度计算
-
利用皮尔逊相关系数计算
计算出用户之间的相似度之后,此时我们需要补全二维表格中空缺的那个值,一般可以我们可以取与Alice相似的N个用户的评分的平均值,但是这样子无法保证用户的标准相同,所以在这里我们不采用该种方法,于是我们将用户打分的均值利用进来,有如下公式
Ri,j=Ri‾+∑k=1n(Si,k(Rk,j−R‾k))∑k=1nSj,kR_{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,k∑k=1n(Si,k(Rk,j−Rk))
其中,Ri,jR_{i,j}Ri,j为用户i对物品j的打分,R‾i\overline{R}_iRi是用户i对所有物品打分的平均值,Si,kS_{i,k}Si,k为用户i与k的相似度(在这里,我们利用用户之间的相似度进行加权求和)。
假设我们取前2个最相似用户,那么如果采用余弦相似度(皮尔逊相关系数也是相同步骤)去计算用户相似度,那么有用户1和用户2与Alice最相似,于是,我们利用他们两个的评分去计算缺失得分。
利用上面的公式,我们可以计算出其得分为4.87
利用计算出的得分,我们可以对多个物品进行排序,其中有
物品1 | 物品2 | 物品3 | 物品4 | 物品5 | |
---|---|---|---|---|---|
Alice | 5 | 3 | 4 | 4 | 4.87 |
于是推荐顺序为1>5>3=4>2
下面谈谈UserCF的缺点
- 对于UserCF而言,要求用户之间相似,但是(比如说利用用户打分的特征向量)不同用户之间的购买物品的重复率可能较低,导致无法找到较相似的用户或者足够数量的用户,所以对于正反馈获取困难的场景,UserCF并不适用
- 维护相似度矩阵的开销较大,不适合大用户数据量
基于物品的协同过滤——ItemCF
基于物品的协同过滤,ItemCF,利用用户过去的数据去为用户推荐物品,即利用物品之间的相似性去进行推荐而不是利用用户之间的相似性去推荐商品。算法认为:物品A和物品B具有很大的相似度是因为喜欢物品A的用户大都喜欢物品B(对于物品的打分而言)
还是用UserCF的例子来解释
物品1 | 物品2 | 物品3 | 物品4 | 物品5 | |
---|---|---|---|---|---|
Alice | 5 | 3 | 4 | 4 | ? |
用户1 | 3 | 1 | 2 | 3 | 3 |
用户2 | 4 | 3 | 4 | 3 | 5 |
用户3 | 3 | 3 | 1 | 5 | 4 |
用户4 | 1 | 5 | 5 | 2 | 1 |
在这里,如何评判物品之间的相似度呢,我们以每个用户为该物品打的分为特征。如物品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.9400.994, 0.739, 0.723, 0.9400.994,0.739,0.723,0.940,所以选择相似度较高的前两个物品,即物品1和4。
同样的,我们利用
Ri,j=Ri‾+∑k=1n(Si,k(Rk,j−R‾k))∑k=1nSj,kR_{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,k∑k=1n(Si,k(Rk,j−Rk))
去计算缺失数据,此时,Si,jS_{i,j}Si,j的值代表物品i与j的相似度,则最终我们可以计算出来得分为4.6
那么,将得分排序
物品1 | 物品2 | 物品3 | 物品4 | 物品5 | |
---|---|---|---|---|---|
Alice | 5 | 3 | 4 | 4 | 4.6 |
则选取两个物品进行推荐,我们选择物品1和物品5
协同过滤算法的改进
对于协同过滤算法,我们可以对其的相关度的计算方法进行改进
对于一号计算相关度的公式,如果物品i很受欢迎,那很多喜欢物品j的人也喜欢物品i,那么wijw_{ij}wij就会变得很大,那么对于物品i而言,很多物品和物品i的相关度都会很大,即存在不合理性,所以我们可以引入N(j)N(j)N(j)来惩罚物品i的热度,如二号所示,但是如果物品i十分受欢迎,导致所有人都会买i,那么wijw_{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)在这里代表用户uuu的活跃程度,那么对于既喜欢物品iii又喜欢物品jjj的用户而言,如果用户uuu的活跃度越高,那么这个用户的评价的权重就越低。
协同过滤算法的分析
协同过滤算法存在泛化能力弱的问题,导致协同过滤算法无法将相似物品的相似信息推广到其他物品上(这么解释,就是两个物品,我们知道他们很相似,但是为什么相似我们是不知道的,所以无法利用这两个物品之间的相似程度去为其他物品之间是否相似提供信息,我们只能单纯地知道它们相似),从而导致热门物体具有较强的头部效应,导致它和其他很多物品相似;而尾部物品由于特征向量稀疏,导致不经常被推荐。不过话虽然这么说,但是不是有个指标叫新颖程度吗,那尾部物品的新颖程度应该比较高吧,那这样它作为指标的话,尾部物品还是很大程度可以占用一定比例的。
个人觉得还是因为协同过滤算法并没有用上语义的信息,只能单纯的依赖其他信息。
参考资料
https://www.cnblogs.com/duanchw-37/archive/2012/08/24/2654019.html