协同过滤 ( Collaborative filtering )

发布于 2024-05-18 03:15:20 字数 3537 浏览 25 评论 0

协同过滤是间接推荐的算法:举例基于用户的协同过滤推荐算法,我们先计算相似用户,然后利用相似度高的用户协同推荐出最受欢迎的 n 个商品,这就是协同过滤。

协同过滤常用于推荐系统。MLlib 提供的 ALS 目的是填补 user-item 矩阵中缺失项。MLlib 目前支持基于协同过滤模型的交替最小二乘法(ALS)算法来预测缺失的 item。具体做法是将矩阵 A 分解成 P 和 Q 矩阵,这样 P * Q = R, R≈A ​,也就是 R 矩阵是我们填补了 A 矩阵缺失值。所以我们给用户推荐 item 的时候可以推荐那些 R 矩阵中评分比较高且不在 A 矩阵评分项中的 item。具体分解算法是通过最小二乘法实现的可以参考: ALS
在 MLlib 中的实现 ALS 具体要设置以下参数

  • numBlocks 是用于并行计算的块的数量(设置 -1 是自动模式).
  • rank 模型隐因子数量
  • iterations 算法迭代次数
  • lambda 指定在 ALS 正则化参数
  • implicitPrefs 指定使用显式反馈数据还是使用隐式反馈数据。
  • alpha is a parameter applicable to the implicit feedback variant of ALS that governs the baseline confidence in preference observations.

显式与隐式反馈(Explicit vs. implicit feedback)

基于协同过滤掉标准方法是将 user-item 中的评分项作为用户的显式偏好。
实际情况下隐式反馈数据更加常见(如 意见,点击,购买,点赞,分享 等)。MLlib 通过协同过滤来处理这样的隐式反馈数据 ,本质上,而不是试图直接模拟矩阵的评级。这种方法通过设置不同数据的权重让将他们组合,通过该模型找出潜在的因素,就可以利用该模型来预测一个 item 的用户预期偏好了。

(正则化参数)Scaling of the regularization parameter

Since v1.1, we scale the regularization parameter lambda in solving each least squares problem by the number of ratings the user generated in updating user factors, or the number of ratings the product received in updating product factors. This approach is named “ALS-WR” and discussed in the paper “Large-Scale Parallel Collaborative Filtering for the Netflix Prize”. It makes lambda less dependent on the scale of the dataset. So we can apply the best parameter learned from a sampled subset to the full dataset and expect similar performance.

例子(Examples)

在下面的例子中我们使用评分数据,每一行由用户和产品的评分组成,假设评分数据是显式数据我们默认使用 ALS.train() 方法进行训练。我们通过使用均方差(MSE)来评估模型预测的误差。

import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.MatrixFactorizationModel
import org.apache.spark.mllib.recommendation.Rating

// Load and parse the data
val data = sc.textFile("../data/mllib/als/test.data")
val ratings = data.map(_.split(',') match { case Array(user, item, rate) =>
  Rating(user.toInt, item.toInt, rate.toDouble)
})

// Build the recommendation model using ALS
val rank = 10
val numIterations = 10
val model = ALS.train(ratings, rank, numIterations, 0.01)

// Evaluate the model on rating data
val usersProducts = ratings.map { case Rating(user, product, rate) =>
  (user, product)
}
val predictions =
  model.predict(usersProducts).map { case Rating(user, product, rate) =>
    ((user, product), rate)
  }
val ratesAndPreds = ratings.map { case Rating(user, product, rate) =>
  ((user, product), rate)
}.join(predictions)
val MSE = ratesAndPreds.map { case ((user, product), (r1, r2)) =>
  val err = (r1 - r2)
  err * err
}.mean()
println("Mean Squared Error = " + MSE)

// Save and load model
model.save(sc, "target/tmp/myCollaborativeFilter")
val sameModel = MatrixFactorizationModel.load(sc, "target/tmp/myCollaborativeFilter")
Mean Squared Error = 7.653179116888293E-6

如果矩阵中的数据不是显式数据(从其它信息推断出来的隐式数据),那么你可以使用 trainImplicit 方法来训练出更好的结果

val alpha = 0.01
val lambda = 0.01
val model = ALS.trainImplicit(ratings, rank, numIterations, lambda, alpha )

为了运行上面的程序,可以查看 spark 应用程序章节 Quick start guide 章节。要记得包涵 spark-mllib 的相关依赖。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

櫻之舞

暂无简介

文章
评论
26 人气
更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文