关闭

推荐系统ALS矩阵分解

1516人阅读 评论(0) 收藏 举报
分类:

思想类似线性回归做预测,大致如下

定义一个预测模型(数学公式),

然后确定一个损失函数,

将已有数据作为训练集,

不断迭代来最小化损失函数的值,

最终确定参数,把参数套到预测模型中做预测。

 

矩阵分解的预测模型是:

技术分享

损失函数是:

技术分享
我们就是要最小化损失函数,从而求得参数q和p。

 

矩阵分解模型的物理意义

技术分享

我们希望学习到一个P代表user的特征,Q代表item的特征。特征的每一个维度代表一个隐性因子,比如对电影来说,这些隐性因子可能是导演,演员等。当然,这些隐性因子是机器学习到的,具体是什么含义我们不确定。

学习到P和Q之后,我们就可以直接P乘以Q就可以预测所有user对item的评分了。



讲完矩阵分解推荐模型,下面到als了(全称Alternatingleast squares)。其实als就是上面损失函数最小化的一个求解方法,当然还有其他方法比如SGD等。

als论文中的损失函数是(跟上面那个稍微有点不同)

技术分享

每次迭代,

         固定M,逐个更新每个user的特征u(对u求偏导,令偏导为0求解)。

         固定U,逐个更新每个item的特征m(对m求偏导,令偏导为0求解)。

论文中是这样推导的

技术分享

这是每次迭代求u的公式。求m的类似。

 

为了更清晰的理解,这里结合spark的als代码讲解。

spark源码中实现als有三个版本,一个是LocalALS.scala(没有用spark),一个是SparkALS.scala(用了spark做并行优化),一个是mllib中的ALS。

 

本来LocalALS.scala和SparkALS.scala这个两个实现是官方为了开发者学习使用spark展示的,

mllib中的ALS可以用于实际的推荐。

但是mllib中的ALS做了很多优化,不适合初学者研究来理解als算法。

因此,下面我拿LocalALS.scala和SparkALS.scala来讲解als算法。

 

LocalALS.scala

    // Iteratively update movies then users
    for (iter <- 1 to ITERATIONS) {
      println(s"Iteration $iter:")
      ms = (0 until M).map(i => updateMovie(i, ms(i), us, R)).toArray  //固定用户,逐个更新所有电影的特征
      us = (0 until U).map(j => updateUser(j, us(j), ms, R)).toArray   //固定电影,逐个更新所有用户的特征
      println("RMSE = " + rmse(R, ms, us))
      println()
    }

  //更新第j个user的特征向量
  def updateUser(j: Int, u: RealVector, ms: Array[RealVector], R: RealMatrix) : RealVector = {
    var XtX: RealMatrix = new Array2DRowRealMatrix(F, F) //F是隐性因子的数量
    var Xty: RealVector = new ArrayRealVector(F)
    // For each movie that the user rated 遍历该user评分过的movie.显然,这里默认该用户评分过所有电影,所以是0-M.实际应用求解,只需要遍历该用户评分过的电影.
    for (i <- 0 until M) {
      val m = ms(i)
      // Add m * m^t to XtX 外积后 累加到XtX
      XtX = XtX.add(m.outerProduct(m)) //向量与向量的外积:一个当作列向量,一个当作行向量,做矩阵乘法,结果是一个矩阵
      // Add m * rating to Xty
      Xty = Xty.add(m.mapMultiply(R.getEntry(i, j)))
    }
    // Add regularization coefficients to diagonal terms
    for (d <- 0 until F) {
      XtX.addToEntry(d, d, LAMBDA * M)
    }
    // Solve it with Cholesky 其实是解一个A*x=b的方程
    new CholeskyDecomposition(XtX).getSolver.solve(Xty)
  }

再结合论文中的公式

技术分享

其实代码中的XtX就是公式中左边红圈的部分,Xty就是右边红圈的部分。

同理,更新每个电影的特征m类似,这里不再重复。

SparkALS.scala

    for (iter <- 1 to ITERATIONS) {
      println(s"Iteration $iter:")
      ms = sc.parallelize(0 until M, slices)
                .map(i => update(i, msb.value(i), usb.value, Rc.value))
                .collect()
      msb = sc.broadcast(ms) // Re-broadcast ms because it was updated
      us = sc.parallelize(0 until U, slices)
                .map(i => update(i, usb.value(i), msb.value, Rc.value.transpose()))
                .collect()
      usb = sc.broadcast(us) // Re-broadcast us because it was updated
      println("RMSE = " + rmse(R, ms, us))
      println()
    }

SparkALS版本相对于LocalALS的亮点时,做了并行优化。LocalALS中,每个user的特征是串行更新的。而SparkALS中,是并行更新的。

 

 

参考资料:

《Large-scale Parallel Collaborative Filtering for the Netflix Prize》(als-wr原论文)

《Matrix Factorization Techniques for Recommender Systems》(矩阵分解模型的好材料)

https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/LocalALS.scala

https://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/SparkALS.scala


0
0
查看评论

矩阵分解模型(1):ALS学习算法

一、矩阵分解模型。 用户对物品的打分行为可以表示成一个评分矩阵A(m*n),表示m个用户对n各物品的打分情况。如下图所示: 其中,A(i,j)表示用户user i对物品item j的打分。但是,用户不会对所以物品打分,图中?表示用户没有打分的情况,所以这个矩阵A很多元素都是空的,我们称其...
  • oucpowerman
  • oucpowerman
  • 2015-11-15 11:42
  • 12609

ALS矩阵分解推荐模型

ALS矩阵分解推荐模型 其实通过模型来预测一个user对一个item的评分,思想类似线性回归做预测,大致如下 定义一个预测模型(数学公式), 然后确定一个损失函数, 将已有数据作为训练集, 不断迭代来最小化损失函数的值, 最终确定参数,把参数套到预测模型中做预测。   矩阵分解的预...
  • linger2012liu
  • linger2012liu
  • 2015-03-05 21:08
  • 8284

基于Spark mllib的矩阵分解(ALS)推荐算法

推荐引擎背后的想法是:预测人们可能喜好的物品并通过探寻物品之间的联系来辅助这个过程。 推荐引擎很适合如下两类常见场景(两者可兼有)。 - 可选项众多:可选的物品越多,用户就越难找到想要的物品。如果用户知道他们想要什么,那搜索能有所帮助。然而最适合的物品往往并不为用户所事先知道。这时,通过向用户...
  • nihaoxiaocui
  • nihaoxiaocui
  • 2016-08-31 20:22
  • 2251

ALS矩阵分解算法应用

转自:https://github.com/ceys/jdml.wiki.git 编写人:ceys/youyis 一、算法描述1.原理问题描述ALS的矩阵分解算法常应用于推荐系统中,将用户(user)对商品(item)的评分矩阵,分解为用户对商品隐含特征的偏好矩阵,和商品在隐含特征上的映射矩阵。...
  • a358463121
  • a358463121
  • 2016-04-06 20:47
  • 4963

基于Spark ALS在线推荐系统

所用技术:Bootstrap、flat-ui 、 Servlet、Spark1.4.1、Hadoop2.6.0、JDK说明:本系统不涉及ssh相关内容,只有简单的Servlet和JSP、HTML页面,系统架构相对简单。系统部署:1. 拷贝spark-assembly-1.4.1-hadoop2.6....
  • fansy1990
  • fansy1990
  • 2016-08-23 14:18
  • 9259

基于ALS算法的简易在线推荐系统

继前期完成广义线性模型的在线流式机器学习的代码后,我们对spark的mllib中的推荐系统这一部分比较感兴趣,因为推荐系统这一部分在现实生活中也非常实用,尤其是基于地理位置的在线推荐系统目前非常火热,很多商业软件如大众点评,淘点点等都希望能根据用户以往的一些行为和当前所处的地理位置给用户做出最佳的推...
  • zhangyuming010
  • zhangyuming010
  • 2014-08-31 09:56
  • 13092

推荐系统ALS矩阵分解

思想类似线性回归做预测,大致如下 定义一个预测模型(数学公式), 然后确定一个损失函数, 将已有数据作为训练集, 不断迭代来最小化损失函数的值, 最终确定参数,把参数套到预测模型中做预测。   矩阵分解的预测模型是: 损失函数是: 我们就是...
  • u013749540
  • u013749540
  • 2016-07-01 10:05
  • 1516

基于ALS的线推荐系统

在推荐系统领域,目前市面上中文的参考书并不多,我们主要学习了目前就职于hulu公司的项亮编著的《推荐系统实战》这本书,这本书详细的介绍了推荐系统方面的一些典型算法和评估方法,并且结合作者的实际经验给出了很多推荐系统的相关实例,是学习推荐系统不可多得的一本好书,我们也受益匪浅。  &#...
  • u013749540
  • u013749540
  • 2016-06-24 18:28
  • 734

协同过滤之ALS-WR算法

这篇文章是参考:https://github.com/ceys/jdml/wiki/ALS 改写的,由于原文Latex公式没有正常展现+少量笔误,妨碍阅读,所以这里重新整理了一下。 ALS是alternating least squares的缩写 , 意为交替最小二乘法;而ALS-WR是alt...
  • wguangliang
  • wguangliang
  • 2016-05-30 17:30
  • 2782

协同过滤之ALS-WR算法

这篇文章是参考:https://github.com/ceys/jdml/wiki/ALS 改写的,由于原文Latex公式没有正常展现+少量笔误,妨碍阅读,所以这里重新整理了一下。 ALS是alternating least squares的缩写 , 意为交替最小二乘法;而ALS-WR是a...
  • winone361
  • winone361
  • 2016-02-21 17:55
  • 658
    个人资料
    • 访问:216996次
    • 积分:5525
    • 等级:
    • 排名:第5733名
    • 原创:326篇
    • 转载:192篇
    • 译文:1篇
    • 评论:15条
    文章分类