ALS算法(推荐系统)
测试数据
用户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算法(推荐系统)相关推荐
- 【推荐系统入门到项目实战】(三):矩阵分解和ALS算法
[推荐系统入门到项目实战](三):矩阵分解和ALS算法
- 人工智能算法之梯度下降法、协同过滤、相似度技术、ALS算法(附案例分析)、模型存储与加载、推荐系统的冷启动问题
梯度下降法 求解机器学习算法的模型参数,即无约束优化问题时,梯度下降法是最常采用的方法之一,另一种常用的方法是最小二乘法.这里对梯度下降法做简要介绍. 最小二乘法法适用于模型方程存在解析解的情况.如果 ...
- 基于Spark ALS算法的个性化推荐
今天来使用spark中的ALS算法做一个小推荐.需要数据的话可以点击查看初识sparklyr-电影数据分析,在文末点击阅读原文即可获取. 其实在R中还有一个包可以做推荐,那就是recommenderl ...
- mllib协同过滤 java实现_协同过滤(ALS)算法介绍及Spark MLlib调用实例(Scala/Java/Python)...
协同过滤 算法介绍: 协同过滤常被用于推荐系统.这类技术目标在于填充"用户-商品"联系矩阵中的缺失项.Spark.ml目前支持基于模型的协同过滤,其中用户和商品以少量的潜在因子来描 ...
- ALS算法原理和在音乐推荐上的应用
ALS算法原理和在音乐推荐上的应用 ALS(Alternating least squares,交替最小二乘法)本来是一种数学上的优化方法,自从有人用它在Netflix大赛中使用于推荐系统,并获得冠军 ...
- 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)
http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ\|x\|_\lambda∥x∥λ表示.常用的有: ∥x∥1=∣x1∣+⋯+∣xn∣\|x\|_ ...
- 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)...
http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ表示. 经常使用的有: ∥x∥1=|x1|+⋯+|xn| ∥x∥2=x21+⋯+x2n−−−−−− ...
- als算法参数_Spark2.0协同过滤与ALS算法介绍
ALS矩阵分解 一个 的打分矩阵 A 可以用两个小矩阵和的乘积来近似,描述一个人的喜好经常是在一个抽象的低维空间上进行的,并不需要把其喜欢的事物一一列出.再抽象一些,把人们的喜好和电影的特征都投到这个 ...
- 基于Spark的Als算法+自迭代+Spark2.0新写法
主要介绍了一下几点: 1矩阵分解的几种算法 2spark使用矩阵分解的几种方式,1ml 包中使用,2mllib包中的使用,其实有不调用包自己写的案列(可以去看看哈,就在example目录) 3使 ...
最新文章
- 如何DoDelete(Delete)中的Delete文本值传到DoDelete方法,报错信息为:Delete未定义!...
- WM_NCPAINT消息
- gorm crud简单代码示例
- 解题报告——试题 基础练习 分解质因数——31行代码AC
- 缓存系列文章--3.缓存常用更新策略对比(一致性)。
- C语言运算符优先级(超级详细)
- 基于时空图卷积网络预测交通流
- VisualStudio各版本的安装与使用(持续更新)
- 从代码角度看CAN网络层协议 ISO 15765-2(一)
- C# Socket通讯连接测试
- 【年薪百万之IT界大神成长之路零】年薪百万之IT界大神成长之路
- 照片查看器找不见的解决办法
- 【技术分享】Win10环境php安装seaslog扩展
- 1004 成绩排名 (20 分)
- PTA 1088三人行
- 给出一个数字求出它的个位、十分位、百分位、千分位、万分位........
- php照片墙,照片墙(CSS3动态效果)
- 这些年我读过的那些经典书籍(待续)
- 网站搭建之Apache安装教程
- jQuery--事件、效果