【推荐系统】协同过滤推荐算法
1、协同过滤概述
协同过滤(CF, Collaborative Filtering)的主要思想是:利用已有的用户群过去的行为或者意见预测当前用户最可能喜欢哪些东西或者对哪些东西感兴趣。主要应用场景是在线零售系统,目的是进行商品促销和提高销售额。
算法输入是一个用户-物品评分矩阵,输出的数据一般有两类:当前用户对物品喜欢和不喜欢程度的预测数值和n项的推荐物品的列表(不包含当前用户已经购买过的物品)。
主要/最基础的实现方式有:
(1)基于用户的最近邻推荐;
(2)基于物品的最近邻推荐。
2、基于用户的最近邻推荐
(1)基于用户的最近邻推荐概述
基于用户的最近邻推荐(user-based nearest neighbor recommendation)主要思想是:首先,对输入的评分数据集和当前用户ID作为输入,找出与当前用户过去有相似偏好的其它用户,这些用户叫做对等用户或者最近邻;然后,对当前用户没有见过的每个产品p,利用用户的近邻对产品p的评分进行预测;最后,选择所有产品评分最高的TopN个产品推荐给当前用户。
(2)前提/假设
如果用户过去有相似的偏好,那么该用户在未来也会有相似的偏好,用户的偏好不会随着时间而变化。
(3)计算方式
使用皮尔森/皮尔逊相关系数(Pearson Correlation Coefficient)来表示两个用户之间的相关性,取值范围为[-1,+1],-1表示强负相关,+1表示强正相关,0表示不相关。
Pearson相关系数的应用要求两个变量的标准差都不为零的时候,该相关系数才具有定义,使用场景如下:
(1)两个变量之间是线性关系,都是连续数据;
(2)两个变量的总体是正态分布或者解决正态的单峰分布;
(3)两个变量的观察值是成对的,每对观测值之间是相互对立的;
(4)当计算出用户a和其它用户的相关性的时候,我们可以选择出最相似的N个近邻用户计算对物品p的评分预测值(N个近邻用户对物品p都有评分值)。
3、基于物品的最近邻推荐
(1)基于物品的最近邻推荐概述
基于物品的最近邻推荐(item-based nearest neighbor recommendation)的思想是基于物品之间的相似度,而不是基于用户之间的相似度来进行预测评分值。
(2)计算方式
在基于物品的最近邻推荐算法中使用余弦相似度来计算两个物品中间的相似度的值,相似度取值范围:[0,1],值越接近1表示越相似。
由于余弦相似度不考虑用户评分平均值之间的差异性,所以一般使用改进余弦相似度公式来计算相似度,做法是在评分值中减去平均值,改进余弦相似度公式的取值范围为[-1,1],和Pearson相关系数一样。
基于计算出来的物品之间的相似度,选择最相似的前N个物品出来,可以预测用户u对物品p的评分为:
(3)计算过程
基于物品的最近邻推荐可以离线进行数据预计算,先构建出一个物品相似度矩阵,用于描述两个物品之间的相似度。在线上运行的时候,通过确定与物品p最相似的物品并计算u对这些邻近物品评分的加权总和来得到u对p的预测评分;近邻数量受限于用户有评分的物品个数,由于这样的物品数量一般都比较少,因此计算预测值的过程可以在线上交互应用允许的短时间内完成。
原则上来讲,这种离线的计算方式也适合于基于用户的最近邻推荐,但是实际情况下,两个用户评分重叠的情况非常少,这样的话就会导致其它的评分值影响到最终用户间的相似度的计算。换言之,物品之间的相似度比用户之间的相似度更加稳定,这种计算的方式不会改变物品之间的相似度。
4、基于近邻方法的优势
(1)简单性:实现简单,而且在调整参数的过程中只有一个近邻数需要调整;
(2)合理性:对于预测推荐提供了简洁并直观的理由;
(3)高效性:基于近邻方法的推荐的效果特别高,因为可以先进行预处理,构建出相似度矩阵,在实际应用过程中,可以提供近似实时的推荐结果;
(4)稳定性:当相似度矩阵构建完成后,如果有一个新的用户或者新的物品有评分的时候,只需要计算这个个体和其它个体之间的相似性即可完成更新操作。
5、协同过滤中的评分
由于在CF算法中,需要输入的是用户-物品评分矩阵,所以构建用户-物品评分矩阵是一个在进行协同过滤的重点。评分一般采用两分制、五分制、七分制和十分制这四种。可以通过以下两种方式收集用户对物品的评分,分别是:
(1)显式评分:通过问卷调查的方式收集用户对于商品的评分,优点是数据比较准确,缺点是当用户看不到好处的时候可能不会提供评分。
(2)隐式评分:当用户购买一个商品或者浏览一个商品的时候,我们可以认为这是一个正向评分/正向意图,根据既定的规则,可以将其转换为评分值;这种方式的优点是可以收集到最够多的数据,缺点是很难保证得到的评分数据是一个准确的用户评分数据。
6、评分矩阵数据稀疏
在实际的应用中,由于用户一般只会评价(或者购买、浏览)少部分商品,这样就会导致评分矩阵一般比较稀疏。这种情况下的挑战就是使用相对较少的有效评分来得到一个比较准确的预测。最直接的方式就是利用用户/物品的额外特征属性数据,进行数据的分类、聚类操作,来求解相似用户/物品列表。除此之外,可以使用缺省投票的形式补全物品的评价分数,思想是给那些只有一两个用户评价的物品给定一个缺省值。
7、冷启动问题
在CF算法中,存在着冷启动的问题,主要包括:
(1)如何向还没有任何物品评分的新用户进行推荐;
(2)如何处理从未被评过分或者购买过的商品。
解决方案:
(1)利用混合方法进行推荐,即利用额外的外部特征属性;对样本进行分类、聚类建模即可完成推荐;
(2)结合基于用户的近邻推荐和基于物品的近邻推荐算法;
(3)推荐Top10热门商品或者专门给定一个最近新加商品推荐列表。
8、相似度度量
(1)皮尔逊相关系数(Pearson Correlation, PC): 在基于用户近邻推荐算法中,常用的一种度量公式,效果最佳。
(2)改进余弦向量相似度(Adjuested Cosine, AC):在基于物品近邻推荐算法中,最常用的一个相似度度量计算公式,效果最佳。
除此之外,还有不太常用的两种度量公式(效果不佳,不推荐使用):
(3)均方差(Mean Squared Difference, MSD):使用用户u和用户v对相同物品评分差的平方和均值的倒数来表示两个人的相似度。缺点是:无法表示负关联。
(4)斯皮尔曼等级关联(Spearman Rank Correlation, SRC):利用用户对物品评分的排名来计算两个用户之间的相似度。缺点是:计算排名,消耗比较大,对于用户评分只有少量可选值的情况下,会产生大量并列的排名,效果不佳。
当两个用户对物品进行评分的时候,如果评分商品都比较少,而且分数比较一致的情况下,我们就会认为,这两个用户比较相似,基于物品近邻算法也是一样的。但是这个时候实际上这两个用户的爱好事实上可能是完全不同的,解决这个问题,我们可以通过在相似度上添加一个重要性权重或者进行相似度缩放的方式对相似度进行转换。
(5)重要性权重:当两个用户/物品之间的共同评分的物品/用户数量小于给定阈值的时候,就降低相似度重要性的权重。阈值大于等于25的时候,有比较好的预测结果。
(6)相似度缩放:给定一个收缩因子对相似度进行收缩转换,当共同评分数量远远大于收缩因子的时候,物品的相似度几乎没有变化;当收缩因子为100的时候,效果不错。
另外两个用户对物品给出一致的喜欢和不喜欢的评分,可能会不如他们给出差异更大的评分时提供的信息量多。可以通过使用(7)反用户频率(Inverse User Frequence, IUF)来对相似度计算公式进行转换,每个物品i都会赋以权重ci,对应评论了物品i的用户比例的log值:
(8)频率加权皮尔逊相关系数(Frequencey-Weighted Pearson Correlation, FWPC)公式为:
类似于反用户频率,在基于物品近邻推荐中,可以使用(9)反物品频率(Inverse ItemFrequence, IIF)来对相似度计算公式进行转换,每个用户u都会赋予一个权重cu,对应用户u进行评论的物品数量比例的log值:
(10)频率加权改进余弦相似度(Frequencey-Weighted Adjusted Cosine, FWAC)公式为:
9、近邻的选择
在基于近邻进行推荐的算法中,近邻数量的选择和选择近邻的规则对于推荐系统的质量会产生重要的影响,一般现在近邻可以通过以下方式来选择:
先过滤出预选近邻:Top-N过滤、阈值过滤、负数过滤。
再从预选近邻列表中获取k个近邻;如果k的数目过小,会导致预测精度非常低,随着k的增大,预测精度会有一定的提升,但是达到一定值的时候(>50),由于存在一些重要的关联被不重要的关联所削弱,会导致预测精度下降,推荐选值一般为:25~50之间,当然在实际工作中,最优k的值一般需要通过进行交叉验证获取。
10、基于近邻推荐算法的缺陷
基于近邻的算法是基于评分之间的关联性进行推荐的,所以存在两个重要的缺陷:
(1)覆盖有限:由于计算两个用户之间的相似性是基于他们对相同物品的评分,而且只有对相同物品进行评分的用户才能作为近邻,但是在实际应用中,有些用户有很少或者没有共同评分,但是他们可能具有相似的爱好,所以推荐算法的覆盖将会受到影响。
(2)对稀疏数据的敏感:由于用户只会对一部分物品进行评分,所以评分矩阵的稀疏性是大多数推荐系统的共同问题。当数据是稀疏的时候,两个用户或者物品之间的相似性计算仅适用很少量有限的近邻。另外,相似性权重的计算也可能依赖小部分评分,从而有可能导致推荐偏差。这也是一个比较重要的问题:冷启动问题。
解决方案:默认值填充、额外特性属性关联(非评分,内容信息填充)
11、矩阵因子分解(SVD)推荐算法
(1)SVD算法的概述
SVD(Singular Value Decomposition)的想法是根据已有的评分情况,分析出评分者对各个物品因子的喜好程度,以及各个物品对于这些因子的包含程度,最后再反过来根据分析结果预测评分。通过SVD的方式可以找出影响评分的显示因子和隐藏因子,这样更多有意义的关联关系就会被发现出来。
(2)SVD算法的计算
SVD的数学定义:将给定评分矩阵R分解成为三个矩阵的乘积,其中U、V称为左、右奇异向量,Σ对角线上的值称为奇异值;其中R为n*m的矩阵,U为n*n的矩阵,Σ为n*m的矩阵,V为m*m的矩阵;可以使用前k个奇异值来近似的替代R矩阵,因为前1%的奇异值的和就占了全部奇异值和的99%以上。
将U、V矩阵进行转换得到用户因子矩阵P和物品因子矩阵Q:
评分预测为rui为:
用户因子矩阵P和物品因子矩阵Q的计算可以通过随机梯度下降的方式进行学习,迭代式的更新相关参数即可,使用SVD矩阵因子分解推荐算法对于评分稀疏矩阵也可以进行正常处理,对于没有评分的不用计算误差值,直接令误差值为0:
12、关联规则挖掘推荐算法
关联规则挖掘是一种在大规模交易中识别类似规则关系模式的通用技术,可以应用到CF类型的推荐系统中。
交易T是所有有效产品集合P={p,p,…,p}的子集,表示被一起购买的产品集合,关联规则X=>Y表示只要交易T中包含了X里面的元素,那么认为Y里面的元素也有可能被T包含。常见的规则挖掘算法是Apriori算法,关联规则的衡量指标是:支持度(support)和可信度(confidence)。
将关联规则应用到推荐系统的主要问题就是需要将评分转换为交易,一般情况把所有的向前(正向)的评分集合<可以是做过去均值化操作后的评分矩阵>或者用户的购买行为可以看做一次交易。