推荐算法(协同过滤算法)浅析

推荐算法(协同过滤算法)浅析

1.什么是推荐系统

个性化推荐系统(Personalized Recommendation System)是一种根据用户的兴趣、偏好、行为等个体特征,为用户推荐个性化内容或产品的技术。其目标是通过分析用户历史行为或特征数据,预测用户可能感兴趣的内容,从而提高用户体验、增加用户粘性,并推动商业目标的实现(如提升销售、增加点击率等)。

如今,随着大数据的发展,个性化推荐已经涉及诸多领域,比如电商(淘宝、京东)、电影视频网站(B站,youtobe)、音乐网站(网易云、QQ音乐)等。

推荐系统不仅仅依赖推荐算法,它是一个高度综合性的系统,涉及到用户意图识别、文本分析、行为分析等多个领域。为了提高精确度,推荐系统需要结合多种技术和方法,不仅是算法本身,还需要对用户行为和偏好的深入理解。因此,它是一个跨学科、多层次的复杂工程。

2.总体架构

根据响应用户行为的速度不同,推荐系统可以大致分为基于离线训练和在线训练的推荐系统。

2.1离线推荐

css 复制代码
一个典型的基于离线训练的推荐系统架构由**数据上报、离线训练、在线存储、实时计算和 A/B 测试**这几个模块组成。其中,数据上报和离线训练负责算法层的模型训练,而实时计算和 A/B 测试组成了预测系统。另外,还有一个在线存储模块,用于存储模型和模型需要的特征信息供实时计算模块调用。系统分为训练和预测两条数据流,训练流通过数据上报生成模型并存储,而预测流通过 A/B 测试和实时计算提供预测结果。
1.数据上报

搜集业务数据组成训练样本,通过收集、验证、清洗、转化等步骤,将数据转化为模型训练所需要的样本格式,保存到离线存储模块(Mysql、ES、NoSql)

2.离线训练

离线训练模块通常分为离线存储和离线计算两个部分。由于推荐系统需要处理大量用户行为数据,离线存储通常依赖分布式文件系统或存储平台来存储这些数据。离线计算包括样本抽样、特征工程、模型训练和相似度计算等操作,用于准备和训练推荐模型。

3.在线存储

在线服务对时延有着严格要求。例如,当用户打开手机APP时,他们希望能够迅速得到响应,如果等待时间过长,用户体验将受到影响。因此,推荐系统必须在几十毫秒内完成用户请求并返回推荐结果。为了满足这一需求,通常需要一个专门的在线存储模块(Mysql、ES、NoSql),来存储和提供实时访问的模型和特征数据(物品相似度矩阵、用户相似度矩阵等)。

4实时推荐

对来自业务的新请求进行预测,主要有三个步骤。1.获取用户特征;2调用推荐模型;3结果排序

由于物品列表过大,无法对所有商品进行复杂的打分,推荐系统通常将推荐过程分为召回和排序两个步骤。召回阶段从海量候选物品(如上百万个)中筛选出用户可能喜欢的若干个候选物品(通常是几百个)。排序阶段则对召回出来的较小候选集进行排序和打分。进一步地,在排序后,为了提高推荐的多样性或考虑运营需求,系统还会进行重排过滤,对最终的推荐列表进行优化处理。

5.A/B测试

对于互联网产品来说, A/B 测试基本上是一个必备的模块,对于推荐系统来说也不例外,它可以帮助开发人员评估新算法对客户行为的影响。除了 离线的指标外,一个新的推荐算法上线之前 般都会经过 A/B 测试来测试新算法的有效性。常见的指标有点击率、用户停留时间、 广告收入等,需要注意分析统计显著性。设计者需要从自己的产品角度出发,根据产品的需要制定评估指标,这样才能更好地指导推荐系统的优化方向。

2.2在线训练

对于业务而言,我们希望用户对上一个广告的反馈(例如喜欢、不喜欢、点击与否)能够迅速影响下一个广告的推荐结果。这就要求采用一种在线训练的方法。

在线训练的推荐系统架构特别适用于广告(抖音这种媒体流广告)、电商等需要处理高维度大数据且对实时性有较高要求的场景。与传统的离线训练系统不同,在线训练系统不将训练和测试分开,而是在每个交互回合中不断学习,并根据实时的用户反馈调整推荐策略。在线训练的一个重要特点是,样本、特征和模型的处理都需要实时完成,从而使推荐结果能够快速反映用户的即时喜好。同时,由于在线训练不需要保存所有的训练数据,它避免了大量离线存储的需求,因而具有更好的系统伸缩性,能够支持更大规模的数据量和模型。

流式训练:流式训练模块的核心作用是通过实时输入的训练样本不断更新模型。在推荐系统中,这种增量更新的计算方式可以通过流式计算来实现。在线训练的一个重要优势是,它支持模型的稀疏存储方式。在训练过程中,在线模型并不一定需要从头开始训练,而是可以利用离线训练获得的模型参数作为初始基础,在此基础上进行增量式的训练更新。

3.协同过滤算法

为了让推荐结果符合用户口味,我们需要深入了解用户。 实现个性化推荐的最理想情况是用户能主动告诉系统他喜欢什么,但是这个有很多缺陷。

基于用户行为分析 的推荐算法是个性化推荐系统的重要算法,学术界一般将这种类型的算法称为协同过滤算法(Collaborative Filtering Algorithm) 。协同过滤算法有很多模型。比如基于邻域的方法(neighborhood-based) 、隐语义模型(latent factor model)、基于图的随机游走算法(random walk on graph) 等。

最著名的、在业界得到最广泛应用的算法是基于邻域的方法,而基于邻域的方法主要包含下面两种算法:

  • 基于用户的协同过滤算法(User-based Collaborative Filtering),简称UserCF或UCF,这种算法给用户推荐和他兴趣相似的其他用户喜欢的物品。
  • 基于物品的协同过滤算法(Item-based Collaborative Filtering),简称ItemCF或ICF,这种算法给用户推荐和他之前喜欢的物品相似的物品。

基于用户推荐的示意图如下:

基于物品推荐示意图如下:

1.基于用户的协同过滤算法

在一个在线个性化推荐系统中,当一个用户A需要个性化推荐时,可以先找到和他有相似兴趣的其他用户,然后把那些用户喜欢的、而用户A没有听说过的物品推荐给A。这种方法称为基于用户的协同过滤算法。

基于用户的协同过滤算法主要包括两个步骤:

  1. 找到和目标用户A兴趣相似的用户集合。
  2. 找到这个集合中的用户喜欢的,且目标用户A没有听说过的物品推荐给目标用户。

举个例子:假设现在有三个用户A、B、C,已经知道A在看耐克和阿迪的鞋子,B在看匡威和Vans的鞋子,C在看耐克和彪马的鞋子,那么你说A和谁的兴趣相似度更高,自然是C。

那如何让机器思考A和谁的兴趣相似度更高呢?

在数学中,我们通过测量两个向量的夹角的余弦值来度量他们之间的相似性,两个向量指向完全相同时,相似度为1,两个向量夹角为90度时,余弦相似度为0。


<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> cos ⁡ ( θ ) = a ⋅ b ∣ a ∣ × ∣ b ∣ \Huge \cos(\theta) = \frac{a \cdot b}{|a| \times |b|} </math>cos(θ)=∣a∣×∣b∣a⋅b
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> cos ⁡ ( θ ) = x 1 y 1 + x 2 y 2 x 1 2 + x 2 2 ⋅ y 1 2 + y 2 2 \Huge \cos(\theta) = \frac{x_1 y_1 + x_2 y_2}{\sqrt{x_1^2 + x_2^2} \cdot \sqrt{y_1^2 + y_2^2}} </math>cos(θ)=x12+x22 ⋅y12+y22 x1y1+x2y2

推广到多维向量 <math xmlns="http://www.w3.org/1998/Math/MathML"> a ( a 1 , a 2 , a 3 , a 4..... ) , b ( b 1 , b 2 , b 3 , b 4..... ) a(a1,a2,a3,a4 . . . . .), b(b1,b2,b3,b4 . . . . .) </math>a(a1,a2,a3,a4.....),b(b1,b2,b3,b4.....)

理解了上述数学知识,我们就可以从其他层面计算业务上的各种相似度了,首先我们先给定两个用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i和 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j,令 <math xmlns="http://www.w3.org/1998/Math/MathML"> N ( i ) N(i) </math>N(i)表示 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 购买过的商品集合, <math xmlns="http://www.w3.org/1998/Math/MathML"> N ( j ) N(j) </math>N(j)表示 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j购买过的集合,那么 <math xmlns="http://www.w3.org/1998/Math/MathML"> ∣ N ( i ) ∩ N ( j ) ∣ |N(i) \cap N(j)| </math>∣N(i)∩N(j)∣就表示 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 、 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j都购买过的商品集合, <math xmlns="http://www.w3.org/1998/Math/MathML"> ∣ N ( i ) ∣ ∣ N ( j ) ∣ |N(i)| |N(j)| </math>∣N(i)∣∣N(j)∣就表示 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i或 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j购买过的商品的集合总数, <math xmlns="http://www.w3.org/1998/Math/MathML"> w i j w_ij </math>wij表示用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i和用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j的相似度。

用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i和用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j的相似度:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N i ∣ ∣ N j ∣ \large w_{ij}= \frac{|N(i) \cap N(j)|}{\sqrt{|N_i| |N_j|}} </math>wij=∣Ni∣∣Nj∣ ∣N(i)∩N(j)∣

我们来尝试计算下用户A和用户D之间的兴趣相似度:

从用户购买过的商品可以看出,用户A和用户D都购买过的商品只有商品D,也就是1个。用户A打开过的网页数=3,用户D打开过的网页数=3。所以A和D的相似度 <math xmlns="http://www.w3.org/1998/Math/MathML"> W A D = 1 3 ∗ 3 = 1 3 \large W_{AD}=\frac{1}{\sqrt{3*3}}=\frac{1}{3} </math>WAD=3∗3 1=31 。其他的计算也是类似的。

在得到用户之间的相似度之后,我们要做的就是解决步骤2的问题了,假设商品E是刚刚上架的商品,用户C和用户D都已经购买过了,那么如何计算用户A对新商品E的感兴趣程度呢?

得到用户之间的兴趣相似度后,UserCF算法会给用户推荐和他兴趣最相似的K个用户喜欢的物品。如下的公式度量了 UserCF 算法中用户 u 对物品的感兴趣程度:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> p ( u , i ) = ∑ v ∈ S ( u , K ) ∩ N ( i ) W u v r v i \large p(u,i)=\sum_{v\in{S(u,K)\cap{N(i)}}} {W_{uv}r_{vi}} </math>p(u,i)=v∈S(u,K)∩N(i)∑Wuvrvi

其中, <math xmlns="http://www.w3.org/1998/Math/MathML"> S ( u , K ) S(u,K) </math>S(u,K)包含和用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u兴趣最接近的 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K个用户, <math xmlns="http://www.w3.org/1998/Math/MathML"> N ( i ) N(i) </math>N(i)是对物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i有过行为的用户集合, <math xmlns="http://www.w3.org/1998/Math/MathML"> W ∗ u v W *{uv} </math>W∗uv是用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 和用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> v v </math>v 的兴趣相似度, <math xmlns="http://www.w3.org/1998/Math/MathML"> r ∗ v i r*{vi} </math>r∗vi代表用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> v v </math>v 对物品的兴趣,因为使用的是单一行为的隐反馈数据,所以所有的 <math xmlns="http://www.w3.org/1998/Math/MathML"> r v i = 1 r_{vi}=1 </math>rvi=1 。
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> p ( A , e ) = W A B ∗ R B e + W A C ∗ R C e + W A D ∗ R D e p(A,e)=W_{AB}*R_{Be}+W_{AC}*R_{Ce}+W_{AD}*R_{De} </math>p(A,e)=WAB∗RBe+WAC∗RCe+WAD∗RDe

其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> P ( A , e ) P(A,e) </math>P(A,e)表示A对e的兴趣度, <math xmlns="http://www.w3.org/1998/Math/MathML"> W ∗ A B W *{AB} </math>W∗AB表示A与B的相似度, <math xmlns="http://www.w3.org/1998/Math/MathML"> R ∗ B e R*{Be} </math>R∗Be表示B对e的兴趣度 ,以此类推。因为我们这里用的不是评分制,而是考虑是否听过这首歌,那么C听了e,C对e的兴趣度就是1,B没听过这首歌,所以B对e的兴趣度为0。

所以我们可以预测A对e的相似度为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> p ( A , e ) = 1 3 ∗ 2 ∗ 1 + 1 3 ∗ 3 ∗ 1 = 1 6 + 1 3 ≈ 0.74 p(A,e)=\frac{1}{\sqrt{3*2}}*1+\frac{1}{\sqrt{3*3}}*1=\frac{1}{\sqrt{6}}+\frac{1}{3}\approx0.74 </math>p(A,e)=3∗2 1∗1+3∗3 1∗1=6 1+31≈0.74

基于用户的协同过滤并不会这么简单,判断两个用户的相似程度也不是简简单单的使用余弦相似性就可以了,例如将我们将评估相似性的特征扩展到多维(即用户评分、购买记录、购物车记录),那么用户间的相似性方程就变成了:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> Sim ( A , B ) = ∑ i = 1 n ( R A i ⋅ R B i + P A i ⋅ P B i + C A i ⋅ C B i ) ∑ i = 1 n ( R A i 2 + P A i 2 + C A i 2 ) ⋅ ∑ i = 1 n ( R B i 2 + P B i 2 + C B i 2 ) \text{Sim}(A, B) = \frac{\sum_{i=1}^{n} (R_{Ai} \cdot R_{Bi} + P_{Ai} \cdot P_{Bi} + C_{Ai} \cdot C_{Bi})}{\sqrt{\sum_{i=1}^{n} (R_{Ai}^2 + P_{Ai}^2 + C_{Ai}^2)} \cdot \sqrt{\sum_{i=1}^{n} (R_{Bi}^2 + P_{Bi}^2 + C_{Bi}^2)}} </math>Sim(A,B)=∑i=1n(RAi2+PAi2+CAi2) ⋅∑i=1n(RBi2+PBi2+CBi2) ∑i=1n(RAi⋅RBi+PAi⋅PBi+CAi⋅CBi)

那么用户A对商品的感兴趣程度就成:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> R ^ u , i = ∑ v ∈ N u Sim ( u , v ) R v , i ∑ v ∈ N u ∣ Sim ( u , v ) ∣ \hat{R}{u, i} = \frac{\sum{v \in N_u} \text{Sim}(u, v) R_{v,i}}{\sum_{v \in N_u} |\text{Sim}(u, v)|} </math>R^u,i=∑v∈Nu∣Sim(u,v)∣∑v∈NuSim(u,v)Rv,i

这里 <math xmlns="http://www.w3.org/1998/Math/MathML"> R v , i R_{v,i} </math>Rv,i表示对商品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i的评分并对结果进行了归一化处理,同时也说明相似性方程和评分预测方程的多样性,需要与自身业务进行紧密的结合,并选取合适的特征数据和协同过滤算法。

2.基于物品的协同过滤算法

基于用户的协同过滤算法主要包括两个步骤:

  1. 计算内容之间的相似度。
  2. 根据内容的相似度和用户的历史行为给用户生成推荐列表。
1.确定计算相似度的公式

很显然,步骤(1)的关键就是计算两个内容之间的相似度
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> w i j = ∣ N ( i ) ∩ N ( j ) ∣ ∣ N i ∣ ∣ N j ∣ \large w_{ij}= \frac{|N(i) \cap N(j)|}{\sqrt{|N_i| |N_j|}} </math>wij=∣Ni∣∣Nj∣ ∣N(i)∩N(j)∣

这里,分母 <math xmlns="http://www.w3.org/1998/Math/MathML"> ∣ N ( i ) ∣ |N(i)| </math>∣N(i)∣是喜欢物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i的用户数,而分子 <math xmlns="http://www.w3.org/1998/Math/MathML"> ∣ N ( i ) ∩ N ( j ) ∣ |N(i) \cap N(j)| </math>∣N(i)∩N(j)∣是同时喜欢物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i和物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j的用户数。因此,上述公式可以理解为喜欢物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i的用户中有多少比例的用户也喜欢物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j。

从上述定义可以看出,协同过滤的核心思想是,两个物品之所以会有相似度,是因为它们被许多相同的用户喜欢。换句话说,用户的历史兴趣列表对物品的相似度起到了"贡献"作用。在这个过程中,存在一个假设:每个用户的兴趣通常是集中在少数几个领域或类别中的。因此,如果两个物品出现在同一个用户的兴趣列表中,这意味着它们可能属于该用户的某个兴趣领域。而如果这两个物品同时出现在多个用户的兴趣列表中,那么它们很有可能属于相同的兴趣领域,因此它们之间的相似度也会更高。
2.建立相似度矩阵并计算相似度
和 UserCF 算法类似,用ItemCF算法计算物品相似度时也可以首先建立用户-物品倒排表(即对每个用户建立一个包含他喜欢的物品的列表),然后对于每个用户,将他物品列表中的物品两两在共现矩阵 C 中加 1。

在这个例子中,首先我们有一组用户行为数据,其中每一行代表一个用户感兴趣的物品集合。接着,我们对每一对物品进行组合,生成一个矩阵,记录的是每对物品同时被同一个用户喜欢的次数。将所有这些组合矩阵相加后,我们得到一个矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> C C </math>C,其中C[i](#)表示同时喜欢物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i和物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j的用户数量。接下来,我们对矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> C C </math>C进行归一化处理,以计算物品之间的余弦相似度 矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> W W </math>W。余弦相似度的计算方法可以参考上一篇的介绍,最终通过这个相似度矩阵,我们能够衡量不同物品之间的相似程度。简单来说,归一化的作用是将物品间的共同喜好程度标准化,从而得到一个更客观、更准确的物品相似度度量。

3.推荐物品

在得到物品之间的相似度后,ItemCF通过如下公式计算用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u对一个物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j的兴趣:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> p ( u , j ) = ∑ i ∈ S ( j , K ) ∩ N ( u ) W i j r u i \large p(u,j)=\sum_{i\in{S(j,K)\cap{N(u)}}} {W_{ij}r_{ui}} </math>p(u,j)=i∈S(j,K)∩N(u)∑Wijrui

这里 <math xmlns="http://www.w3.org/1998/Math/MathML"> N ( u ) N(u) </math>N(u)是用户喜欢的物品的集合, <math xmlns="http://www.w3.org/1998/Math/MathML"> S ( j , K ) S(j,K) </math>S(j,K)是和物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j最相似的 <math xmlns="http://www.w3.org/1998/Math/MathML"> K K </math>K个物品的集合, <math xmlns="http://www.w3.org/1998/Math/MathML"> W i j W_ij </math>Wij是物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i和 <math xmlns="http://www.w3.org/1998/Math/MathML"> j j </math>j 的相似度, <math xmlns="http://www.w3.org/1998/Math/MathML"> r u i r_{ui} </math>rui是用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u对物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i的兴趣。

该公式的含义是,和用户历史上感兴趣的物品越相似的物品,越有可能在用户的推荐列表中获得比较高的排名。

举个例子

上图是一个基于内容推荐的简单例子。该例子中,用户喜欢商品m和商品n。然后ItemCF会在候选集中为这两个商品分别找出和它们最相似的3个商品,然后根据公式的定义计算用户对每个商品的感兴趣程度。比如,ItemCF给用户推荐商品B,是因为个商品和商品m相似,相似度为0.5,而且这个商品也和商品n相似,相似度是0.5。考虑到用户对商品m的兴趣度是1.2,对商品n的兴趣度是0.8,那么用户对商品B的兴趣度就是1.2 × 0.5 + 0.8×0.5 = 0.92。

3.UserCF与ItemCF算法的比较

UseCF ItemCF
性能 适合于用户数量较小的场景,如果用户很多,则计算用户之间相似度矩阵的代价很大 适用于物品数量明显小于用户数量的场景,如果物品很多,则计算物品之间相似度矩阵的代价很大
领域 时效性较强,用户个性化兴趣不太明显的领域 长尾物品丰富,用户个性化需求强烈的领域
实时性 用户的新行为不一定导致推荐结果的立即变化 用户的新行为一定会导致推荐结果的实时变化
冷启动 当新用户对很少量的物品产生行为后,不能立即对他进行推荐,因为用户相似度表一般是每隔一段时间离线计算的。 当新物品上线后,一旦有某个用户对该物品产生行为,就可以将该物品推荐给与该用户相似的其他用户 新用户只要对一个物品产生行为,就可以向他推荐与该物品相似的其他物品 必须在更新了物品相似度表(离线)之后,才能将新的物品推荐给其他用户
推荐理由 很难提供令用户信服的推荐解释 利用用户的历史行为来作为推荐理由,容易令用户信服

4.特征数据

训练推荐模型时,首先需要收集用户的行为数据,并基于这些数据生成特征向量,然后使用这些特征向量进行模型训练。特征向量由特征及其权重组成,计算过程中需要考虑多个因素,以确保最终的模型能够准确捕捉用户的兴趣和偏好。以下是几个关键因素的解释:

  1. 用户行为类型:在一个网站或平台中,用户的行为种类繁多。例如,用户可能会浏览、点击、收藏、评价、购买、评论、标签物品,或与朋友分享,甚至进行搜索。这些行为对物品特征的影响程度不同。通常,用户花费更多时间或精力的行为(如购买或评价)比其他行为(如浏览)更能反映用户的真实兴趣,因此可以赋予更高的权重。

  2. 行为发生的时间:通常,用户的近期行为对推荐的影响更大,因为它更能反映用户当前的兴趣偏好。而较早的行为相对重要性较低。举个例子,如果用户最近购买了某个商品,那么这个商品的特征权重应该比用户在很久之前购买的商品更高。

  3. 行为的频率:如果用户频繁对某个物品进行某种行为(比如多次收听某首歌或观看某部电影),则该物品的特征权重应相应增加。频繁的行为意味着用户对该物品的兴趣较高,因此其特征会更加突出。

  4. 物品的流行程度:对于热门物品,用户的行为可能更多是随大流,无法准确反映其个性化需求。因此,当用户与热门物品产生交互时,推荐系统通常会降低这些物品特征的权重。相反,用户对不太流行或小众物品的行为更能体现其独特偏好,推荐系统会倾向于增加这些物品的特征权重。

  5. 数据去噪:在训练过程中,必须对数据进行去噪处理,剔除那些不真实或有误导性的数据。例如,刷单、虚假行为等数据可能会严重影响模型训练效果,因此需要识别并去除这些数据。此外,对于缺失值的处理也至关重要。

  6. 正负样本平衡:用户行为数据往往偏向正样本(用户有行为的物品),这会导致数据严重不平衡。为了克服这个问题,通常需要从用户没有行为的物品中采样出负样本,并确保正负样本的比例相对均衡,以避免模型偏向预测正样本。

  7. 特征的组合与交叉:在推荐系统中,不同特征之间可能存在复杂的关系。例如,酒店的销量、价格和用户的消费水平可能是高度相关的,而用户的年龄或地理位置可能与这些特征的相关性较弱。特征抽取的关键在于从各种原始数据中识别出具有预测能力的特征,并将其转换为数值形式。常见的统计特征包括:计数特征(如浏览次数、购买次数)、比率特征(如点击率、转化率)、以及统计量特征(如价格的均值、标准差等)。

    通过这些因素的综合考虑,我们可以更准确地构建用户行为特征,并训练出能够精准推荐物品的模型。

5.总结

本文简要介绍了推荐系统的基本架构、协同过滤算法的原理,并回顾了余弦相似性等基础数学概念,为你提供了推荐算法的初步了解。然而,在实际的企业级应用中,单纯依赖余弦相似性通常不足以精确地衡量物品间的相似度。针对不同的实际需求和场景,推荐算法往往需要进行更复杂的处理,如内容相似度的归一化、加权等,同时,现代推荐算法也逐步引入了深度学习技术。由于这些细节较为复杂,本文并未深入探讨,建议参考相关领域的文献来获得更全面的理解。

相关推荐
液态不合群21 分钟前
使用Python实现两组数据纵向排序
开发语言·python·算法
liuqun03191 小时前
LeetCode-Golang之【5. 最长回文子串】
算法·leetcode·golang
robin_suli1 小时前
穷举vs暴搜vs深搜vs回溯vs剪枝专题一>子集
算法·dfs·剪枝·回溯
听风吹等浪起1 小时前
改进系列(6):基于DenseNet网络添加TripletAttention注意力层实现的番茄病害图像分类
网络·人工智能·神经网络·算法·分类
在西湖雾雨中起舞1 小时前
题目 1738: 排序
算法
在西湖雾雨中起舞1 小时前
题目 2794: 求平均年龄
数据结构·c++·算法
呆呆在发呆.2 小时前
数据结构复习总结(期末前更新)
数据结构·c++·算法·链表·贪心算法·柔性数组
cloud___fly2 小时前
力扣hot100——双指针
数据结构·算法·leetcode·贪心算法
工一木子3 小时前
【Leecode】Leecode刷题之路第82天之删除排序链表中的重复元素II
java·数据结构·算法·leetcode·链表
一只小灿灿3 小时前
计算机视觉中的图像滤波与增强算法
人工智能·算法·计算机视觉