经典推荐算法——矩阵分解的原理与实践

对比 CF 与 MF

CF:Collaborative Filtering(协同过滤)

MF:Matrix Factorization(矩阵分解)

算法图示

  • 基于用户的协同过滤原理图:

如图所示,基于用户的协同过滤算法找到用户可能喜欢的视频的方式很直观,就是利用用户的观看历史,找到跟目标用户 Joe 看过同样视频的相似用户,然后找到这些相似用户喜欢看的其他视频,推荐给目标用户 Joe。系统通过识别相似用户的喜好模式来推荐电影,这种相似性是通过他们共同喜欢的电影来衡量的。

  • 基于物品的协同过滤原理图:

基于物品的协同过滤的核心思想是:如果一个用户购买(或喜欢)了一件物品,那么他们很可能也会购买(或喜欢)与之相似的其他物品。物品的相似性是根据所有用户的购买和评分数据来确定的。这种推荐系统的优点是它不需要考虑用户之间的相似性,而是集中于物品的特征和用户与物品之间的互动。

  • 矩阵分解效果图:

矩阵分解算法则是期望为每一个用户和视频生成一个隐向量,将用户和视频定位到隐向量的表示空间上(如图所示),距离相近的用户和视频表明兴趣特点接近,在推荐过程中,我们就应该把距离相近的视频推荐给目标用户。例如,如果希望为图中的用户 Dave 推荐视频,我们可以找到离 Dave 的用户向量最近的两个视频向量,它们分别是《Ocean's 11》和《The Lion King》,然后我们可以根据向量距离由近到远的顺序生成 Dave 的推荐列表。


总结

  • MF 既可以用于评分数据这种显示反馈行为,也适用与点击这种隐式反馈行为;
  • 经典的协同过滤(CF)使用的共现矩阵很稀疏,比如基于物品的协同过滤中构造的物品与物品的共现矩阵,可以想象热门的物品会有很多人同时点,而冷门的物品很少有人点,造成的后果是很多冷门的物品都会跟热门的物品相似(实际上不是),导致推荐结果向热门物品倾斜(实践中的推荐曝光量对比见下图);
    • 左边是随机推荐,箱体很高,说明大部分的曝光量是在一个很高的水平上,由于现阶段其他算法比较弱,在用户消费完这两种算法推荐的物品后,会由随机推荐补充,所以随机推荐的曝光量远高于其他两种算法。
    • 中间是基于物品的协同过滤推荐(itemcf),中位数线低于其他两种推荐,表明大多数据点集中在一个较小的范围内。然而,它的曝光量之间的差异很大,尤其是上方存在不少的极端值,说明存在一些极端的高曝光量值,有些物品的曝光特别少,有些物品的曝光特别多。
    • 右边是基于内容推荐,中位数线低于随机推荐高于 itemcf,箱体高度介于其他两种算法,表明所推荐的物品的曝光量分布比较均匀,没有极端的异常值,只有一两个曝光特别少的物品。
      基于物品的协同过滤只推荐热门的物品好不好?有好有坏,物品热门说明该物品质量不错受到绝大多数人的欢迎,但是对于长尾的用户更个性化的需求不是很友好,而且从点击率和购买转化率上看,itemcf 并没有好过内容推荐。
  • 两者使用的共现矩阵不同,基于用户的 CF 是使用用户与用户之间的共现矩阵,基于物品的协同过滤是使用物品与物品之间的共现矩阵;
  • 由于矩阵分解(MF) 实际上是对数据进行全局拟合,所以比 CF 具有更好的泛化能力;
  • CF 只能从交互过的物品中找到相似的物品进行推荐,所以交互行为少的用户的推荐列表会很少,而 MF 则不存在这个问题,由于 MF 是对数据进行全局拟合,所以实际上 MF 可以为所有物品计算出一个推荐分数进行排序推荐;
  • MF 生成的用户与物品的隐向量广义上可视为深度学习中的 embedding,比较抽象,可解释性比 CF 较弱;

MF 所需数据

原始算法所需数据:这里使用 user 与 item 的隐式反馈数据(点击)。

user_id group_id click_count latest_click_time
User 1 Group A 1 2023-07-01 20:51:41.822
User 2 Group A 1 2023-01-29 21:03:01.974
User 2 Group C 1 2023-09-11 08:43:26.569
User 3 Group B 1 2023-03-14 23:30:16.112
User 4 Group A 2 2023-09-21 08:43:26.569
User 5 Group C 2 2023-07-21 08:43:26.569
User 5 Group B 1 2023-10-14 23:30:16.112

基础的 MF 算法需要前两列数据:user_id 和 group_id,其他是进阶版本所需的数据(click_count 代表点击次数,latest_click_time 表示最近一次点击时间)。

将其转换为用户与物品的共现矩阵:

User Group A Group B Group C
User 1 1
User 2 1 1
User 3 1
User 4 1
User 5 1 1

基于物品的协同过滤推荐中使用的共现矩阵是基于物品与物品的,跟矩阵分解略有不同,根据上述点击数据构造的共现矩阵为如下。

该矩阵表示了不同物品组(Group A, Group B, Group C)之间的共现次数。例如,Group A 和 Group C 之间的共现次数是 1,意味着有 1 个用户同时点击了 Group A 和 Group C 的物品。同样,Group B 和 Group C 之间的共现次数也是 1,表示有 1 个用户同时点击了 Group B 和 Group C 的物品。矩阵中的 0 表示没有用户同时点击对应的两个物品组。

Group A Group B Group C
Group A 0 0 1
Group B 0 0 1
Group C 1 1 0

原理

矩阵分解核心思想是将原始的交互矩阵分解为两个低秩矩阵的乘积,分别代表用户和物品的潜在特征。通过这种分解,算法可以在用户和物品的潜在特征空间内计算它们之间的相似度,进而预测用户对未知物品的偏好程度。

MF 算法基于用户对物品的评分数据,假设有一个 user-item 评分矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> R R </math>R ,其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> R u i R_{ui} </math>Rui 表示 user <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 对 item <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 的评分。矩阵分解的目标是找到两个低秩矩阵 <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 R </math>R。 <math xmlns="http://www.w3.org/1998/Math/MathML"> U U </math>U 是一个 user 潜在特征矩阵,其中每一行 <math xmlns="http://www.w3.org/1998/Math/MathML"> U u U_u </math>Uu 代表 user <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 是一个 item 潜在特征矩阵,其中每一行 <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 代表物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 的潜在特征向量。模型通过最小化观察到的评分和预测评分之间的差异来学习这些潜在特征向量。

MF 除了使用用户主动对物品评分这种显式数据外,还可以使用上述是否点击这种隐式数据,相比与显式反馈数据,隐式反馈数据更加普遍。


实现步骤

  1. 初始化:随机初始化 user 潜在特征矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> U U </math>U 和 item 潜在特征矩阵 <math xmlns="http://www.w3.org/1998/Math/MathML"> V V </math>V。
  2. 优化:使用随机梯度下降(SGD)或交替最小二乘法(ALS) 算法送代更新 <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"> V V </math>V 计算出的预测评分之间差异的平方和,可能还会加上正则化项来防止过拟合。

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> min ⁡ U , V ∑ ( u , i ) ∈ Ω ( R u i − U u V i T ) 2 + λ ( ∥ U u ∥ 2 2 + ∥ V i ∥ 2 2 ) \begin{equation} \min_{U,V} \sum_{(u,i) \in \Omega} \left( R_{ui} - U_{u} V_{i}^T \right)^2 + \lambda \left( \|U_u\|_2^2 + \|V_i\|_2^2 \right) \end{equation} </math>U,Vmin(u,i)∈Ω∑(Rui−UuViT)2+λ(∥Uu∥22+∥Vi∥22)

其中 <math xmlns="http://www.w3.org/1998/Math/MathML"> Ω \Omega </math>Ω 是所有已知评分的集合, <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ 是正则化参数,用于控制过拟合。

  1. 预测:优化完成后,对于一个用户 <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,可以通过计算 <math xmlns="http://www.w3.org/1998/Math/MathML"> U u U_u </math>Uu 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> V v V_v </math>Vv 的点积来预测 <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 的评分。
    <math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> R ^ u i = U u V i T \begin{equation} \hat{R}{ui} = U{u} V_{i}^T \end{equation} </math>R^ui=UuViT

使用隐向量(latent factor)表示 user 与 item,其实与深度学习的 embedding 的思想一样。

Q1:矩阵分解对评分数据与点击数据采用的 loss 函数是一样的吗?

矩阵分解是推荐系统中常用的技术,用于发现用户和物品之间的隐含关系。在应用矩阵分解时,可以根据具体的数据类型(如评分数据或点击数据)和任务目标选择不同的损失函数(loss function)。评分数据和点击数据在性质上有所不同,因此通常会采用不同的损失函数来优化模型。

评分数据: 评分数据通常是显式反馈,如用户对电影的评分(1 到 5 星等)。在处理评分数据时,矩阵分解模型通常采用的损失函数是均方误差(Mean Squared Error, MSE)或均方根误差(Root Mean Squared Error, RMSE)。这些损失函数能够衡量模型预测评分和实际评分之间的差异,目标是最小化这些差异。

点击数据: 点击数据通常是隐式反馈,表示用户的行为而非直接的偏好评价。在处理点击数据时,矩阵分解模型可能会采用不同于评分数据的损失函数,如交叉熵损失(Cross-Entropy Loss)或对数似然损失(Log-Likelihood Loss)。这些损失函数适合于处理分类或二值化问题(用户点击或未点击某物品),目标是最大化模型预测用户行为的准确性。

特殊情况: 除了上述常见的损失函数外,还有一些特定的优化方法和损失函数可以同时考虑评分数据和点击数据,例如加权交替最小二乘法(Weighted Alternating Least Squares, WALS)等。此外,一些研究工作会探索自定义的损失函数,以更好地适应特定的推荐系统任务和数据特性。

Q2:采用加权交替最小二乘法时,无论是评分数据还是点击数据,都可以用以下的 loss 函数吗:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> min ⁡ U , V ∑ ( u , i ) ∈ Ω ( R u i − U u V i T ) 2 + λ ( ∥ U u ∥ 2 2 + ∥ V i ∥ 2 2 ) \begin{equation} \min_{U,V} \sum_{(u,i) \in \Omega} \left( R_{ui} - U_{u} V_{i}^T \right)^2 + \lambda \left( \|U_u\|_2^2 + \|V_i\|_2^2 \right) \end{equation} </math>U,Vmin(u,i)∈Ω∑(Rui−UuViT)2+λ(∥Uu∥22+∥Vi∥22)

是的,加权交替最小二乘法(Weighted Alternating Least Squares, WALS)是一种特别适用于包括评分数据和点击数据在内的隐式反馈数据的矩阵分解方法。在 WALS 中,使用的损失函数确实可以是你提到的形式,不过通常会对未观测到的条目(即用户未进行评分或点击的条目)引入一个权重因子,以区分观测到的和未观测到的反馈。

这个损失函数包含两个主要部分:

  • 第一部分是重建误差,它衡量了实际观测到的用户-物品交互(评分或点击)与通过用户和物品潜在因子向量乘积预测出的交互之间的误差平方和。 <math xmlns="http://www.w3.org/1998/Math/MathML"> Ω \Omega </math>Ω 表示所有已知的用户-物品交互对的集合, <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 的实际评分或点击指示, <math xmlns="http://www.w3.org/1998/Math/MathML"> U u U_u </math>Uu 是用户 <math xmlns="http://www.w3.org/1998/Math/MathML"> u u </math>u 的潜在因子向量, <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_i </math>Vi 是物品 <math xmlns="http://www.w3.org/1998/Math/MathML"> i i </math>i 的潜在因子向量。
  • 第二部分是正则化项,用于防止过拟合,通过对用户和物品的潜在因子向量的 L 2 范数进行惩罚。 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ 是正则化参数,控制了正则化项的强度。

对于未观测到的交互,可以通过引入一个权重 <math xmlns="http://www.w3.org/1998/Math/MathML"> w u i w_{ui} </math>wui 来调整损失函数,使其变为:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> min ⁡ U , V ∑ ( u , i ) ∈ Ω w u i ( R u i − U u V i T ) 2 + λ ( ∥ U u ∥ 2 2 + ∥ V i ∥ 2 2 ) \min_{U,V} \sum_{(u,i) \in \Omega} w_{ui} \left( R_{ui} - U_{u} V_{i}^T \right)^2 + \lambda \left( \|U_u\|_2^2 + \|V_i\|_2^2 \right) </math>U,Vmin(u,i)∈Ω∑wui(Rui−UuViT)2+λ(∥Uu∥22+∥Vi∥22)

其中, <math xmlns="http://www.w3.org/1998/Math/MathML"> w u i w_{ui} </math>wui 是一个权重,用于区分观测到的交互(例如,用户实际点击的物品)和未观测到的交互(例如,用户未点击的物品)。这样,即使是对于未观测到的用户-物品对,模型也能通过调整权重 <math xmlns="http://www.w3.org/1998/Math/MathML"> w u i w_{ui} </math>wui 来适当考虑它们,从而更好地学习用户和物品的潜在特征。

通过这种方式,WALS 可以有效地处理隐式反馈数据,无论是评分数据还是点击数据,提供了一种灵活的框架来建模用户的偏好和物品的属性。

Q3:为什么通过向 WALS 的 loss 函数添加置信度,就可以适用于隐式反馈行为如点击? 也就是说尽管使用的是隐式反馈的 binary 表示的数据,但是 loss 函数不是按照分类任务的 loss 函数一样使用 Cross-Entropy Loss,更多是考虑到推荐场景中未记录到的隐式反馈不代表就是负样本,所以这里跟一般的分类任务的 loss 函数选择才不一样吗?

是的,你的理解是正确的。在推荐系统中,特别是当处理隐式反馈数据(如点击、浏览等行为)时,传统的分类任务中常用的损失函数,如交叉熵损失(Cross-Entropy Loss),可能并不完全适合。这主要是因为隐式反馈数据具有其特有的性质和挑战,其中最显著的两个问题是:

  1. 正负样本的不明确性:在隐式反馈场景中,我们通常只有正样本(即用户实际进行的行为,如点击一个项目)。相反,没有明确的负样本(即用户没有对项目进行点击并不一定意味着用户不喜欢该项目)。这与显式反馈(如评分)不同,在显式反馈中,用户提供了明确的喜好指示。

  2. 数据的不均衡性:在隐式反馈数据中,未发生的事件(用户未与之互动的物品)通常远远多于发生的事件(用户实际点击或互动的物品)。直接将未发生的事件视为负样本会导致极度的样本不平衡问题。

通过向 WALS 的损失函数添加置信度权重,可以有效地缓解这些问题:

  • 置信度权重:对于每一个用户-物品对,都分配一个置信度权重,这个权重反映了我们对该用户对该物品偏好强度的信心。如果用户与某个物品有互动(如点击),则该用户-物品对的置信度较高;反之,如果没有互动,置信度权重较低,但不是零。这样,即使将未互动的用户-物品对纳入模型训练,其对损失函数的影响也较小,这反映了"未互动不意味着不喜欢"的假设。

  • 处理未记录的隐式反馈:通过这种方式,模型可以学习到用户的偏好,即使对于那些用户没有明确反馈的物品。这种方法比起简单地将所有未互动的事件视为负样本,更能准确地捕捉用户的潜在偏好。

因此,通过在 WALS 模型中使用加权的损失函数,可以更好地处理隐式反馈数据的特性,尤其是考虑到未记录的事件可能代表用户未发现的潜在兴趣,而不仅仅是用户的负面反馈。这种方法使得模型能够在没有明确负反馈的情况下,更加准确和灵活地推断用户的潜在偏好。


优化(训练)过程

ALS 在每一步固定 <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 中的一个,然后解决另一个的最优化问题。通过交替进行,逐步减少预测误差,直至收敛。在固定一个矩阵时,可以通过解析方法直接求解另一个矩阵的最优解,这是 ALS 区别于 SGD 的一个重要特征。

交替最小二乘法(ALS)比随机梯度下降(SGD)更适合的场景:

While in general stochastic gradient descent is easier and faster than ALS, ALS is favorable in at least two cases.
The first is when the system can use parallelization . In ALS, the system computes each independently of the other item factors and computes each independently of the other user factors. This gives rise to potentially massive parallelization of the algorithm.
The second case is for systems centered on implicit data. Because the training set cannot be considered sparse, looping over each single training case---as gradient descent does---would not be practical. ALS can efficiently handle such cases.
在考虑隐性数据和处理稀疏矩阵的情况下,交替最小二乘法(ALS)通常被认为比随机梯度下降(SGD)更适合。这是因为 ALS 在每次迭代中固定一个矩阵来解另一个矩阵的最优化问题,这种方法在处理稀疏数据时能够更有效地推断出缺失的数据。

对于包含大量稀疏数据的推荐系统(尤其是处理隐性反馈数据,如点击、浏览而非显式评分的场景),ALS 算法可以更好地处理这些稀疏性,因为它通过交替固定用户或物品的特征向量来逐步优化目标函数,从而减少对稀疏数据直接操作的需要。此外,ALS 可以更容易地并行化处理,这对于大规模和高度稀疏的数据集来说是一个重要优势。

而 SGD 在每次迭代中只根据一个或一小批样本更新参数,可能会受到稀疏数据中的噪声的影响更大,且在隐性反馈的场景下,难以直接应用于未观察到的数据(即稀疏矩阵中的缺失值),因为 SGD 需要遍历每一个样本进行更新,而在高度稀疏的数据中,这意味着大量的缺失值需要被合理地处理或估计,这可能会导致算法效率低下或难以收敛。

因此,ALS在处理包含隐性反馈的稀疏矩阵上具有优势。

Q4:pyspark 中使用的 ALS 在处理点击数据和其他隐式反馈数据的时候,是不是就是这种加权交替最小二乘法?

是的,PySpark 中的 ALS (Alternating Least Squares) 算法在处理点击数据和其他隐式反馈数据时采用的是加权交替最小二乘法 (Weighted Alternating Least Squares, WALS) 的变体。这种方法通过引入置信度(confidence)权重来区分用户的不同交互强度,特别是在处理隐式数据(如点击、浏览等行为)时,这种方法比传统的 ALS 更为有效。

在隐式反馈场景中,ALS 的目标函数确实可以表示为你提供的形式,但它会包含一个权重系数,以反映用户对物品的偏好强度。具体来说,对于隐式反馈,目标函数通常修改为考虑置信度权重 <math xmlns="http://www.w3.org/1998/Math/MathML"> C u i C_{ui} </math>Cui,如下所示:
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> min ⁡ U , V ∑ ( u , i ) ∈ Ω C u i ( R u i − U u V i T ) 2 + λ ( ∥ U u ∥ 2 2 + ∥ V i ∥ 2 2 ) \min_{U,V} \sum_{(u,i) \in \Omega} C_{ui} \left( R_{ui} - U_{u} V_{i}^T \right)^2 + \lambda \left( \|U_u\|_2^2 + \|V_i\|_2^2 \right) </math>U,Vmin(u,i)∈Ω∑Cui(Rui−UuViT)2+λ(∥Uu∥22+∥Vi∥22)

这里, <math xmlns="http://www.w3.org/1998/Math/MathML"> C u i C_{ui} </math>Cui 是一个置信度权重,表示我们对用户 <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 的偏好强度的信心。通常, <math xmlns="http://www.w3.org/1998/Math/MathML"> C u i C_{ui} </math>Cui 基于用户的交互行为来设置,例如,更频繁的点击会导致更高的置信度权重。 <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 的隐式反馈,例如点击或购买,而不是显式的评分值。 <math xmlns="http://www.w3.org/1998/Math/MathML"> λ \lambda </math>λ 是正则化参数,用于控制模型的过拟合。 <math xmlns="http://www.w3.org/1998/Math/MathML"> Ω \Omega </math>Ω 是所有已知用户-物品交互的集合。 <math xmlns="http://www.w3.org/1998/Math/MathML"> U u U_{u} </math>Uu 和 <math xmlns="http://www.w3.org/1998/Math/MathML"> V i V_{i} </math>Vi 分别是用户 <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 的特征向量。

PySpark 的 ALS 实现允许用户指定是否将数据视为显式反馈(如评分)还是隐式反馈(如点击),并且提供了相应的参数来调整模型以适应不同类型的数据。当处理隐式反馈数据时,PySpark 的 ALS 模型通过使用这种加权方案来更好地捕获用户偏好,从而提高推荐系统的性能。


进阶版目标函数

在矩阵分解的基础目标函数上,还有其他各种变体,加入了不同的特征,从而使得模型更加贴近现实,使其泛化的能力更强。

  • 加入 biases:

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> r ^ u i = μ + b i + b u + q i T p u \begin{equation} \hat{r}{ui} = \mu + b_i + b_u + q_i^T p_u \end{equation} </math>r^ui=μ+bi+bu+qiTpu
<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> min ⁡ p ∗ , q ∗ , b ∗ ∑ ( u , i ) ∈ κ ( r u i − μ − b u − b i − p u T q i ) 2 + λ ( ∥ p u ∥ 2 2 + ∥ q i ∥ 2 2 + b u 2 + b i 2 ) \begin{equation} \min
{p^*,q^*,b^*} \sum_{(u,i) \in \kappa} (r_{ui} - \mu - b_u - b_i - p_u^T q_i)^2 + \lambda \left( \| p_u \|_2^2 + \| q_i \|_2^2 + b_u^2 + b_i^2 \right) \end{equation} </math>p∗,q∗,b∗min(u,i)∈κ∑(rui−μ−bu−bi−puTqi)2+λ(∥pu∥22+∥qi∥22+bu2+bi2)

  • 加入其他:

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> r ^ u i = μ + b u + b i + q i T ( p u + ∣ N ( u ) ∣ − 0.5 ∑ j ∈ N ( u ) x j + ∑ a ∈ A ( u ) y a ) \begin{equation} \hat{r}{ui} = \mu + b_u + b_i + q_i^T\left(p_u + |N(u)|^{-0.5} \sum{j \in N(u)} x_j + \sum_{a \in A(u)} y_a\right) \end{equation} </math>r^ui=μ+bu+bi+qiT pu+∣N(u)∣−0.5j∈N(u)∑xj+a∈A(u)∑ya

  • 加入时间衰减:

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> r ^ u i ( t ) = μ + b i ( t ) + b u ( t ) + q i T p u ( t ) \begin{equation} \hat{r}_{ui}(t) = \mu + b_i(t) + b_u(t) + q_i^T p_u(t) \end{equation} </math>r^ui(t)=μ+bi(t)+bu(t)+qiTpu(t)

  • 对待隐式反馈数据:

<math xmlns="http://www.w3.org/1998/Math/MathML" display="block"> min ⁡ p ∗ , q ∗ , b ∗ ∑ ( u , i ) ∈ K c u i ( r u i − μ − b u − b i ) 2 − p u T q i 2 + λ ( ∥ p u ∥ 2 + ∥ q i ∥ 2 + b u 2 + b i 2 ) \begin{equation} \min_{p^*,q^*,b^*} \sum_{(u,i)\in K} c_{ui} (r_{ui} - \mu - b_u - b_i)^2 - p_u^T q_i^2 + \lambda (\| p_u \|^2 + \| q_i \|^2 + b_u^2 + b_i^2) \end{equation} </math>p∗,q∗,b∗min(u,i)∈K∑cui(rui−μ−bu−bi)2−puTqi2+λ(∥pu∥2+∥qi∥2+bu2+bi2)


实验

离线评估方式

两种离线评估方式:

方便起见,这里采用传统的离线评估方式,但是对训练与测试数据进行了时间切割,避免引入"未来信息",即如果我们在 t 时刻进行模型预测,那么 t+1 时刻的信息就是未来信息。在构建特征工程的时候,我们要避免引入"未来信息"。

为了防止这类"信息穿越"导致的模型作弊现象发生,我们一般会使用时间切割的方案去划分训练集和测试集,它的做法很简单。比如,你一共处理了 30 天的样本,从第 25 天末开始切割,前 25 天的样本作为训练集,后 5 天的样本作为测试集,这样我们就从根源上切断了引入"未来信息"的可能。当然切割的比例到底如何,也需要根据你的实践来定,一般来说我们控制训练集跟测试集的比例在 3:1 到 10:1 之间,比例太小训练样本不够,比例太大测试结果不够稳定。

实验结果

实验项目 推荐命中个数 Recall Precision F1-score
普通 itemCF 893 0.0346 0.0147 0.0206
ItemCF+点击次数 898 0.0348 0.0147 0.0207
ItemCF+log (点击次数) 889 0.0345 0.0146 0.0205
ItemCF+时间衰减 893 0.0346 0.0147 0.0206
矩阵分解(MF) 925 0.0359 0.0152 0.0214

参考

相关推荐
“JB...One”几秒前
openssl-AES-128-CTR加解密结构体
linux·数据结构·算法·ssl
爱数模的小云2 分钟前
【华为杯】2024华为杯数模研赛D题 解题思路
算法·华为
好记性+烂笔头36 分钟前
hot100-438. 找到字符串中所有字母异位词
算法
六点半8881 小时前
【C/C++】速通涉及string类的经典编程题
c语言·开发语言·c++·算法
学地理的小胖砸2 小时前
【高分系列卫星简介】
开发语言·数码相机·算法·遥感·地理信息
yanyanwenmeng3 小时前
matlab基础
开发语言·算法·matlab
##晴天小猪3 小时前
ByteTrack多目标跟踪流程图
人工智能·算法·目标检测·机器学习·目标跟踪
ly-how3 小时前
leetcode练习 二叉树的层序遍历
算法·leetcode
疑惑的杰瑞3 小时前
[数据结构]算法复杂度详解
c语言·数据结构·算法
大油头儿3 小时前
排序算法-选择排序
数据结构·算法·排序算法