基于模型协同过滤推荐离线召回:ALS

召回与排序业务流程
在这里插入图片描述

als(alternative least square),即交替最小二乘法,是用于计算损失函数最小化的一种方法,当然更为熟知的还有随机梯度下降法。

再正式介绍als之前,需要先引入矩阵分解的思想。
在这里插入图片描述

假定已有user对item的评分矩阵R,希望通过矩阵分解来预测user对其它item的评分,可以通过构造两个矩阵P和Q,使得
R ~ = P Q T \tilde{R}=P Q^{T} R~=PQT
然后通过不断迭代,来使 R ~ \tilde{R} R~不断逼近 R 的值。
在这里,P代表user的特征矩阵,Q代表item的特征矩阵,特征的每一维代表一个隐形因子,特征维度一般可通过根据经验设定,而隐形因子的具体值是由机器学到的。
在这里插入图片描述

以单用户 u u u 对商品 i i i 为例,则公式可变为 r ~ u i = p u ∗ q i ⊤ \tilde{r}_{u i}=p_{u} * q_{i}^{\top} r~ui=puqi 构造损失函数为:
J = min ⁡ q ∗ , p ∗ ∑ u , i ∈ K ( r u i − q i ⊤ p u ) 2 + λ ( ∥ q i ∥ 2 + ∥ p u ∥ 2 ) J=\min _{q^{*}, p^{*}} \sum_{u, i \in K}\left(r_{u i}-q_{i}^{\top} p_{u}\right)^{2}+\lambda\left(\left\|q_{i}\right\|^{2}+\left\|p_{u}\right\|^{2}\right) J=q,pminu,iK(ruiqipu)2+λ(qi2+pu2)
交替二乘法的基本思想是:

  1. 随机初始化矩阵QQ,
  2. 将Q当做已知,对损失函数求导=0,得到P的值;
  3. 得到矩阵P后,再将P当作已知,重新去计算矩阵Q,
  4. 两个过程交替进行,直到误差达到可以接受的程度。

当学习到user矩阵 P和特征矩阵 Q 以后,则可以计算任意user对item的预测评分了,可从候选item集中,选择top N个评分最高的items作为召回集合。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
除了ALS方法,Spark还提供了基于均值的协同过滤推荐方法和基于随机梯度下降的协同过滤推荐方法。具体实现步骤如下: 1. 基于均值的协同过滤推荐方法 ```scala import org.apache.spark.ml.evaluation.RegressionEvaluator import org.apache.spark.ml.recommendation.AverageRating import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Collaborative Filtering Example") .getOrCreate() val ratings = spark.read.format("csv") .option("header", "true") .option("inferSchema", "true") .load("ratings.csv") .drop("timestamp") //计算每个物品的平均评分 val averageRatings = ratings.groupBy("movieId").agg(avg("rating").alias("avgRating")) //将每个用户对每个物品的评分减去该物品的平均评分,得到用户对物品的相对评分 val relativeRatings = ratings.join(averageRatings, "movieId").withColumn("relativeRating", $"rating" - $"avgRating") //训练模型 val model = new AverageRating() .setUserCol("userId") .setItemCol("movieId") .setRatingCol("relativeRating") .fit(relativeRatings) //评估模型效果 val predictions = model.transform(relativeRatings) val evaluator = new RegressionEvaluator() .setMetricName("rmse") .setLabelCol("relativeRating") .setPredictionCol("prediction") val rmse = evaluator.evaluate(predictions) //生成推荐结果 val userRecs = model.recommendForAllUsers(10) val movieRecs = model.recommendForAllItems(10) ``` 该方法先计算每个物品的平均评分,然后将每个用户对每个物品的评分减去该物品的平均评分,得到用户对物品的相对评分。接着,使用相对评分训练模型,并评估模型效果。最后,生成用户和物品的推荐结果。 2. 基于随机梯度下降的协同过滤推荐方法 ```scala import org.apache.spark.ml.evaluation.RegressionEvaluator import org.apache.spark.ml.recommendation.{ALS, ALSModel} import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .appName("Collaborative Filtering Example") .getOrCreate() val ratings = spark.read.format("csv") .option("header", "true") .option("inferSchema", "true") .load("ratings.csv") .drop("timestamp") //将评分数据随机划分为训练集和测试集 val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2)) //训练模型 val als = new ALS() .setMaxIter(5) .setRegParam(0.01) .setUserCol("userId") .setItemCol("movieId") .setRatingCol("rating") .setImplicitPrefs(true) //使用隐式反馈 val model = als.fit(training) //评估模型效果 val predictions = model.transform(test) val evaluator = new RegressionEvaluator() .setMetricName("rmse") .setLabelCol("rating") .setPredictionCol("prediction") val rmse = evaluator.evaluate(predictions) //生成推荐结果 val userRecs = model.recommendForAllUsers(10) val movieRecs = model.recommendForAllItems(10) ``` 该方法使用ALS算法,但设置了`setImplicitPrefs(true)`来使用隐式反馈,即只考虑用户行为数据中的“喜欢”和“不喜欢”,而不考虑具体评分。其他步骤与ALS方法类似,包括划分训练集和测试集、训练模型、评估模型效果和生成推荐结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩波的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值