推荐算法!基于隐语义模型的协同过滤推荐之用户商品推荐列表
项目采用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.2 项目数据流程 1.3 数据模型 第2章 工具环境搭建 2.1 MongoDB(单节点)环境配置 2.2 Redis(单节点)环境配置 ...
- 电商推荐系统四: 基于隐语义模型的协同过滤推荐
四.离线推荐服务建设(基于隐语义模型的协同过滤推荐) 目录 四.离线推荐服务建设(基于隐语义模型的协同过滤推荐) 4.1 离线推荐服务 4.2 离线统计服务 4.3 基于隐语义模型的协同过滤推荐 4. ...
- Python推荐系统学习笔记(1)基于协同过滤的个性化推荐算法实战---隐语义模型
一.相关概念: 1.隐语义模型(LFM) 通过矩阵分解建立用户和隐类之间的关系,物品和隐类之间的关系,最终得到用户对物品的偏好关系. 假设我们想要发现 F 个隐类, 我们的任务就是找到两个矩阵 U 和 ...
- 推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现
推荐算法之隐语义模型(LFM)矩阵分解梯度下降算法实现 基于协同过滤的推荐一般分为基于近邻的推荐和基于模型的推荐,其中,基于近邻是指预测时直接使用用户已有的偏好数据,通过近邻数据来预测新物品的偏好.而 ...
- 隐语义模型 VS 协同过滤
隐语义模型 从数据出发,进行个性化推荐 用户和数据之间有着隐含的联系 隐含因子让计算机能理解就好 将用户和物品通过中介隐含因子联系起来 分解-组合 F隐藏因子 隐语义模型求解 梯度下降方向 迭代求解 ...
- 模型算法_推荐算法之隐语义模型
1.LFM模型通过隐含特征联系用户与物品 2.LFM模型主要思想是对物品的兴趣进行分类,对于某个用户,首先得到他的兴趣 分类,再从分类中挑选他可能喜欢的物品 3.负采样样本数目要平衡且尽可能选 ...
- 推荐算法之隐语义模型
1.LFM模型通过隐含特征联系用户与物品 2.LFM模型主要思想是对物品的兴趣进行分类,对于某个用户,首先得到他的兴趣 分类,再从分类中挑选他可能喜欢的物品 3.负采样样本数目要平衡且尽可能选 ...
- 推荐算法工程师必备!!!协同过滤推荐算法总结
推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究.推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个概括总结,后续也会对一些典型 ...
- 基于隐语义模型的个性化推荐算法综述-笔记整理
1. 前期知识 均方根值(RMS)+ 均方根误差(RMSE)+标准差(Standard Deviation) 1.均方根值(RMS)也称作为效值,它的计算方法是先平方.再平均.然后开方. 2.均方根误 ...
最新文章
- Win7下让MSN离开任务栏
- 二本毕业后3年发两篇Nature引热议,他此前研究刷新世界纪录
- 《Effective Java》 读书笔记(持续更新)
- 从库存管理系统,体验活字格强大的移动端应用开发能力
- react 技术栈项目轻量化方案调研
- Linux命令(三) 移动文件 mv
- json 服务器 文件,json属于服务器文件吗
- UART串口协议详解
- 正则表达式小应用之对xml格式字符串每个字段加双引号
- strcat与strncat的C/C++实现
- 机器学习视频推荐-绝对的通俗易懂(线性回归,逻辑回归,朴素贝叶斯分类器,K-近邻,SVM,决策树,随机森林,XGboost,k-means聚类)
- CUDA编程技术汇总
- AI芯片发展的前世今生
- C语言爱心开场动画代码,QQ空间免费开场动画代码大全
- 【科普】一读就懂:CPU到底是怎么识别代码的?
- 根据M3U8文件地址下载网站上的视频
- 三针重叠问题算法整理
- java线程栅栏_Java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)
- 不同类型香港服务器怎么选?
- 餐饮数据的分析与挖掘(1)——数据采集