专栏首页share ai happiness算法推荐 — 协同过滤

算法推荐 — 协同过滤

CF协同过滤算法

求解评分矩阵的一种典型方法是:ALS,在spark-mllib库中有实现好的api;

K可以视为:隐性偏好因子的维度数

K越大,隐含的偏好因子就越多,计算效果更好,但是运算量更大!

算法思想:

CF协同过滤算法推荐实战

数据加工

从各类数据中,计算出每个用户对它所接触过的物品的评分,整成如下格式:

用户id, 物品id, 评分

U001 p0001 8

U001 p0020 10

U001 p1010 6

U002 p0030 8

........

可以用一个case class描述上述数据

case class Rating(uid:String,itemid:String,rate:Float)

模型训练

调用spark-mllib中ALS算法

object ALSExample {

// 定义评分数据封装类
  case class Rating(userId: Int, movieId: Int, rating: Float, timestamp: Long)

// 定义数据解析封装函数
  def parseRating(str: String): Rating = {
val fields = str.split("::")
    assert(fields.size == 4)
    Rating(fields(0).toInt, fields(1).toInt, fields(2).toFloat, fields(3).toLong)
  }


  def main(args: Array[String]) {
    Logger.getLogger("org").setLevel(Level.WARN)
val spark = SparkSession
      .builder
      .appName("ALSExample")
      .master("local[*]")
      .getOrCreate()
import spark.implicits._

// 加载评分数据,并解析为Rating对象
val ratings = spark.read.textFile("G:\\whale\\doit_recommend\\data\\als\\sample_movielens_ratings.txt")
      .map(parseRating)
      .toDF()

// 划分训练数据与测试数据集
val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))

// 基于训练数据构建ALS推荐模型
val als = new ALS()
      .setMaxIter(5)
      .setRegParam(0.01)
      .setUserCol("userId")
      .setItemCol("movieId")
      .setRatingCol("rating")

// 训练模型(求解方程组)
val model = als.fit(training)

// 基于RMSE对test数据集的预测结果进行模型评估
// 设置冷启动策略为drop,对于新注册用户避免产生空推荐矩阵
    model.setColdStartStrategy("drop")
// 针对测试数据集进行模型预测
val predictions: DataFrame = model.transform(test)

    predictions.printSchema()
    predictions.show(10,false)

// 构造一个评估模型,设置评估指标为RMSE
val evaluator = new RegressionEvaluator()
      .setMetricName("rmse")  // rmse 均方差
      .setLabelCol("rating")
      .setPredictionCol("prediction")

// 评估预测结果
val rmse = evaluator.evaluate(predictions)
    println(s"均方误差 = $rmse")

// 均方误差 = 1.827332995575392
//sys.exit(1)

// 为每个用户推荐top10个物品
val userRecs: DataFrame = model.recommendForAllUsers(10)

// 为每个物品推荐top10个用户
val movieRecs = model.recommendForAllItems(10)

// 抽取用户数据子集
val users = ratings.select(als.getUserCol).distinct().limit(3)
// 为子集用户推荐top10部电影
val userSubsetRecs = model.recommendForUserSubset(users, 10)

// 抽取电影子集
val movies = ratings.select(als.getItemCol).distinct().limit(3)
// 为子集电影推荐top10用户
val movieSubSetRecs = model.recommendForItemSubset(movies, 10)

// 打印各项推荐结果
/*userRecs.printSchema()
    userRecs.show(10,false)

    movieRecs.printSchema()
    movieRecs.show(10,false)

    userSubsetRecs.printSchema()
    userSubsetRecs.show(10,false)

    movieSubSetRecs.printSchema()
    movieSubSetRecs.show(10,false)*/

// 保存推荐结果
    userRecs.write.json("G:\\whale\\doit_recommend\\data\\rec_result")
    spark.stop()
  }
}

本文分享自微信公众号 - 1001次重燃(smile765999),作者:木东昭昭

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 大数据之数仓概念

    这几天看了一些专业的解释,还是对ODS、DW和DM认识不够深刻,所以就查了相关的资料,分享给大家一起学习。

    木野归郎
  • 拿美团offer,Hive基础篇(持续更新中)

    Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类 SQL查询功能。

    木野归郎
  • 面试被问到Flink的checkpoint问题,给问懵逼了....

    Checkpoint 机制

    木野归郎
  • 注意:C++中double的表示是有误差的

    注意:C++中double的表示是有误差的,直接通过下面的例子看一下 1 #include<iostream> 2 using namespace std;...

    用户1215536
  • Intel发布集成58G收发器的Stratix 10 TX FPGA芯片,目标5G、NFV

    英特尔正在推出其Stratix可编程芯片的最新版本Stratix 10 TX,该版本集成了58G的收发器,该版本可以使早期版本的带宽性能提高一倍。 ? Inte...

    SDNLAB
  • 五笔的退出,拼音的上任,昔日辉煌的五笔为何会惨遭“惜败”?

    曾经的五笔打字当初像神一样的存在,其实五笔到现在为止还是很多人继续在使用,五笔在熟悉的情况打字的效率还是非常高,当时拼音输入法的在软件层面的易用性远没有今天这么...

    程序员互动联盟
  • Android硬件加速(二)-RenderThread与OpenGL GPU渲染

    Android4.0之后,系统默认开启硬件加速来渲染视图,之前,理解Android硬件加速的小白文简单的讲述了硬件加速的简单模型,不过主要针对前半阶段,并没怎么...

    看书的小蜗牛
  • 数据结构与算法–关键路径

    关键路径与无环加权有向图的最长路径 现在考虑一个这样的问题:你今天事情比较多,要洗衣服、做作业还要烧水洗澡,之后出去找朋友玩。假设洗衣服要20分钟,烧水要30分...

    小莹莹
  • Frontiers: 森林土壤真菌群落的海拔分布格局及其生态装配过程

    Link: https://www.frontiersin.org/articles/10.3389/fmicb.2019.02226/full

    生物信息知识分享
  • 爱科技快报47期—今天我们看数据

    1、工信部治理垃圾短信 禁擅自向用户发商业短信 工信部最新通知规定:电信业务运营企业未经用户同意或请求,或用户已经明确表示拒绝的,不得向用户发送商业类短信息。 ...

    罗超频道

扫码关注云+社区

领取腾讯云代金券