1.协同过滤
协同过滤分为基于用户的协同过滤,基于物品的协同过滤,基于模型的协同过滤。
1.1 基于用户的协同过滤
-
先计算用户a与其他用户b,c,d的余弦相似度b1,c1,d1。
-
用户的余弦相似度计算方法为:用户对所有物品的评分为该用户向量,针对用户之间向量求余弦即为用户相似度。
-
-
然后利用其他用户对物品A的评分bA,cA,dA,通过(bA*b1+cA*c1+dA*d1)/(b1+c1+d1)得到用户a对物品A的推测得分。
1.2 基于物品的协同过滤
-
先计算物品的余弦相似度。
-
物品的余弦相似度计算方法为:所有用户对该物品的评分为该物品向量,针对物品之间向量求余弦即为物品相似度。
-
-
然后针对用户a消费的物品序列b,c,d分别得到对应的topk个相似物品(e,f,g),e的推测得分就为(b1*be+c1*ce+d1*de)/(be+ce+de)(其中b1,c1,d1是用户a针对b,c,d的评分,be,ce,de是b与e,c与e,d与e的物品相似度)。
2.矩阵分解(基于模型的协同过滤)
假设n个用户,m件物品,那么评分矩阵维度为n*m,假设分解的目标维度为embedding_dim,那么分解后的用户矩阵维度为n*embedding_dim,物品矩阵维度为embedding_dim*m,计算得到用户矩阵和物品矩阵后可以得到任意用户对任意物品的推测得分。
预测评分矩阵的目标函数为:
上式前半部分表示的是User矩阵*Item矩阵与评分矩阵中已知的评分差异,后半部分是L2正则项,保证数值计算稳定性,防止过拟合。
上述目标函数最优化问题的工程解法一般采用交替最小二乘法ALS(Alternating Least Squares)或随机梯度下降。
参考资料:推荐算法学习(五):评分预测&矩阵分解
3.spark als(Alternating Least Squares)
ALS als = new ALS()
.setMaxIter(alsMaxIter)
.setRegParam(0.01)
.setImplicitPrefs(true)
.setRank(alsRank)
.setNumUserBlocks(alsNumBlock)
.setNumItemBlocks(1)
.setUserCol(uidIdxCol)
.setItemCol(itemIdxCol)
.setCheckpointInterval(3)
.setRatingCol(ratingCol);
以上参数的含义为:
-
setMaxIter(alsMaxIter)
:设置运行迭代的最大次数。 -
setRegParam(0.01)
:设置ALS的正则化参数。 -
setImplicitPrefs(true)
:指定ALS使用隐式反馈数据,而不是显式反馈。 -
setRank(alsRank)
:设置模型中的因子数,也就是在用户和物品特征矩阵中的隐含特征数。 -
setNumUserBlocks(alsNumBlock)
:设置用户块的数量,用于并行化计算。 -
setNumItemBlocks(1)
:设置物品块的数量,用于并行化计算。 -
setUserCol(uidIdxCol)
:设置用户列的名称。 -
setItemCol(itemIdxCol)
:设置物品列的名称。 -
setCheckpointInterval(3)
:设置检查点间隔,这里的含义为每3次迭代生成一份检查点文件,这个参数越小,模型训练能从越近的地方恢复训练,训练更稳定,但是会增加IO时间。 -
setRatingCol(ratingCol)
:设置评分列的名称。
4.显式反馈与隐式反馈
-
显式反馈:用户明确提供的反馈,例如评分、喜欢或不喜欢、喜欢的程度等。这些反馈数据通常被认为是用户对物品的真实评价,因此可以直接用于建立推荐模型。然而,获取显式反馈的机会通常比较少,因为它需要用户主动提供反馈,而大多数用户在使用产品或服务时并不会主动提供反馈。
-
隐式反馈:用户在使用产品或服务过程中产生的行为数据,例如点击、浏览、购买、搜索等。这些数据可以被视为用户的隐式反馈,它们可以提供用户的兴趣和偏好信息,但解释性比显式反馈弱,因为用户的行为可能受到各种因素的影响,并不一定反映出用户的真实偏好。
对于显式反馈,ALS模型的目标是最小化以下损失函数:
L = ∑(r_ui - x_u^T * y_i)^2 + λ(∑||x_u||^2 + ∑||y_i||^2)
其中,r_ui是用户u对物品i的评分,x_u和y_i分别是用户u和物品i的潜在因子,λ是正则化参数。模型会通过交替最小二乘法(Alternating Least Squares)迭代优化用户和物品的潜在因子,使得损失函数最小。
对于隐式反馈,ALS模型的目标是最小化以下损失函数:
L = ∑c_ui*(p_ui - x_u^T * y_i)^2 + λ(∑||x_u||^2 + ∑||y_i||^2)
其中,c_ui是用户u对物品i的置信度,p_ui是用户u对物品i的偏好(如果用户u有过对物品i的行为,p_ui=1,否则p_ui=0),其他参数的含义与显式反馈的模型相同。置信度c_ui通常是用户对物品的行为数量的函数,例如点击次数、购买次数等。
可以看出,显式反馈的ALS模型直接使用用户的评分作为目标,而隐式反馈的ALS模型使用用户的偏好和置信度作为目标。