“协同过滤” 就是协同大家的反馈、评价和意见一起对海量的信息进行过滤,从中筛选出目标用户可能感兴趣的信息的推荐过程。
user CF:基于用户的相似度进行推荐
应用场景:
具体步骤如下:
下面将对“用户相似度计算”及“最终结果的排序”做详细说明。
计算用户相似度,就是计算用户向量 i 和用户向量 j 之间的相似度,两个向量之间常用的相似度计算方法有如下几种:
衡量了用户向量i和用户向量J之间的向量夹角大小。显然,夹角越小,证明余弦相似度越大,两个用户越相似。
通过使用用户平均分对各独立评分进行修正,减小了用户评分偏置的影响
其中, R i , p R_{i,p} Ri,p代表用户i对物品p的评分。 R i ‾ \overline{R_i} Ri代表用户i对所有物品的平均评分,P代表所有物品的集合。
对两两用户都利用余弦相似度计算相似度。这种方法的时间复杂度是O(N^2)。耗时很大。
因此我们需要建立一张物品到用户之间的 倒排表(补充实现) ,这样就能排除对根本没有任何联系的用户之间的相似度计算。
再根据倒排表计算共同评分过的物品的矩阵。
如下图所示
矩阵中的每一个数值都是余弦相似度中的分子部分,然后将分子除以分母可以得到最终的用户兴趣相似度。即可以将上图中的共同评分过的物品的矩阵转换为用户之间的相似度矩阵,且只用计算非0的部分。
在获得Top k相似用户之后,利用Top k用户生成最终推荐结果的过程如下。
假设“目标用户与其相似用户的喜好是相似的”,可根据相似用户的已有评价对目标用户的偏好进行预测。这里最常用的方式是利用用户相似度和相似用户的评价的加权平均获得目标用户的评价预测。
其中,权重 w u , s w_{u,s} wu,s是用户u和用户s的相似度, R S , P R_{S,P} RS,P是用户s对物品p的评分。
实际在线系统使用UserCF的例子
由于UserCF技术上的两点缺陷,导致很多电商平台并没有采用这种算法,而是采用了ItemCF算法实现最初的推荐系统。
Item CF是基于物品相似度的协同过滤算法给用户推荐那些和他们之前喜欢的物品相似的物品。Item CF并不利用物品的内容属性计算物品之间的相似度,主要通过分析用户的行为记录计算物品之间的相似度。
具体步骤如下:
如果一个物品与多个用户行为历史中的正反馈物品相似,那么该物品最终的相似度应该是多个相似度的累加:
其中,H 是目标用户的正反馈物品集合, w p , h w_{p,h} wp,h是物品 p 与物品 h 的物品相似度, R u , h R_{u,h} Ru,h 是用户 u 对物品 h 的已有评分。
假设有这么一个用户,他是开书店的,并且买了当当网上80%的书准备用来自己卖。那么, 他的购物车里包含当当网80%的书。假设当当网有100万本书,也就是说他买了80万本。从前面 对ItemCF的讨论可以看到,这意味着因为存在这么一个用户,有80万本书两两之间就产生了相似度,也就是说,内存里即将诞生一个80万乘80万的稠密矩阵。
因此应对对活跃用户做一种软性的惩罚、
协同过滤是一个非常直观、可解释性很强的模型,但它并不具备较强的泛化能力,换句话说,协同过滤无法将两个物品相似这一信息推广到其他物品的相似性计算上。这就导致了一个比较严重的问题:推荐结果的头部效应较明显, 处理稀疏向量的能力弱,也就是说,热门的物品具有很强的头部效应,容易跟大批物品产生相似性;而尾部的物品由于特征向量稀疏, 很少与其他物品产生相似性,导致很少被推荐。
为解决上述问题,同时增加模型的泛化能力,矩阵分解技术被提出。该方法在协同过滤共现矩阵的基础上,使用更稠密的隐向量表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征,在一定程度上弥补了协同过滤模型处理稀疏矩阵能力不足的问题。
另外, 协同过滤(user cf、item cf、矩阵分解)仅利用用户和物品的交互信息, 无法有效地引人用户年龄、性别、商品描述、商品分类、当前时间等一系列用户特征、物品特征和上下文特征, 这无疑造成了有效信息的遗漏。为了在推荐模型中引入这些特征, 推荐系统逐渐发展到以逻辑回归模型为核心的、能够综合不同类型特征的机器学习模型的道路上。
协同过滤算法泛化能力较弱,因此提出了矩阵分解的算法。
下面以 Netflix 推荐场景的例子说明矩阵分解算法的原理:
矩阵分解算法为每一个用户和视频都生成相应的隐向量,用户和物品的隐向量是通过分解协同过滤生成的共现矩阵得到的。
矩阵分解算法将 m × n 维的共现矩阵 R 分解为 m × k 维的用户矩阵 U 和 k × n 维的物品矩阵 V 相乘的形式。其中 m 是用户数量,n 物品数量, k 是隐向量的维度。k 的大小决定了隐向量表达能力以及模型泛化能力的强弱。
在完成矩阵分解过程后,即可得到所有用户和物品的隐向量,并由此计算出用户 u 对物品 i 的预估评分 :
r ^ u i = q i T p u \hat r_{u i }=q_i^Tp_u r^ui=qiTpu
奇异值分解没有很多了解
在矩阵分解算法中,由于隐向量的存在,使任意的用户和物品之间都可以得到预测分值。而隐向量的生成过程其实是对共现矩阵进行全局拟合的过程,因此隐向量其实是利用全局信息生成的,有更强的泛化能力;而对协同过滤来说,如果两个用户没有相同的历史行为,两个物品没有相同的人购买,那么这两个用户和两个物品的相似度都将为 0 (因为协同过滤只能利用用户和物品自己的信息进行相似度计算,这就使协同过滤不具备泛化利用全局信息的能力)
优点
局限性
与协同过滤一样,矩阵分解同样不方便加入用户、物品和上下文相关的特征,这使得矩阵分解丧失了利用很多有效信息的机会,同时在缺乏用户历史行为时,无法进行有效的推荐
#参考链接