项目采用ALS作为协同过滤算法,根据MongoDB中的用户评分表计算离线的用户商品推荐列表以及商品相似度矩阵。

通过ALS训练出来的Model来计算所有当前用户商品的推荐列表,主要思路如下:

1. userId和productId做笛卡尔积,产生(userId,productId)的元组

2. 通过模型预测(userId,productId)对应的评分。

3. 将预测结果通过预测分值进行排序。

4. 返回分值最大的K个商品,作为当前用户的推荐列表。

最后生成的数据结构如下:将数据保存到MongoDB的UserRecs表中

新建recommender的子项目OfflineRecommender,引入spark、scala、mongo和jblas的依赖:

<dependencies><dependency><groupId>org.scalanlp</groupId><artifactId>jblas</artifactId><version>${jblas.version}</version></dependency><!-- Spark的依赖引入 --><dependency><groupId>org.apache.spark</groupId><artifactId>spark-core_2.11</artifactId></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-sql_2.11</artifactId></dependency><dependency><groupId>org.apache.spark</groupId><artifactId>spark-mllib_2.11</artifactId></dependency><!-- 引入Scala --><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId></dependency><!-- 加入MongoDB的驱动 --><!-- 用于代码方式连接MongoDB --><dependency><groupId>org.mongodb</groupId><artifactId>casbah-core_2.11</artifactId><version>${casbah.version}</version></dependency><!-- 用于Spark和MongoDB的对接 --><dependency><groupId>org.mongodb.spark</groupId><artifactId>mongo-spark-connector_2.11</artifactId><version>${mongodb-spark.version}</version></dependency></dependencies>

同样经过前期的构建样例类、声明配置、创建SparkSession等步骤,可以加载数据开始计算模型了。

核心代码如下:

case class ProductRating(userId: Int, productId: Int, score: Double, timestamp: Int)case class MongoConfig(uri:String, db:String)// 标准推荐对象,productId,score
case class Recommendation(productId: Int, score:Double)// 用户推荐列表
case class UserRecs(userId: Int, recs: Seq[Recommendation])// 商品相似度(商品推荐)case class ProductRecs(productId: Int, recs: Seq[Recommendation])object OfflineRecommmeder {// 定义常量val MONGODB_RATING_COLLECTION = "Rating"// 推荐表的名称val USER_RECS = "UserRecs"val PRODUCT_RECS = "ProductRecs"val USER_MAX_RECOMMENDATION = 20def main(args: Array[String]): Unit = {// 定义配置val config = Map("spark.cores" -> "local[*]","mongo.uri" -> "mongodb://localhost:27017/recommender","mongo.db" -> "recommender")// 创建spark sessionval sparkConf = new SparkConf().setMaster(config("spark.cores")).setAppName("OfflineRecommender")val spark = SparkSession.builder().config(sparkConf).getOrCreate()implicit val mongoConfig = MongoConfig(config("mongo.uri"),config("mongo.db"))import spark.implicits._
//读取mongoDB中的业务数据
val ratingRDD = spark
.read
.option("uri",mongoConfig.uri)
.option("collection",MONGODB_RATING_COLLECTION)
.format("com.mongodb.spark.sql")
.load()
.as[ProductRating]
.rdd
.map(rating=> (rating.userId, rating.productId, rating.score)).cache()
//用户的数据集 RDD[Int]
val userRDD = ratingRDD.map(_._1).distinct()
val prodcutRDD = ratingRDD.map(_._2).distinct()//创建训练数据集
val trainData = ratingRDD.map(x => Rating(x._1,x._2,x._3))
// rank 是模型中隐语义因子的个数, iterations 是迭代的次数, lambda 是ALS的正则化参
val (rank,iterations,lambda) = (50, 5, 0.01)
//调用ALS算法训练隐语义模型
val model = ALS.train(trainData,rank,iterations,lambda)
//计算用户推荐矩阵
val userProducts = userRDD.cartesian(productRDD)
// model已训练好,把id传进去就可以得到预测评分列表RDD[Rating] (userId,productId,rating)
val preRatings = model.predict(userProducts)val userRecs = preRatings
.filter(_.rating > 0)
.map(rating => (rating.user,(rating.product, rating.rating)))
.groupByKey()
.map{
case (userId,recs) => UserRecs(userId,recs.toList.sortWith(_._2 >
_._2).take(USER_MAX_RECOMMENDATION).map(x => Recommendation(x._1,x._2)))
}.toDF()userRecs.write
.option("uri",mongoConfig.uri)
.option("collection",USER_RECS)
.mode("overwrite")
.format("com.mongodb.spark.sql")
.save()//TODO:计算商品相似度矩阵// 关闭spark
spark.stop()
}
}

推荐算法!基于隐语义模型的协同过滤推荐之用户商品推荐列表相关推荐

  1. 电商推荐系统(上):推荐系统架构、数据模型、离线统计与机器学习推荐、历史热门商品、最近热门商品、商品平均得分统计推荐、基于隐语义模型的协同过滤推荐、用户商品推荐列表、商品相似度矩阵、模型评估和参数选取

    文章目录 第1章 项目体系架构设计 1.1 项目系统架构 1.2 项目数据流程 1.3 数据模型 第2章 工具环境搭建 2.1 MongoDB(单节点)环境配置 2.2 Redis(单节点)环境配置 ...

  2. 电商推荐系统四: 基于隐语义模型的协同过滤推荐

    四.离线推荐服务建设(基于隐语义模型的协同过滤推荐) 目录 四.离线推荐服务建设(基于隐语义模型的协同过滤推荐) 4.1 离线推荐服务 4.2 离线统计服务 4.3 基于隐语义模型的协同过滤推荐 4. ...

  3. Python推荐系统学习笔记(1)基于协同过滤的个性化推荐算法实战---隐语义模型

    一.相关概念: 1.隐语义模型(LFM) 通过矩阵分解建立用户和隐类之间的关系,物品和隐类之间的关系,最终得到用户对物品的偏好关系. 假设我们想要发现 F 个隐类, 我们的任务就是找到两个矩阵 U 和 ...

  4. 推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现

    推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现 基于协同过滤的推荐一般分为基于近邻的推荐和基于模型的推荐,其中,基于近邻是指预测时直接使用用户已有的偏好数据,通过近邻数据来预测新物品的偏好.而 ...

  5. 隐语义模型 VS 协同过滤

    隐语义模型 从数据出发,进行个性化推荐 用户和数据之间有着隐含的联系 隐含因子让计算机能理解就好 将用户和物品通过中介隐含因子联系起来 分解-组合 F隐藏因子 隐语义模型求解 梯度下降方向 迭代求解 ...

  6. 模型算法_推荐算法之隐语义模型

    1.LFM模型通过隐含特征联系用户与物品 2.LFM模型主要思想是对物品的兴趣进行分类,对于某个用户,首先得到他的兴趣     分类,再从分类中挑选他可能喜欢的物品 3.负采样样本数目要平衡且尽可能选 ...

  7. 推荐算法之隐语义模型

    1.LFM模型通过隐含特征联系用户与物品 2.LFM模型主要思想是对物品的兴趣进行分类,对于某个用户,首先得到他的兴趣     分类,再从分类中挑选他可能喜欢的物品 3.负采样样本数目要平衡且尽可能选 ...

  8. 推荐算法工程师必备!!!协同过滤推荐算法总结

    推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究.推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个概括总结,后续也会对一些典型 ...

  9. 基于隐语义模型的个性化推荐算法综述-笔记整理

    1. 前期知识 均方根值(RMS)+ 均方根误差(RMSE)+标准差(Standard Deviation) 1.均方根值(RMS)也称作为效值,它的计算方法是先平方.再平均.然后开方. 2.均方根误 ...

最新文章

  1. Win7下让MSN离开任务栏
  2. 二本毕业后3年发两篇Nature引热议,他此前研究刷新世界纪录
  3. 《Effective Java》 读书笔记(持续更新)
  4. 从库存管理系统,体验活字格强大的移动端应用开发能力
  5. react 技术栈项目轻量化方案调研
  6. Linux命令(三) 移动文件 mv
  7. json 服务器 文件,json属于服务器文件吗
  8. UART串口协议详解
  9. 正则表达式小应用之对xml格式字符串每个字段加双引号
  10. strcat与strncat的C/C++实现
  11. 机器学习视频推荐-绝对的通俗易懂(线性回归,逻辑回归,朴素贝叶斯分类器,K-近邻,SVM,决策树,随机森林,XGboost,k-means聚类)
  12. CUDA编程技术汇总
  13. AI芯片发展的前世今生
  14. C语言爱心开场动画代码,QQ空间免费开场动画代码大全
  15. 【科普】一读就懂:CPU到底是怎么识别代码的?
  16. 根据M3U8文件地址下载网站上的视频
  17. 三针重叠问题算法整理
  18. java线程栅栏_Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)
  19. 不同类型香港服务器怎么选?
  20. 餐饮数据的分析与挖掘(1)——数据采集

热门文章

  1. idea中HTML格式化时标签缩进问题
  2. DingTalk获取webhook
  3. 双 JK 触发器 74LS112 逻辑功能。真值表_Java多线程 volatile适用的场景:触发器
  4. 单片机的四层电梯控制系统
  5. SitePoint Podcast#49:Buzz Kill
  6. IDEA配置MAVEN_OPTS
  7. fortran:计算第二类椭圆积分
  8. 如何对接股票交易接口?
  9. 选股票就是选对象价值投资基础
  10. 计算机网络安全教育培训教程,网络安全培训教材(PPT 67页)