测试数据

用户ID,物品ID,评分
1,101,5.0
1,102,3.0
1,103,2.5
2,101,2.0
2,102,2.5
2,103,5.0
2,104,2.0
3,101,2.5
3,104,4.0
3,105,4.5
3,107,5.0
4,101,5.0
4,103,3.0
4,104,4.5
4,106,4.0
5,101,4.0
5,102,3.0
5,103,2.0
5,104,4.0
5,105,3.5
5,106,4.0

代码实现:

package mlimport org.apache.log4j.{Level, Logger}
import org.apache.spark.mllib.recommendation.{ALS, MatrixFactorizationModel, Rating}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import scala.io.Source/*** 交替最小二乘*/
object ALSDemo {/*** 加载评分数据* @param str*/def loadRatingData(str: String) :Seq[Rating] = {val lines = Source.fromFile(str).getLines()val ratings = lines.map{line =>val fields =line.split(",")Rating(fields(0).toInt, fields(1).toInt, fields(2).toDouble)}.filter{x => x.rating >0.0 }if (ratings.isEmpty){sys.error("NO ratings provided")}else{ratings.toSeq}}/*** 计算RMSE* @param model* @param data* @param n*/def computeRMSE(model: MatrixFactorizationModel, data: RDD[Rating], n: Long): Double = {val predictions: RDD[Rating] = model.predict((data.map(x => (x.user, x.product))))val predictionsAndRating = predictions.map {x => ((x.user, x.product), x.rating)}.join(data.map(x=>((x.user, x.product), x.rating))).valuesmath.sqrt(predictionsAndRating.map(x => (x._1 - x._2) * (x._1 - x._2)).reduce(_ + _) / n)}def main(args: Array[String]): Unit = {Logger.getLogger("org.apache.spark").setLevel(Level.ERROR)Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)val conf = new SparkConf().setAppName(this.getClass.getSimpleName).setMaster("local[*]")val sc = new SparkContext(conf)//读取打分数据,并转成RDD//(调用评分数据方法)val productRatings = loadRatingData(args(0))val productRatingRDD: RDD[Rating] = sc.parallelize(productRatings,1)//计算:打分的个数,用户的个数,物品的个数val numRatings = productRatingRDD.count()val numUsers = productRatingRDD.map(x => x.user).distinct().count()val numProducts = productRatingRDD.map(x => x.product).distinct().count()println("评分数:"+numRatings+" 用户总数:"+numUsers+" 物品总数:"+numProducts)/*** ALS.train(productRatingRDD, rank, numit, lambda)* productRatingRDD:评分矩阵* rank :小矩阵中,特征向量的个数,推荐的经验值 建议:10-200之间*     rank值越大:表示:拆分的数据越准确*     rank值越小:表示:速度越快* iteration:运行时的迭代(循环)次数,经验值:10左右* lambda:控制正则化的过程,值越大:表示正则化过程越厉害,值越小,越准确,建议使用0.01*/val ranks = List(2, 4)val lambdas = List(0.1, 1)val iters = List(2, 5)var bestModel: Option[MatrixFactorizationModel] = Nonevar bestRMSE = Double.MaxValuevar bestRank = 0var bestLambda = -1.0var bestNumit = -1//训练模型,以得到最佳的Modelfor (rank <- ranks; lambda <-lambdas; numit <- iters) {val model: MatrixFactorizationModel = ALS.train(productRatingRDD,rank,numit,lambda)//计算RMSEval rmse =computeRMSE(model,productRatingRDD,numRatings)if (rmse < bestRMSE) {bestModel = Some(model)bestRMSE = rmsebestLambda = lambdabestNumit = numit}}println("最佳模型:" + bestModel)println("最佳的RMSE:"+bestRMSE)println("最佳的Lambda:"+bestLambda)println("最佳的迭代次数Numit:"+bestNumit)//根据得到的最佳模型给用户1,推荐两个商品val recomm = bestModel.get.recommendProducts(2, 2)recomm.foreach { r =>{println("用户:" + r.user.toString() + " 物品:" + r.product.toString() + "  评分:" + r.rating.toString())}}}
}

ALS算法(推荐系统)相关推荐

  1. 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法

    [推荐系统入门到项目实战](三):矩阵分解和ALS算法

  2. 人工智能算法之梯度下降法、协同过滤、相似度技术、ALS算法(附案例分析)、模型存储与加载、推荐系统的冷启动问题

    梯度下降法 求解机器学习算法的模型参数,即无约束优化问题时,梯度下降法是最常采用的方法之一,另一种常用的方法是最小二乘法.这里对梯度下降法做简要介绍. 最小二乘法法适用于模型方程存在解析解的情况.如果 ...

  3. 基于Spark ALS算法的个性化推荐

    今天来使用spark中的ALS算法做一个小推荐.需要数据的话可以点击查看初识sparklyr-电影数据分析,在文末点击阅读原文即可获取. 其实在R中还有一个包可以做推荐,那就是recommenderl ...

  4. mllib协同过滤 java实现_协同过滤(ALS)算法介绍及Spark MLlib调用实例(Scala/Java/Python)...

    协同过滤 算法介绍: 协同过滤常被用于推荐系统.这类技术目标在于填充"用户-商品"联系矩阵中的缺失项.Spark.ml目前支持基于模型的协同过滤,其中用户和商品以少量的潜在因子来描 ...

  5. ALS算法原理和在音乐推荐上的应用

    ALS算法原理和在音乐推荐上的应用 ALS(Alternating least squares,交替最小二乘法)本来是一种数学上的优化方法,自从有人用它在Netflix大赛中使用于推荐系统,并获得冠军 ...

  6. 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)

    http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ\|x\|_\lambda∥x∥λ​表示.常用的有: ∥x∥1=∣x1∣+⋯+∣xn∣\|x\|_ ...

  7. 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)...

    http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ表示. 经常使用的有: ∥x∥1=|x1|+⋯+|xn| ∥x∥2=x21+⋯+x2n−−−−−− ...

  8. als算法参数_Spark2.0协同过滤与ALS算法介绍

    ALS矩阵分解 一个 的打分矩阵 A 可以用两个小矩阵和的乘积来近似,描述一个人的喜好经常是在一个抽象的低维空间上进行的,并不需要把其喜欢的事物一一列出.再抽象一些,把人们的喜好和电影的特征都投到这个 ...

  9. 基于Spark的Als算法+自迭代+Spark2.0新写法

    主要介绍了一下几点:  1矩阵分解的几种算法  2spark使用矩阵分解的几种方式,1ml 包中使用,2mllib包中的使用,其实有不调用包自己写的案列(可以去看看哈,就在example目录)  3使 ...

最新文章

  1. 如何DoDelete(Delete)中的Delete文本值传到DoDelete方法,报错信息为:Delete未定义!...
  2. WM_NCPAINT消息
  3. gorm crud简单代码示例
  4. 解题报告——试题 基础练习 分解质因数——31行代码AC
  5. 缓存系列文章--3.缓存常用更新策略对比(一致性)。
  6. C语言运算符优先级(超级详细)
  7. 基于时空图卷积网络预测交通流
  8. VisualStudio各版本的安装与使用(持续更新)
  9. 从代码角度看CAN网络层协议 ISO 15765-2(一)
  10. C# Socket通讯连接测试
  11. 【年薪百万之IT界大神成长之路零】年薪百万之IT界大神成长之路
  12. 照片查看器找不见的解决办法
  13. 【技术分享】Win10环境php安装seaslog扩展
  14. 1004 成绩排名 (20 分)
  15. PTA 1088三人行
  16. 给出一个数字求出它的个位、十分位、百分位、千分位、万分位........
  17. php照片墙,照片墙(CSS3动态效果)
  18. 这些年我读过的那些经典书籍(待续)
  19. 网站搭建之Apache安装教程
  20. jQuery--事件、效果

热门文章

  1. Windows一键删除指定文件或文件夹
  2. 物联网深度融入生活场景 爆发条件成熟
  3. 设置高德地图在Fragment中显示
  4. HDFS文件的读写操作理论解析
  5. 群环域,理想商环,原根复习
  6. IMU内参标定以及初始化(9轴IMU,比6轴多三个姿态角信息)
  7. CentOS8 图形界面和命令行切换
  8. ApiPost Error: ETIMEDOUT错误解决?
  9. 网易云音乐linux安装路径,修复网易云音乐Linux版不能安装及运行的问题
  10. 参数维纳滤波(Parametric Wiener Filter)