⑴ 推荐系统论文阅读(二十三)-神经图协同过滤NGCF
论文:
论文题目:《Neural Graph Collaborative Filtering》
论文地址: https://arxiv.org/pdf/1905.08108.pdf
本论文是关于图结构的协同过滤算法,在原始的矩阵分解和基于深度学习的方法中,通常是通过映射描述用户(或物品)的现有特征(例如ID和属性)来获得用户(或物品)的嵌入。从而利用user和item的embedding进行协同召回。但是作者认为这种方法的固有缺点是:在user与item的interaction数据中潜伏的 协作信号(collaborative signal) 未在嵌入过程中进行编码。这样,所得的嵌入可能不足以捕获协同过滤效果。
让我们一起来看一下本论文是怎么利用数据中潜伏的协作信号的吧。
推荐算法被广泛的运用在各个领域中,在电商领域,社交媒体,广告等领域都发挥着至关重要的作用。推荐系统的核心内容就是根据用户以前的购买和点击行为来评估用户对一个物品的喜爱程度,从而针对每个用户进行个性化推荐。协同过滤算法认为历史行为相似的用户之间的兴趣是相同的,所以给用户推荐的是同类型用户的爱好,也就是UserCF,而ItemCF给用户推荐的是跟历史行为相近的物品。
传统的协同过滤方法要么是基于矩阵分解,要么是基于深度学习的,这两种方法都忽略了一个非常关键的信息---user和item交互的协作信号,该信号隐藏在user和item的交互过程中。原始的协同过滤方法忽略了这种信息,所以在进行user 和 item representation时就不足以较好的进行embedding。
本论文通过将用户项交互(更具体地说是二分图结构)集成到embedding过程中,开发了一个新的推荐框架神经图协同过滤(NGCF),该框架通过在其上传播embedding来利用user-item图结构。这种方法在用户项目图中进行高阶连通性的表达建模,从而以显式方式将协作信号有效地注入到embedding过程中。
在介绍模型之前先来讲解一下什么是useritem interaction以及什么是高阶的useritem interaction。
我们先看左边的图,这个图就是useritem interaction,u1是我们待推荐的用户,用双圆圈表示,他交互过的物品有i1,i2,i3。在看右边这个树形结构的图,这个图是u1的高阶interaction图,注意只有l > 1的才是u1的高阶连接。观察到,这么一条路径,u1 ← i2 ← u2,指示u1和u2之间的行为相似性,因为两个用户都已与i2进行了交互。而另一条更长的路径,u1←i2←u2←i4暗示u1可能会点击i4,因为他的相似用户u2之前已经购买过i4。另一方面,用户u1在l = 3这一层会更倾向于i4而不是i5,理由是i4到u1有两条路径而i5只有一条。
当然这种树结构是不可能通过构建真正的树节点来表示的,因为树模型比较复杂,而且结构很大,没法对每个用户构建一个树,这样工作量太大了。那么怎么设计模型结构可以达到跟这个high-order connectivity的效果呢,这个就要运用到神经网络了。通过设计一个embedding propagation layer来表示这种embedding 在每个层之间的传递。
还是拿上面那张图举例子,堆叠两层可捕获u1←i2←u2的行为相似性,堆叠三层可捕获u1←i2←u2←i4的潜在推荐以及信息流的强度(由层之间的可训练权重来评估),并确定i4和i5的推荐优先级。
这个跟传统的embedding是一样的,都是对原始的userID和itemID做embedding,跟传统embedding不同的地方是,在我们的NGCF框架中,我们通过在用户-项目交互图上传播embedding来优化embedding。 由于embedding优化步骤将协作信号显式注入到embedding中,因此可以为推荐提供更有效的embedding。
这一层是本文的核心内容,下面我们来进行详细的解读。
从直观上来看,用户交互过的item会给用户的偏好带来最直接的依据。类似地,交互过某个item的用户可以视为该item的特征,并可以用来衡量两个item的协同相似性。 我们以此为基础在连接的用户和项目之间执行embedding propogation,并通过两个主要操作来制定流程:消息构建和消息聚合。
Message Construction(消息构建)
对于连接的user-item对(u,i),我们定义从i到u的消息为:
其中ei是i的embedding,eu是u的embedding,pui是用于控制每次传播的衰减因子,函数f是消息构建函数,f的定义为:
其中W1和W2用来提取有用的embedding信息,可以看到W2控制的i和u直接的交互性,这使得消息取决于ei和eu之间的亲和力,比如,传递更多来自相似项的消息。
另一个重要的地方是Nu和Ni,pui = 1/ 。Nu和Ni表示用户u和item i的第一跳邻居。 从表示学习的角度来看,pui反映了历史item对用户偏好的贡献程度。 从消息传递的角度来看,考虑到正在传播的消息应随路径长度衰减,因此pui可以解释为折扣因子。
Message Aggregation
聚合方法如下 :
其中 表示在第一嵌入传播层之后获得的用户u的表示。激活函数采用的是leakyrelu,这个函数适合对pos和neg信号进行编码。
另一个重要的信息是 ,它的定义如下:
这个信息的主要作用是保留原始的特征信息。
至此,我们得到了 ,同样的方法,我们也能获得 ,这个都是first order connectivoty的信息。
根据前面的计算方式,我们如果将多个Embedding Propagation Layers进行堆叠,我们就可以得到high order connectivity信息了:
计算方式如下:
当我看到这里的时候,我的脑子里产生了一个大大的疑惑,我们在计算第l层的eu和ei时都需要第l-1层的信息,那么我们怎么知道ei和eu在第l层是否存在呢?也就是说出现u侧的总层数l大于i侧总层数的时候,我们如何根据第l-1层的ei来计算第l层的e呢?经过思考,我感觉应该是这样的,训练样本应该是一条path,也就是这个例子是u1 ← i2 ← u2 ← i4这条path,所以可以保证u1跟i4的层数l是一样的,所以不存在上面那个层数不匹配的问题。
ps:看到后面的实验结果才知道L是固定的所以每一层都不会缺失。
还有一个就是,不同层之间的W是不一样的,每一层都有着自己的参数,这个看公式就知道,理由就是我们在提取不同层信息的时候需要不同的W进行信息提取。
另一个疑惑是pui到底是不是每一个l层都一样?这里看公式好像就是指的是第一跳的Nu和Ni进行就计算的结果。
这部分内容是为了在进行batch训练的时候进行矩阵运算所推导的数学过程,其实跟之前我们讲的那个过程在数学上的计算是完全一样的,你想象一下,如果不用矩阵进行运算,在训练过程中要如何进行这么复杂的交互运算。
当进行了l层的embedding propagation后,我们就拥有了l个eu和l个ei,我们将他们进行concate操作:
这样,我们不仅可以通过嵌入传播层丰富初始嵌入,还可以通过调整L来控制传播范围。
最后,我们进行内积计算,以评估用户对目标商品的偏好:
采用的是pair-wise方式中的bpr loss:
⑵ https://.baidu.com/question/2270990967816553188.html
整理一下自己的理解。
对于一个users-procts-rating的评分数据集,ALS会建立一个user*proct的m*n的矩阵
其中,m为users的数量,n为procts的数量
但是在这个数据集中,并不是每个用户都对每个产品进行过评分,所以这个矩阵往往是稀疏的,用户i对产品j的评分往往是空的
ALS所做的事情就是将这个稀疏矩阵通过一定的规律填满,这样就可以从矩阵中得到任意一个user对任意一个proct的评分,ALS填充的评分项也称为用户i对产品j的预测得分
所以说,ALS算法的核心就是通过什么样子的规律来填满(预测)这个稀疏矩阵
它是这么做的:
假设m*n的评分矩阵R,可以被近似分解成U*(V)T
U为m*d的用户特征向量矩阵
V为n*d的产品特征向量矩阵((V)T代表V的转置,原谅我不会打转置这个符号。。)
d为user/proct的特征值的数量
关于d这个值的理解,大概可以是这样的
对于每个产品,可以从d个角度进行评价,以电影为例,可以从主演,导演,特效,剧情4个角度来评价一部电影,那么d就等于4
可以认为,每部电影在这4个角度上都有一个固定的基准评分值
例如《末日崩塌》这部电影是一个产品,它的特征向量是由d个特征值组成的
d=4,有4个特征值,分别是主演,导演,特效,剧情
每个特征值的基准评分值分别为(满分为1.0):
主演:0.9(大光头还是那么霸气)
导演:0.7
特效:0.8
剧情:0.6
矩阵V由n个proct*d个特征值组成
对于矩阵U,假设对于任意的用户A,该用户对一部电影的综合评分和电影的特征值存在一定的线性关系,即电影的综合评分=(a1*d1+a2*d2+a3*d3+a4*d4)
其中a1-4为用户A的特征值,d1-4为之前所说的电影的特征值
参考:
协同过滤中的矩阵分解算法研究
那么对于之前ALS算法的这个假设
m*n的评分矩阵R,可以被近似分解成U*(V)T
就是成立的,某个用户对某个产品的评分可以通过矩阵U某行和矩阵V(转置)的某列相乘得到
那么现在的问题是,如何确定用户和产品的特征值?(之前仅仅是举例子,实际中这两个都是未知的变量)
采用的是交替的最小二乘法
在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分)在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量(这里可以得到预测的i对j的评分)
用真实评分减去预测评分然后求平方,对下一个用户,下一个产品进行相同的计算,将所有结果累加起来(其中,数据集构成的矩阵是存在大量的空打分,并没有实际的评分,解决的方法是就只看对已知打分的项)
参考:
ALS 在 Spark MLlib 中的实现
但是这里之前问题还是存在,就是用户和产品的特征向量都是未知的,这个式子存在两个未知变量
解决的办法是交替的最小二乘法
首先对于上面的公式,以下面的形式显示:
为了防止过度拟合,加上正则化参数为了防止过度拟合,加上正则化参数
首先用一个小于1的随机数初始化V首先用一个小于1的随机数初始化V
根据公式(4)求U
此时就可以得到初始的UV矩阵了,计算上面说过的差平方和
根据计算得到的U和公式(5),重新计算并覆盖V,计算差平方和
反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数满足要求则停止
取得最新的UV矩阵
则原本的稀疏矩阵R就可以用R=U(V)T来表示了
以上公式内容截图来自:
基于矩阵分解的协同过滤算法
总结一下:
ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积
交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小
通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分
不知道是不是理解正确了
有几个问题想请教一下~
⑶ 协同过滤(2): KDD2020- HyperGraph CF 基于超图
协同过滤推荐系统是当今众多推荐系统中最流行和最重要的推荐方法之一。
尽管已经被广泛采用,但是现有的基于 cf 的方法,从矩阵分解到新兴的基于图的方法, 在训练数据非常有限的情况下表现不佳 (数据稀疏问题)。
本文首先指出了造成这种不足的根本原因,并指出现有基于 CF 的方法固有的两个缺点,即: 1)用户和物品建模不灵活; 2)高阶相关性建模不足。
在这种情况下,文中提出了一个双通道超图协同过滤(DHCF)框架来解决上述问题。
首先,引入 双通道学习策略 (Dual-Channel),全面利用分治策略,学习用户和物品的表示,使这两种类型的数据可以优雅地相互连接,同时保持其特定属性。
其次, 利用超图结构对用户和具有显式混合高阶相关性的物品进行建模 。提出了跳跃超图卷积(JHConv)方法,实现高阶关系嵌入的显式和有效传播。
推荐系统的核心是一系列的推荐算法,这些算法能够**根据用户的个人特征有效地从爆炸式信息筛选出信息。协同过滤是目前最受欢迎和广泛采用的方法之一。
CF 持有一个基本的假设,当向用户提供推荐时: 那些行为相似的人(例如,经常访问同一个网站)很可能在物品(例如,音乐、视频、网站)上分享相似的偏好。
为了实现这一点,一个典型的基于 CFbased 方法执行一个两步策略: 它首先利用历史交互区分相似的用户和项目; 然后基于上面收集的信息,向特定用户生成推荐。
现有的 CF 方法可以分为三类。
虽然 CF 方法已经研究了多年,但仍然存在局限性,特别是在训练的先验知识非常有限的情况下。为了理解这些缺陷,深入挖掘现有 CF 方法的内在机制得到以下局限性:
基于这些生成的连接组,即超边,可以分别为用户和物品构造两个超图,即两个通道的表示。本文提出了一种新的跳跃超图卷积算法(JHConv) ,该算法通过聚合邻域的嵌入并引入先验信息,有效地在超图上进行信息传播。(与传统的基于图的方法对比,用户超图和项目超图,可以更灵活地进行复杂的数据关联建模,并与不同类型的数据结合。)
超图定义为 ,V表示图节点, 表示超边集合,超图邻接矩阵 描述节点与超边的关系
在高层次上,DHCF 首先通过一个双通道超图框架学习用户和物品的两组嵌入,在此框架上,DHCF 通过计算用户和物品嵌入查找表的内积,进一步计算出用户-项目偏好矩阵。基于这样的偏好矩阵,DHCF 估计用户对某个商品感兴趣的可能性。
总体分为三步:
构建用户和物品嵌入矩阵:
为了在预定义的混合高阶关系上聚合相邻消息,执行以下高阶消息传递:
为了提取有区别的信息,我们对用户和物品定义为
综上所述,上述两个过程构成了一个集成的DHCF 层,允许对用户和物品进行明确的建模和编码,并通过强大的嵌入功能进一步更新和生成更精确的嵌入超图结构。这种精细嵌入可以进一步应用于推荐系统中的各种下游任务。
与 传统 HGNNConv 相比,JHConv 允许模型同时考虑其原始特征和聚合相关表示,在另一方面,这样的 resnet结构的跳跃连接使模型能够避免由于集成了许多其他连接而导致的信息稀释。
引入高阶关联来实现构建超边,根据自定义的规则分别对用户和物品进行高阶关联提取
定义1: 物品的 k 阶可达邻居。在用户-物品交互图,更具体地说是二部图中,如果在 itemi 和 itemj 之间存在一个相邻顶点序列(即一条路) ,且该路径中的用户数小于 k,itemi (itemj)是 itemi (itemi)的 k 阶可达邻居。
定义2: 物品的 k阶可达用户。在物品-用户二部图中,如果用户 j 和物品 k 之间存在直接交互作用,则用户 j 是 itemi 的 k 阶可达邻居,而物品 k 是 itemi 的 k 阶可达邻居。
对于 itemi,其 k 阶可达用户集称为 。从数学上讲,超图可以定义在一个集簇上,其中每个集代表一个超边。因此,这里可以通过物品的 k 阶可达用户集构建超边。
然后在用户 k 阶可达规则的基础上构造高阶超边组,该超边组可表示为:
假设通过K阶可达规则,构造a个超边组,最后的超图需要将这a个超边组做融合,见上面的总体框架中的描述。
同理,按照相似的K阶可达的规则,对物品进行分析,构成物品的超边(N个用户,M个物品)
在实验中,每个用户观察到的交互中的10% 被随机选择用于训练,其余的数据用于测试。这样的设置增加了 CF 任务的难度,因为模型只能获取非常有限的观察到的交互。此外,由于数据的高度稀疏性,它可以很好地评价模型从有限的隐式数据集中挖掘有用信息的能力。对于所有四个数据集,每个用户至少有两个用于训练的交互。
这篇工作基于超图结构,提出了一种新的CF框架,与基于图神经网络的CF相比,超图结构更符合实际情况;此外,双通道的思路也值得借鉴,之前也分析的一篇双通道BPR的论文。近年来,基于图神经网络的推荐已经成为研究主流,而其中超图相关的工作少之又少,最近看到的另一篇是SIGIR2020上的一篇Next Item Recommendation with Sequential Hypergraphs,在超图神经网络上并没多大的改进,重点仍然在于如何用这种结构去解决存在的问题。
如果觉得有用,欢迎点赞关注赞赏,若对推荐感兴趣欢迎评论区/私信交流~~~
⑷ Neo4j 做推荐 (10)—— 协同过滤(皮尔逊相似性)
皮尔逊相似性或皮尔逊相关性是我们可以使用的另一种相似度量。这特别适合产品推荐,因为它考虑到 不同用户将具有不同的平均评分 这一事实:平均而言,一些用户倾向于给出比其他用户更高的评分。由于皮尔逊相似性考虑了 均值的差异 ,因此该指标将解释这些差异。
根据皮尔逊的相似度,找到与Cynthia Freeman最相似的用户
MATCH (u1:User {name:"Cynthia Freeman"})-[r:RATED]->(m:Movie)
WITH u1, avg(r.rating) AS u1_mean
MATCH (u1)-[r1:RATED]->(m:Movie)<-[r2:RATED]-(u2)
WITH u1, u1_mean, u2, COLLECT({r1: r1, r2: r2}) AS ratings WHERE size(ratings) > 10
MATCH (u2)-[r:RATED]->(m:Movie)
WITH u1, u1_mean, u2, avg(r.rating) AS u2_mean, ratings
UNWIND ratings AS r
WITH sum( (r.r1.rating-u1_mean) * (r.r2.rating-u2_mean) ) AS nom,
sqrt( sum( (r.r1.rating - u1_mean)^2) * sum( (r.r2.rating - u2_mean) ^2)) AS denom,
u1, u2 WHERE denom <> 0
RETURN u1.name, u2.name, nom/denom AS pearson
ORDER BY pearson DESC LIMIT 100
Neo4j 做推荐 (1)—— 基础数据
Neo4j 做推荐 (2)—— 基于内容的过滤
Neo4j 做推荐 (3)—— 协同过滤
Neo4j 做推荐 (4)—— 基于内容的过滤(续)
Neo4j 做推荐 (5)—— 基于类型的个性化建议
Neo4j 做推荐 (6)—— 加权内容算法
Neo4j 做推荐 (7)—— 基于内容的相似度量标准
Neo4j 做推荐 (8)—— 协同过滤(利用电影评级)
Neo4j 做推荐 (9)—— 协同过滤(人群的智慧)
Neo4j 做推荐 (10)—— 协同过滤(皮尔逊相似性)
Neo4j 做推荐 (11)—— 协同过滤(余弦相似度)
Neo4j 做推荐 (12)—— 协同过滤(基于邻域的推荐)
⑸ Neural Collaborative Filtering(神经协同过滤)
论文讨论的主要是隐性反馈协同过滤解决方案,先来明确两个概念:显性反馈和隐性反馈:
显性反馈行为包括用户明确表示对物品喜好的行为
隐性反馈行为指的是那些不能明确反应用户喜好
举例来说:
很多应用场景,并没有显性反馈的存在。因为大部分用户是沉默的用户,并不会明确给系统反馈“我对这个物品的偏好值是多少”。因此,推荐系统可以根据大量的隐性反馈来推断用户的偏好值。
根据已得到的隐性反馈数据,我们将用户-条目交互矩阵Y定义为:
但是,Yui为1仅代表二者有交互记录,并不代表用户u真的喜欢项目i,同理,u和i没有交互记录也不能代表u不喜欢i。这对隐性反馈的学习提出了挑战,因为它提供了关于用户偏好的噪声信号。虽然观察到的条目至少反映了用户对项目的兴趣,但是未查看的条目可能只是丢失数据,并且这其中存在自然稀疏的负反馈。
在隐性反馈上的推荐问题可以表达为估算矩阵 Y中未观察到的条目的分数问题(这个分数被用来评估项目的排名)。形式上它可以被抽象为学习函数:
为了处理缺失数据,有两种常见的做法:要么将所有未观察到的条目视作负反馈,要么从没有观察到条目中抽样作为负反馈实例。
传统的求解方法是矩阵分解(MF,Matrix Factorization),为每个user和item找到一个隐向量,问题变为:
这里的 K表示隐式空间(latent space)的维度。正如我们所看到的,MF模型是用户和项目的潜在因素的双向互动,它假设潜在空间的每一维都是相互独立的并且用相同的权重将它们线性结合。因此,MF可视为隐向量(latent factor)的线性模型。
论文中给出了一个例子来说明这种算法的局限性:
1(a)是user-item交互矩阵,1(b)是用户的隐式空间,论文中强调了两点来理解这张图片:
1)MF将user和item分布到同样的隐式空间中,那么两个用户之间的相似性也可以用二者在隐式空间中的向量夹角来确定。
2)使用Jaccard系数来作为真实的用户相似性。
通过MF计算的相似性与Jaccard系数计算的相似性也可以用来评判MF的性能。我们先来看看Jaccard系数
上面的示例显示了MF因为使用一个简单的和固定的内积,来估计在低维潜在空间中用户-项目的复杂交互,从而所可能造成的限制。解决该问题的方法之一是使用大量的潜在因子 K (就是隐式空间向量的维度)。然而这可能对模型的泛化能力产生不利的影响(e.g. 数据的过拟合问题),特别是在稀疏的集合上。论文通过使用DNNs从数据中学习交互函数,突破了这个限制。
论文先提出了一种通用框架:
针对这个通用框架,论文提出了三种不同的实现,三种实现可以用一张图来说明:
GMF :
上图中仅使用GMF layer,就得到了第一种实现方式GMF,GMF被称为广义矩阵分解,输出层的计算公式为:
MLP :
上图中仅使用右侧的MLP Layers,就得到了第二种学习方式,通过多层神经网络来学习user和item的隐向量。这样,输出层的计算公式为:
NeuMF :
结合GMF和MLP,得到的就是第三种实现方式,上图是该方式的完整实现,输出层的计算公式为:
论文的实验用于回答以下研究问题:
RQ1 我们提出的NCF方法是否胜过 state-of-the-art 的隐性协同过滤方法?
RQ2 我们提出的优化框架(消极样本抽样的log loss)怎样为推荐任务服务?
RQ3 更深的隐藏单元是不是有助于对用户项目交互数据的学习?
接下来,首先介绍实验设置,其次是回答上述三个问题。
数据集使用了两个公开的数据集:MovieLens 和 Pinterest 两个数据集,它们的特征总结在表1中
1.MovieLens :这个电影评级数据集被广泛地用于评估协同过滤算法。论文使用的是包含一百万个评分的版本,每个用户至少有20个评分。 虽然这是显性反馈数据集,但论文有意选择它来挖掘(模型)从显式反馈中学习隐性信号的表现。为此,论文将其转换为隐式数据,其中每个条目被标记为0或1表示用户是否已对该项进行评级。
2.Pinterest :这个隐含的反馈数据的构建用于评估基于内容的图像推荐。原始数据非常大但是很稀疏。 例如,超过20%的用户只有一个pin(pin类似于赞一下),使得难以用来评估协同过滤算法。 因此,论文使用与MovieLens数据集相同的方式过滤数据集:仅保留至少有过20个pin的用户。处理后得到了包含55,187个用户和1,580,809个项目交互的数据的子集。 每个交互都表示用户是否将图像pin在自己的主页上。
评估方案 : 为了评价项目推荐的性能,论文采用了leave-one-out方法(留一法)评估,该方法已被广泛地应用于文献。即:对于每个用户,论文将其最近的一次交互作为测试集(数据集一般都有时间戳),并利用余下的培训作为训练集。由于在评估过程中为每个用户排列所有项目花费的时间太多,所以遵循一般的策略,随机抽取100个不与用户进行交互的项目,将测试项目排列在这100个项目中。排名列表的性能由命中率(HR)和归一化折扣累积增益(NDCG)来衡量。 没有特别说明的话,论文将这两个指标的排名列表截断为10。如此一来,HR直观地衡量测试项目是否存在于前10名列表中,而NDCG通过将较高分数指定为顶级排名来计算命中的位置。论文计算了每个测试用户的这两个指标,并求取了平均分。
−ItemPop 。按项目的互动次数判断它的受欢迎程度,从而对项目进行排名。 这对基于评估推荐性能来说是一种非个性化的方法。
−ItemKNN 。这是基于项目的标准协同过滤方法。
−BPR 。该方法优化了使用公式的MF模型,该模型具有成对排序损失,BPR调整它使其可以从隐式反馈中学习。它是项目推荐基准的有力竞争者。论文使用固定的学习率,改变它并报告了它最佳的性能。
−eALS 。这是项目推荐的 state-of-the-art 的MF方法。
HR(命中率)和 NDCG(归一化折损累计增益),HR直观地衡量测试项目是否存在于前10名列表中,而NDCG通过将较高分数指定为顶级排名来计算命中的位置,重点介绍NDCG
NDCG这个名字可能比较吓人,但背后的思想却很简单.一个推荐系统返回一些item并形成一个列表,我们想要计算这个列表有多好,每一项都有一个相关的评分值,通常这些评分值是一个非负数,这就是gain(增益).此外对于这些没有用户反馈的项我们通常设置起增益为0.
累计增益(CG)
我们将这些增益相加就是Cumulative Gain(累计增益,CG),CG就是将每个推荐结果相关性的分支累加后作为整个推荐列表的得分.
rel i 表示处于位置i的推荐结果的相关性,k表示要考察的推荐列表的大小.
折损累计增益(DCG)
CG的一个缺点是没有考虑每个推荐结果处于不同位置对整个推荐效果的影响,例如我们总是希望相关性高的结果应该排在前面 .显然,如果相关性低的结果排在靠前的位置会严重影响用户的体验,所以在CG的基础上引入位置影响因素,即DCG(Discounted Cumulative Gain),这里指的是对于排名靠后推荐结果的推荐效果进行“打折处理”。假设排序越往后,价值越低。到第i个位置的时候,它的价值是 1/log 2 (i+1),那么第i个结果产生的效益就是 rel i * 1/log 2 (i+1),所以::
从上面的式子可以得到两个结论:
1.推荐结果的相关性越大,DCG越大
2.相关性好的排在推荐列表前面的话,推荐效果越好,DCG越大.
归一化折损累计增益(NDCG)
DCG仍然有不足之处,即 不同的推荐的推荐列表之间,很难进行横向的评估,而我们评估一个推荐系统不可能仅使用一个用户的推荐列表及相应结果进行评估,而是对整个测试机中的用户及其推荐列表结果进行评估 .那么不同的用户的推荐列表的评估分数就需要进行归一化,也即NDCG(Normalized Discounted Cumulative Gain,归一化折损累计增益).
在介绍NDCG之前还需要知道另一个概念,IDCG(Ideal DCG),指推荐系统为某一用户返回的最好推荐结果列表,即假设返回结果按照相关性排序,最相关的结果放在前面,此序列的DCG为IDCG.因此DCG的值介于(0,IDCG],故NDCG的值介于(0,1]。NDCG计算公式:
IDCG为理想情况下最大的DCG值。
其中 |REL| 表示,结果按照相关性从大到小的顺序排序,取前p个结果组成的集合。也就是按照最优的方式对结果进行排序。
实际的例子
假设推荐系统返回来的5个结果,其模型评分分别是 1.2、0.7、0.1、0.2、4.0。
我们首先通过公式4.2计算出DCG值为2.39278,按照公式4.4来计算出iDCG的值为3.6309
最后通过公式4.3计算出NDCG为65%
更多的推荐模型评估方法参考: https://statusrank.coding.me/articles/639f7364.html
图4(Figure 4)显示了 HR@10 和 NDCG@10 相对于预测因素数量的性能。
图5(Figure 5)显示了Top-K推荐列表的性能,排名位置K的范围为1到10。
总的来看论文提出的NeuMF模型(结合GMF和MLP)效果不错,对比其他方法都要好。
Figure 6 表示将模型看作一个二分类任务并使用logloss作为损失函数时的训练效果。
Figure7 表示采样率对模型性能的影响(横轴是采样率,即负样本与正样本的比例)。
上面的表格设置了两个变量,分别是Embedding的长度K和神经网络的层数,使用类似网格搜索的方式展示了在两个数据集上的结果。增加Embedding的长度和神经网络的层数是可以提升训练效果的。
⑹ 推荐算法之模型协同过滤(1)-关联规则
关联规则是数据挖掘中的典型问题之一,又被称为购物篮分析,这是因为传统的关联规则案例大多发生在超市中,例如所谓的啤酒与尿布传说。事实上,“购物篮”这个词也揭示了关联规则挖掘的一个重要特点:以交易记录为研究对象,每一个购物篮(transaction)就是一条记录。关联规则希望挖掘的规则就是:哪些商品会经常在同一个购物篮中出现,其中有没有因果关系。为了描述这种“经常性”及“因果关系”,分析者定义了几个指标,基于这些指标来筛选关联规则,从而得到那些不平凡的规律。
(1)计算支持度
支持度计数:一个项集出现在几个事务当中,它的支持度计数就是几。例如{Diaper, Beer}出现在事务 002、003和004中,所以它的支持度计数是3
支持度:支持度计数除于总的事务数。例如上例中总的事务数为4,{Diaper, Beer}的支持度计数为3,所以它的支持度是3÷4=75%,说明有75%的人同时买了Diaper和Beer。
(2)计算置信度
置信度:对于规则{Diaper}→{Beer},{Diaper, Beer}的支持度计数除于{Diaper}的支持度计数,为这个规则的置信度。例如规则{Diaper}→{Beer}的置信度为3÷3=100%。说明买了Diaper的人100%也买了Beer。
一般地,关联规则被划分为动态推荐,而协同过滤则更多地被视为静态推荐。
所谓动态推荐,就是推荐的基础是且只是当前一次(最近一次)的购买或者点击。譬如用户在网站上看了一个啤酒,系统就找到与这个啤酒相关的关联规则,然后根据这个规则向用户进行推荐。而静态推荐则是在对用户进行了一定分析的基础上,建立了这个用户在一定时期内的偏好排序,然后在这段时期内持续地按照这个排序来进行推荐。由此可见,关联规则与协同过滤的策略思路是完全不同的类型。
事实上,即便在当下很多能够拿到用户ID的场景,使用动态的关联规则推荐仍然是值得考虑的一种方法(尤其是我们经常把很多推荐方法的结果综合起来做一个混合的推荐),因为这种方法的逻辑思路跟协同过滤有着本质的不同,问题似乎仅仅在于:个人的偏好到底有多稳定,推荐到底是要迎合用户的长期偏好还是用户的当下需求。
挖掘关联规则主要有Apriori算法和FP-Growth算法。后者解决了前者由于频繁的扫描数据集造成的效率低下缺点。以下按照Apriori算法来讲解。
step 1: 扫描数据集生成满足最小支持度的频繁项集。
step 2: 计算规则的置信度,返回满足最小置信度的规则。
如下所示,当用户购买1商品时推荐2、3商品
⑺ 推荐系统(一):基于物品的协同过滤算法
协同过滤(collaborative filtering)算法是最经典、最常用的推荐算法。其基本思想是收集用户偏好,找到相似的用户或物品,然后计算并推荐。
基于物品的协同过滤算法的核心思想就是:给用户推荐那些和他们之前喜欢的物品相似的物品。主要可分为两步:
(1) 计算物品之间的相似度,建立相似度矩阵。
(2) 根据物品的相似度和用户的历史行为给用户生成推荐列表。
相似度的定义有多种方式,下面简要介绍其中几种:
其中,分母 是喜欢物品 的用户数,而分子 是同时喜欢物品 和物品 的用户数。因此,上述公式可以理解为喜欢物品 的用户中有多少比例的用户也喜欢物品 。
上述公式存在一个问题。如果物品 很热门, 就会很大,接近1。因此,该公式会造成任何物品都会和热门的物品有很大的相似度,为了避免推荐出热门的物品,可以用下面的公式:
这个公式惩罚了物品 的权重,因此减轻了热门物品会和很多物品相似的可能性。
另外为减小活跃用户对结果的影响,考虑IUF(nverse User Frequence) ,即用户活跃度对数的倒数的参数,认为活跃用户对物品相似度的贡献应该小于不活跃的用户。
为便于计算,还需要进一步将相似度矩阵归一化 。
其中 表示用户 对物品 的评分。 在区间 内,越接近1表示相似度越高。
表示空间中的两个点,则其欧几里得距离为:
当 时,即为平面上两个点的距离,当表示相似度时,可采用下式转换:
距离越小,相似度越大。
一般表示两个定距变量间联系的紧密程度,取值范围为[-1,1]
其中 是 和 的样品标准差
将用户行为数据按照均匀分布随机划分为M份,挑选一份作为测试集,将剩下的M-1份作为训练集。为防止评测指标不是过拟合的结果,共进行M次实验,每次都使用不同的测试集。然后将M次实验测出的评测指标的平均值作为最终的评测指标。
对用户u推荐N个物品(记为 ),令用户u在测试集上喜欢的物品集合为 ,召回率描述有多少比例的用户-物品评分记录包含在最终的推荐列表中。
准确率描述最终的推荐列表中有多少比例是发生过的用户-物品评分记录。
覆盖率反映了推荐算法发掘长尾的能力,覆盖率越高,说明推荐算法越能够将长尾中的物品推荐给用户。分子部分表示实验中所有被推荐给用户的物品数目(集合去重),分母表示数据集中所有物品的数目。
采用GroupLens提供的MovieLens数据集, http://www.grouplens.org/node/73 。本章使用中等大小的数据集,包含6000多用户对4000多部电影的100万条评分。该数据集是一个评分数据集,用户可以给电影评1-5分5个不同的等级。本文着重研究隐反馈数据集中TopN推荐问题,因此忽略了数据集中的评分记录。
该部分定义了所需要的主要变量,集合采用字典形式的数据结构。
读取原始CSV文件,并划分训练集和测试集,训练集占比87.5%,同时建立训练集和测试集的用户字典,记录每个用户对电影评分的字典。
第一步循环读取每个用户及其看过的电影,并统计每部电影被看过的次数,以及电影总数;第二步计算矩阵C,C[i][j]表示同时喜欢电影i和j的用户数,并考虑对活跃用户的惩罚;第三步根据式\ref{similarity}计算电影间的相似性;第四步进行归一化处理。
针对目标用户U,找到K部相似的电影,并推荐其N部电影,如果用户已经看过该电影则不推荐。
产生推荐并通过准确率、召回率和覆盖率进行评估。
结果如下所示,由于数据量较大,相似度矩阵为 维,计算速度较慢,耐心等待即可。
[1]. https://blog.csdn.net/m0_37917271/article/details/82656158
[2]. 推荐系统与深度学习. 黄昕等. 清华大学出版社. 2019.
[3]. 推荐系统算法实践. 黄美灵. 电子工业出版社. 2019.
[4]. 推荐系统算法. 项亮. 人民邮电出版社. 2012.
[5]. 美团机器学习实践. 美团算法团队. 人民邮电出版社. 2018.
⑻ 基于协同过滤的推荐算法
协同过滤推荐算法是最经典的推荐算法,它的算法思想为 物以类聚,人以群分 ,基本的协同过滤算法基于以下的假设:
实现协同过滤的步骤:
1). 找到相似的Top-N个人或者物品 :计算两两的相似度并进行排序
2). 根据相似的人或物品产生推荐结果 :利用Top-N生成初始推荐结果,然后过滤掉用户已经有过记录或者明确表示不喜欢的物品
那么,如何计算相似度呢?
根据数据类型的不同,相似度的计算方式也不同,数据类型有:
一般的,相似度计算有 杰卡德相似度、余弦相似度、皮尔逊相关系数
在协同过滤推荐算法中,我们更多的是利用用户对物品的评分数据集,预测用户对没有评分过的物品的评分结果。
用户-物品的评分矩阵,根据评分矩阵的稀疏程度会有不同的解决方案。
目的:预测用户1对于物品E的评分
步骤分析:
实现过程
用户之间的两两相似度:
物品之间的两两相似度:
⑼ 协同过滤
协同过滤(Collaborative Filtering,CF)——经典/老牌
只用户行为数据得到。对于 个用户, 个物品,则有共现矩阵 :
对于有正负反馈的情况,如“赞”是1和“踩”是-1,无操作是0:
对于只有显示反馈,如点击是1,无操作是0:
算法步骤:
1)得到共现矩阵 ;
2)计算 任意两行 用户相似度,得到用户相似度矩阵 ;
3)针对某个用户 选出与其最相似的 个用户, 是超参数;——召回阶段
4)基于这 个用户,计算 对每个物品的得分;
5)按照用户 的物品得分进行排序,过滤已推荐的物品,推荐剩下得分最高的 个。——排序阶段
第2步中,怎么计算用户相似度?——使用共现矩阵的行
以余弦相似度为标准,计算 和 之间的相似度:
第4步中,怎么每个用户对每个物品的得分?
假如和用户 最相似的2个为 和 :
对物品 的评分为1,用户 对物品 的评分也为1,那么用户 对 的评分为:
也就是说:利用用户相似度对用户评分进行加权平均:
其中, 为用户 和用户 之间的相似度, 为用户 和物品 之间的相似度。
UserCF的缺点
1、现实中用户数远远大于物品数,所以维护用户相似度矩阵代价很大;
2、共现矩阵是很稀疏的,那么计算计算用户相似度的准确度很低。
算法步骤:
1)得到共现矩阵 ;
2)计算 任意两列 物品相似度,得到物品相似度矩阵 ;
3)对于有正负反馈的,获得用户 正反馈的物品;
4)找出用户 正反馈的物品最相似的 个物品,组成相似物品集合;——召回阶段
5)利用相似度分值对相似物品集合进行排序,生产推荐列表。——排序阶段
最简单情况下一个物品(用户未接触的)只出现在另一个物品(用户已反馈的)的最相似集合中,那么每个用户对每个物品的得分就是相似度。如果一个物品和多个物品最相似怎么办?
如用户正反馈的是 和 ,对于物品 其最相似的是 ,相似度为0.7,对于物品 其最相似的也是 ,相似度为0.6,那么 相似度为:
也就是说:如果一个物品出现在多个物品的 个最相似的物品集合中,那么该物品的相似度为多个相似度乘以对应评分的累加。
其中, 是物品p与物品h的相似度, 是用户u对物品p的评分。
第2步中,怎么计算物品相似度?——使用共现矩阵的列
以余弦相似度为标准,计算 和 之间的相似度:
余弦相似度
皮尔逊相关系数
基于皮尔逊相关系数的改进
UserCF适用于用户兴趣比较分散变换较快的场景,如新闻推荐。
IteamCF适用于用户情趣不叫稳定的场景,如电商推荐。
优点:直观,可解释性强。
缺点:
⑽ 协同过滤与分类
[TOC]
本文是《写给程序员的数据挖掘实践指南》的一周性笔记总结。主要涵盖了以下内容:
所谓推荐系统就是系统根据你的行为操作为你推荐你可能想要的其他物品。这在电商平台、音乐平台、资讯推送平台等多有见到。而协同过滤简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐用户感兴趣的信息,个人通过合作的机制给予信息相当程度的回应(如评分)并记录下来以达到过滤的目的进而帮助别人筛选信息。其推荐基础是用户评分。这里可以分为两种用户评分,即显式评分与隐式评分。显式评分即日常见到的为物品打分,如对喜好音乐评级等;隐式评分是通过对用户行为的持续性观察,进而发现用户偏好的一种方法,如新闻网页中的推送你经常阅读过的相关内容等。两种评分方法都有自己的问题。
总体来说,协同过滤其运作机制也可以分为两种:
基于用户的推荐是指通过用户的行为偏好,划分相似用户。在相似用户群体之间互相推送一方喜欢而另一方未有过的物品。核心在于相似用户群体的划分。这种推荐方法有自己的局限:
基于用户的过滤其核心是用户群体的划分,其实也就是分类。
这里的距离函数包括三种:曼哈顿距离和欧氏距离。这里以二维举例,更多维情况下类推即可。
两距离函数可以一般化为:
其中,当r=1时,函数为曼哈顿距离;当r=2时,函数为欧氏距离。
算法实现:
在算出距离函数后,通过比对目标用户与所有用户群体的偏好,找到最近邻的用户并给予推荐。
基于用户距离的推荐有一个明显的问题,就是用户评分体系的差异。比如评分极端的用户给喜欢的评最高分,给不喜欢的评最低分;而有些用户倾向于不出现极端评分。即所谓“分数贬值”( Grade Inflation )问题。这种问题的存在可能让基于距离的评分产生偏差。皮尔逊相关系数可以缓解这种问题。
原皮尔逊相关系数公式在实际运用的时候会出现多次迭代的问题,影响计算效率,这里给出了近似公式:
皮尔逊相关系数的用户判断依据不是单纯的用户距离,而是用户的评分一致性:取值在[-1, 1]之间,越接近1则表示两用户的评分一致性越好;反之则反。
python实现:
基于用户推荐的过程中,另一个存在的问题就是由于大部分人的喜爱物品集合的交集过少,存在大量计算值为0的feature的情况。即所谓 稀疏性 问题。一个较容易理解的例子是对书本内容的挖掘。余弦相似度会忽略这种0-0匹配。
余弦相似度:
python实现:
如此多的评估系数,如何进行抉择呢?根据数据特征:
另外值得考虑的一点是,目前为止的推荐都是基于单用户的。即对一个用户的推荐系统只是基于另一个用户。这会存在一些问题。比如虽然虽然两者相似度很高,但是另外一个人有一些怪癖,怪癖的推荐就是不合理的;又比如,在相似度极高的情况下,你不能确定统一账户下的操作是同一个人做出的或者说操作行为是为了用户自身。比如用户考虑购买某件商品作为礼物送给别人,这就是基于别人喜好的购买行为,这种推荐也是不合适的。
对这种问题的解决可以使用群体划分的方法。原理与单用户类似,但是用户的匹配是k个。在这k位最优匹配的用户之间,以相似度的大小为依据设定权重作为物品推荐的条件。此即协同过滤的k近邻。
正如前面提到的基于用户的推荐有复杂度、稀疏性的问题,而基于物品的过滤则可以缓解这些问题。所谓基于物品的过滤是指,我们事先找到最相似的物品,并结合用户对物品的评级结果来生成推荐。前提是要对物品进行相似度匹配,找到一种算法。
这里的调整是指为了减轻用户评分体系的不一致情况(抵消分数贬值),从每个评级结果中减去该用户所有物品的平均分的评级结果。
其中,U表示所有同时对i, j进行评级过的用户的集合。 表示用户u给物品i的评分减去用户u对所有物品的评分的平均值。
在得到所有物品的余弦相似度后,我们就可以通过该指数预测用户对某件物品的偏好程度。方法就是所有相似物品的相似度乘以得分的总和。
其中p(u, i)指的是用户u对物品i评分的预测值。N是用户u的所有评级物品中每个和i得分相似的物品。这里的相似指的是矩阵中存在N和i的一个相似度得分。 是i和N之间的相似度得分。 是u给N的评级结果。公式较好运行的条件是 取值在(-1, 1)之间,这里就要使用归一化概念。
另一种常用的基于物品过滤的算法就是 slope one 算法。它的大概原理是预测用户u对产品j的评分时,预先计算包含所有物品的两物品偏差表;根据u的已评价的所有物品评分与该物品和产品j的偏差( )之和并乘以所有对此两类物品有过评分的用户个数,一一加总,除以所有同时对产品i与u评价过的所有物品有过评分的用户的人数,得到得分。公式如下:
其中, ; 是利用加权s1算法给出的用户u对物品j的预测值。 指的是对所有除j之外u打过分的物品。
python实现:
在前面两节中,基于物品和基于用户的过滤其前提都是用户需要对已有的item进行评分。而实际上,如果一个新的item出现,由于缺乏别人的偏好,他永远不会被推荐。这就是推荐系统中所谓的—— 冷启动 问题。基于用户评价的系统就会出现这种问题。
冷启动 问题的解决方案之一就是 基于物品属性的过滤 来进行推荐:对物品自身的属性进行归纳总结,并以此进行物品推荐。基于物品属性的过滤存在一个问题同样是量纲的不统一。如果量纲不统一极端值将会对推荐系统造成大麻烦。解决方法也很简单:归一化。此章使用的是z-评分。
使用z得分也存在问题,就是极易受到离群值的影响。这里可以使用 改进的标准分数 来缓解这个问题:
什么时候可以进行归一化呢?
这里用曼哈顿距离举例基于物品属性的过滤:
在上一章最后一节对于用户是否喜欢某件item的判别中,实际上包含了分类器的思想:分类器就是利用对象属性判定对象属于哪个组或类别的程序。这里简单用另一个小项目来说明。
简单来说就是根据运动员的某些指标来判断这位运动员属于什么类别的运动员。
准确率有0.8。