协同过滤算法实验

         本次呢,简单介绍一下协同过滤算法,并且给出简单的电影推荐实验作为举例说明。利用Spark MLlib中的协同过滤算法完成针对特定用户的电影推荐功能。这一部分需要实现实现输入用户id,输出为其推荐的电影。

一、协同过滤

       所谓协同过滤,就是简单来说是利用某兴趣相投、拥有共同经验之群体的喜好来推荐使用者感兴趣的资讯,个人透过合作的机制给予资讯相当程度的回应并记录下来以达到过滤的目的进而帮助别人选择信息。对于实现针对用户个性的推荐功能这一需求,非常合适。

二、电影推荐

        首先来看我们的结果:

 

 

        需要用到的数据集下载链接在文章的最后。

大概是这个样子:

movies和ratings两个数据集

数据之间以 :: 隔开

movies的每一列分别表示

movie_id , movie_name , movie_type

 ratings的每一列分别表示:

movie_id , user_id , score , timestamp(时间戳)

 代码如下:

object SparkPi {
  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]): Unit = {
    val sc=SparkSession.builder()
      .master("local")
      .appName("movie")
      .getOrCreate()
    val ratingRDD=sc.sparkContext.textFile("/ratings.dat")
    val ratings=sc.createDataFrame(ratingRDD.map(parseRating))
    val Array(training, test) = ratings.randomSplit(Array(0.8, 0.2))
    //训练模型
    val alsExplicit = new ALS()
      .setMaxIter(5)            
      .setRegParam(0.01)         
      .setUserCol("userId")
      .setItemCol("movieId")
      .setRatingCol("rating")    
    val alsImplicit = new ALS()
      .setMaxIter(5)           
      .setRegParam(0.01)   
      .setImplicitPrefs(true)
      .setUserCol("userId")
      .setItemCol("movieId")
      .setRatingCol("rating")    
    val modelExplicit = alsExplicit.fit(training)
    val modelImplicit = alsImplicit.fit(training)
    val predictionsExplicit = modelExplicit.transform(test).na.drop()
    val predictionsImplicit = modelImplicit.transform(test).na.drop()
    //计算模型误差
    val evaluator = new RegressionEvaluator()
      .setMetricName("rmse")
      .setLabelCol("rating")
      .setPredictionCol("prediction")
    val rmseExplicit = evaluator.evaluate(predictionsExplicit)
    val rmseImplicit = evaluator.evaluate(predictionsImplicit)
    println(s"Explicit:模型均方根误差 : $rmseExplicit")
    println(s"Implicit:模型均方根误差 : $rmseImplicit")
    println("请输入用户id:")
    val userId:Int=StdIn.readInt()
    val movieDF=ratings.where(s"userId= $userId")
    println(s"为id为 $userId 的用户推荐如下10部电影:")
    movieDF.limit(10).show()
    val df=movieDF.limit(10)
    //将数据存到数据库中
    val prop=new Properties()
    prop.put("user","root")
    prop.put("password","Wyk@123456")
    prop.put("driver","com.mysql.jdbc.Driver")
df.write.mode("Overwrite").jdbc("jdbc:mysql://localhost:3306/movie","movie.advice",prop)
  }
}

 下面是有关的数据集MovieLens | GroupLensicon-default.png?t=LA92https://grouplens.org/datasets/movielens/

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根引用内容,协同过滤算法是一种用于推荐系统的算法,可以根据用户的行为数据和其他用户的偏好来为用户提供个性化的推荐。具体的实验设计可以包括以下几个步骤: 1. 数据收集:收集用户的行为数据,例如浏览记录、购买记录等。同时也需要收集其他用户的偏好数据,例如评分、喜好标签等。 2. 数据预处理:对收集到的数据进行预处理,包括数据清洗、去噪、去重等操作。可以使用统计方法和机器学习算法来处理数据。 3. 用户相似度计算:根据用户的行为数据和其他用户的偏好数据,计算用户之间的相似度。常用的相似度计算方法包括余弦相似度、皮尔逊相关系数等。 4. 邻居选择:根据用户相似度,选择与目标用户最相似的一组邻居用户。可以使用Top-N邻居选择策略来确定邻居的数量。 5. 推荐生成:根据邻居用户的偏好数据,生成对目标用户的推荐列表。可以使用加权平均、基于概率模型等方法来生成推荐。 6. 评估和优化:使用评估指标(如准确率、召回率等)来评估推荐系统的性能,并根据评估结果进行优化,例如调整相似度计算方法、改进推荐生成算法等。 7. 实验设计与结果分析:设计实验来验证协同过滤算法的性能和效果,可以使用交叉验证、A/B测试等方法。通过对实验结果的分析,可以得出算法的优劣和适用范围。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值