推荐系统Lambda架构算法(三):基于回归模型的协同过滤推荐算法及其实现(随机梯度下降法优化+交替最小二乘法优化)

基于回归模型的协同过滤推荐

如果我们将评分看作是一个连续的值而不是离散的值,那么就可以借助线性回归思想来预测目标用户对某物品的评分。其中一种实现策略被称为Baseline(基准预测)。

Baseline:基准预测

Baseline设计思想基于以下的假设:

  • 有些用户的评分普遍高于其他用户,有些用户的评分普遍低于其他用户。比如有些用户天生愿意给别人好评,心慈手软,比较好说话,而有的人就比较苛刻,总是评分不超过3分(5分满分)
  • 一些物品的评分普遍高于其他物品,一些物品的评分普遍低于其他物品。比如一些物品一被生产便决定了它的地位,有的比较受人们欢迎,有的则被人嫌弃。

这个用户或物品普遍高于或低于平均值的差值,我们称为偏置(bias)

Baseline目标:

  • 找出每个用户普遍高于或低于他人的偏置值 b u b_u bu
  • 找出每件物品普遍高于或低于其他物品的偏置值 b i b_i bi
  • 我们的目标也就转化为寻找最优的 b u 和 b i b_u和 b_i bubi

使用Baseline的算法思想预测评分的步骤如下:

  • 计算所有电影的平均评分 μ \mu μ(即全局平均评分)

  • 计算每个用户评分与平均评分 μ 的 偏 置 值 b u \mu的偏置值b_u μbu

  • 计算每部电影所接受的评分与平均评分 μ 的 偏 置 值 b i \mu的偏置值b_i μbi

  • 预测用户对电影的评分:
    r ^ u i = b u i = μ + b u + b i \hat{r}_{ui} = b_{ui} = \mu + b_u + b_i r^ui=bui=μ+bu+bi

  • 举例:通过Baseline来预测用户A对电影“阿甘正传”的评分

    • 首先计算出整个评分数据集的平均评分 μ \mu μ是3.5分
    • 用户A比较苛刻,普遍比平均评分低0.5分,即用户A的偏置值 b i b_i bi是-0.5;
    • “阿甘正传”比较热门且备受好评,评分普遍比平均评分要高1.2分,“阿甘正传”的偏置是+1.2
    • 因此就可以预测出用户A对电影“阿甘正传”的评分为: 3.5 + ( − 0.5 ) + 1.2 3.5+(-0.5)+1.2 3.5+(0.5)+1.2​,也就是4.2分。

对于所有电影的平均评分是直接能计算出的,因此问题在于要测出每个用户的评分偏置和每部电影的得分偏置。对于线性回归问题,我们可以利用平方差构建损失函数如下:

在这里插入图片描述
在这里插入图片描述

加入L2正则化:
C o s t = ∑ u , i ∈ R ( r u i − μ − b u − b i ) 2 + λ ∗ ( ∑ u b u 2 + ∑ i b i 2 ) Cost=\sum_{u,i\in R}(r_{ui}-\mu-b_u-b_i)^2 + \lambda*(\sum_u {b_u}^2 + \sum_i {b_i}^2) Cost=u,iR(ruiμbubi)2+λ(ubu2+ibi2)
公式解析:

  • 公式第一部分 ∑ u , i ∈ R ( r u i − μ − b u − b i ) 2 是 用 来 寻 找 与 已 知 评 分 数 据 拟 合 最 好 的 b u 和 b i \sum_{u,i\in R}(r_{ui}-\mu-b_u-b_i)^2是用来寻找与已知评分数据拟合最好的b_u和b_i u,iR(ruiμbubi)2bubi
  • 公式第二部分 λ ∗ ( ∑ u b u 2 + ∑ i b i 2 ) \lambda*(\sum_u {b_u}^2 + \sum_i {b_i}^2) λ
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要使用pyspark mllib模块实现新闻推荐,可以采用协同过滤算法中的最小交替二乘(Alternating Least Squares,ALS)算法。具体步骤如下: 1. 准备数据:将用户对新闻的评分数据以(user_id, item_id, rating)的形式存储在一个RDD中。可以使用Spark SQL或其他方式从数据库中读取数据,然后转化为RDD。 2. 将评分数据划分为训练集和测试集。可以使用randomSplit()方将数据划分为两部分,一部分用于训练模型,另一部分用于测试模型的准确性。 3. 调用ALS.train()方训练模型。需要传入如下参数: - rank: 模型的潜在因素数目,一般选择10-200之间的值 - iterations: 迭代次数,一般选择10-20次 - lambda_: 正则化参数,防止过拟合,一般选择0.01-0.1之间的值 例如: ``` from pyspark.mllib.recommendation import ALS, Rating # 准备数据 data = sc.textFile("ratings.csv") ratings = data.map(lambda l: l.split(',')).map(lambda l: Rating(int(l[0]), int(l[1]), float(l[2]))) # 划分训练集和测试集 train, test = ratings.randomSplit([0.8, 0.2]) # 训练模型 rank = 10 iterations = 10 lambda_ = 0.01 model = ALS.train(train, rank, iterations, lambda_) ``` 4. 使用训练好的模型对用户进行推荐。可以使用model.recommendProducts()方,传入用户ID和推荐的新闻数量,得到该用户可能喜欢的新闻列表。 例如: ``` # 为用户推荐新闻 user_id = 1 num_recommendations = 10 recommendations = model.recommendProducts(user_id, num_recommendations) for r in recommendations: print("User %d may like news %d with predicted rating %f" % (r.user, r.product, r.rating)) ``` 以上就是使用pyspark mllib模块实现新闻推荐的主要步骤。其中,最小交替二乘算法是ALS.train()方默认的训练算法,因此不需要特别指定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值