当前位置:网站首页>基于隐语义模型的协同过滤推荐之用户商品推荐列表
基于隐语义模型的协同过滤推荐之用户商品推荐列表
2022-08-05 23:28:00 【尚硅谷铁粉】
项目采用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 = 20 def main(args: Array[String]): Unit = { // 定义配置 val config = Map( "spark.cores" -> "local[*]", "mongo.uri" -> "mongodb://localhost:27017/recommender", "mongo.db" -> "recommender" ) // 创建spark session val 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() } }
边栏推荐
- Analysis of six methods of declaring variables in ES6
- 关于 Invalid prop: type check failed for prop “index“. Expected String, got Undefined
- unzip中文解压
- 如何优雅的消除系统重复代码
- 从零开始配置 vim(8)——文件类型检测
- [GKCTF 2021]easycms
- 国内BLDC电机控制方案目前存在什么痛点?
- pjudge#21651-[PR #4]猜猜看【交互】
- Learn these VRay renderer HDRI lighting tricks and get 3ds Max with ease
- ARC142F
猜你喜欢
MySQL数据库约束与表的设计
Spark基础【五种运行模式】
Kubernetes信息安全
Peeking into the Big from the Small: IO Caton Explores Apple's File System
leetcode:289. 生命游戏
Meet Alluxio, the "middleman" in MRS
使用MQ的时候,怎么确保消息100%不丢失?
How to Elegantly Eliminate System Duplicate Codes
Nanoprobes Nanogold标签:助力显示SAP-1 的分布和功能
【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?
随机推荐
ARC142F
Trie树简记
国内BLDC电机控制方案目前存在什么痛点?
基础容器
When using MQ, how to ensure that 100% of messages are not lost?
C# System.Reflection.Assembly动态加载资源文件
头脑风暴:零钱兑换
JuiceFS 在多云存储架构中的应用 | 深势科技分享
第10章 索引优化与查询优化【2.索引及调优篇】【MySQL高级】
直播平台怎么搭建,蒙版(背景)与导航栏颜色的问题
手机照片备份方案Immich(修订版)
OA项目线程内共享上下文实例(二)
zabbix告警设置,自动发现,自动注册
60: Chapter 5: Develop admin management services: 13: Develop new functions of [Add/Modify Friendship Links, Interfaces]; (Add data to MongoDB) (To operate the Dao layer interface of MongoDB, you must
程序编译过程(扫盲贴)
CardView的基本使用、DrawerLayout 滑动菜单、Fragment
C#Dictionary不能添加重复键的解决方法
Exploration and practice of Redis fixed-length queue
亿纬锂能首件搭载 46 系列大圆柱电池的系统产品成功下线
炫酷又高效的数据可视化大屏,做起来真的没那么难!丨极客星球