协同过滤推荐算法
一、背景介绍
随着信息技术的发展,我们正身处一个数据爆炸的时代。指数增长的数据给信息生产者和信息消费者带来了新的问题。
对于信息生产者:如何让自己生产的信息脱颖而出,受到广大用户的关注?
对于信息消费者:如何从大量的信息中找到自己感兴趣的信息?
为了解决以上问题,推荐系统应运而生
1.1推荐系统
推荐系统的核心功能是:
1.帮助用户发现对自己有价值的信息
2.让信息能够展现在对它感兴趣的用户前面
推荐系统使用一系列不同的技术,这些系统可分为两大类:
基于内容的系统(Content-based System)
协同过滤系统(Collaborative Filtering System)
1.2效用矩阵
在推荐系统应用中,存在两类元素,一类称为用户(User),另一类称为项(Item)。用户会偏爱某些项,这些偏好信息必须要从数据中梳理出来。数据本身会表示成一个效用矩阵(utility matrix),该矩阵中每个用户-项对所对应的元素值代表的是当前用户对当前项的喜好程度。这些喜好程度来自一个有序集合,比如1~5的整数集合,这些整数代表用户对项的评级(比如分别代表评论的星级)。
我们假设该矩阵是稀疏的,即意味着大部分元素都未知。一个未知的评级也暗示着我们对当前用户对当前项的喜好信息还不清楚。
推荐系统的目标是预测效用矩阵的空白元素
1.3传统推荐模型
推荐系统自诞生以来经历了多次发展迭代,其模型也从一开始的传统模型发展为深度学习模型,本文重点关注传统推荐模型,来帮助读者较好地入门。
二、算法原理
2.1协同过滤算法
基本思想:根据用户之前的喜好以及其他兴趣相近的用户的选择来给当前用户推荐物品
协同过滤算法集中关注用户和项之间的关系,并且它仅仅基于用户行为数据,而不依赖于项或用户的任何附加信息(这里的附加信息指项或用户的自身属性,如用户的年龄职业性别,项的产地产家等)
目前应用比较广泛的协同过滤算法是基于邻域的方法,而这种方法主要有一下两种算法:
基于用户的协同过滤算法(UserCF)
给用户推荐和他兴趣相近的其他用户喜欢的物品
基于项的协同过滤算法(ItemCF)
给用户推荐和他之前喜欢的项相似的项
因此,如何寻找相似用户或者相似项,就是该算法接下来要解决的问题
2.2相似度计算
推荐算法通过效用矩阵的行或列来计算用户或项之间的相似度,常用的相似度计算方式有以下三种:
jaccard相似度
余弦相似度
皮尔逊相关系数
2.2.1 jaccard相似度
忽略了效用矩阵中的具体值而只关注所评分项的集合。
两个集合A和B的交集元素在A和B的并集中所占比例,称为两个集合的jaccard相似度,用符号J(A,B)表示。
以前面提到的效用矩阵为例:
J(A,B) = 0.2
J(A,C) = 0.5
可见,在jaccard相似度的计算下,用户A与用户C更相似
2.2.2 余弦相似度
把效用矩阵的空白部分看成0,计算用户向量A和B的夹角大小,夹角越小,说明两个用户向量在方向上更一致,两个用户更相似。
计算方式:
对于n维用户向量i(x11,x12,x13…x1n) 和 j(x21,x22,x23…x2n),其余弦相似度为:
以上面效用矩阵为例,A和B的余弦相似度为:
A和C的余弦相似度为:
可见,在余弦相似度的计算下,用户A更接近B而不是C
2.2.3 皮尔逊相关系数
由于有的用户倾向于打高分,有的用户倾向于打低分,因此,相比于余弦相似度,皮尔逊相关系数通过使用用户平均分对独立评分进行修正,减少了用户评分偏置的影响:
具体计算方法:两个向量各减去它们的平均值,再计算cosine值。
2.3结果预测
基于以上几种相似度计算方法,可以计算出向量之间的相似度,由此选出与目标用户最接近的前N个用户,根据这些用户对项的打分来估计目标用户对该项的评分
常用的方式是利用用户相似度和相似用户的评价来加权平均,计算出当前用户的预测评价:
2.4相似度对偶性
效用矩阵可看成有关用户信息的矩阵,也可看成有关项信息的矩阵,或者同时与两种信息有关的矩阵。
因此,前面所介绍的寻找相似用户的方法都可以应用在效用矩阵的列向量上来寻找相似项。
2.5举例
采用余弦相似度计算用户向量的相似度,基于以下效用矩阵,请预测用户1对项目2的评分(最相似用户取top-2用户)
由于要预测用户1对项目2的评分,先找出除用户1以外所有对项目2评分过的用户:3,4,5,7。
然后分别计算他们与用户1的余弦相似度:
比较大小后可得Top-2用户为User3和User5,则用户1对项目2的评分预测为:
2.6优缺点分析
User-basedCF算法存在两个重大问题:
1.1数据稀疏性
一个大型的电子商务推荐系统一般有非常多的物品,用户可能买的其中不到1%的物品,不同用户之间买的物品重叠性较低,导致算法无法找到一个用户的邻居,即偏好相似的用户。这导致UserCF不适用于那些正反馈获取较困难的应用场景(如酒店预订, 大件商品购买等低频应用)
1.2算法扩展性
基于用户的协同过滤需要维护用户相似度矩阵以便快速的找出Top-n相似用户, 该矩阵的存储开销非常大,存储空间随着用户数量的增加而增加,不适合用户数据量大的情况使用。
ItemCF算法因为物品直接的相似性相对比较固定,所以可以预先在线下计算好不同物品之间的相似度,把结果存在表中,当推荐时进行查表,计算用户可能的打分值,可以一定程度上解决前面两个问题
协同推荐过滤算法存在的共性问题:
2.1较差的稀疏矩阵处理能力
热门物品具有很强的头部效应, 容易跟大量物品产生相似, 而尾部物 品由于特征向量稀疏, 导致很少被推荐
2.2无法利用更多信息
协同过滤的特点就是完全没有利用到物品本身或者是用户自身的属性, 仅仅利用了用户与物品的交互信息就可以实现推荐,比较简单高效, 但这也是它的一个短板所在, 由于无法有效的引入用户年龄, 性别,商品描述,商品分类等一系列用户特征、物品特征和上下文特征, 这就造成了有效信息的遗漏,不能充分利用其它特征数据。
2.7用户聚类和项聚类
使用某种距离计算方法来对某个对象进行聚类,比如项。
可使用某种能留下许多簇的聚类算法对效用矩阵多次使用,直到我们直观上认为两种簇的数目合理为止
2.8降维处理
效用矩阵分解成两个细长矩阵的乘积
方法:UV分解(SVD奇异值分解的一个实例)
假设M是一个拥有一些空白元素的n×m效用矩阵,U和V分别是n×d和d×m维的矩阵。若找到一个U矩阵和V矩阵,使得UV和M在M上的非空元素非常相近,则可以使用UV上的元素来估计效用矩阵M的空白元素
评估指标:均方根误差(RMSE)
三、算法实验
问题描述
商城购物预测
步骤:
1.问题描述
2.实验过程
3.预测结果
数据预处理
通过用户的购买信息表,来预测用户接下来可能会购买的物品。
数据来源:阿里天池离线赛
采用方法
将此次实验所需要的数据进行提取,得到User-Item矩阵:
横轴:item编号;纵轴:User编号
打分含义:
0:未点击
1:浏览
2:收藏
3:添加购物车
4:购买
方法:
基于物品的K近邻协同过滤推荐算法,使用余弦相似度计算item之间的相似程度,输出相似的最大的K个商品编号
实验结果
使用了余弦相似度的ItemCF所预测的部分结果如图下所示:
左边代表了用户序号
右边代表了该用户接下来会购买的商品编号
实验总结
ItemCF对UserCF协同过滤的一种改良。
用户数远大于物品数时,而且物品的变更频率不高,物品的相似度相对于用户的兴趣来讲比较稳定。这个时候使用基于物品的协同过滤是比较好的选择。
还是无法很好的解决数据稀疏性问题,可以采取对相似物品进行聚类、简单填值、降维、结合内容的过滤方法等。