推荐模型

推荐模型的种类分为:

1.基于内容的过滤:基于内容的过滤利用物品的内容或是属性信息以及某些相似度定义,来求出与该物品类似的物品。

2.协同过滤:协同过滤是一种借助众包智慧的途径。它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度。其内在思想是相似度的定义。

在基于用户的方法的中,如果两个用户表现出相似的偏好(即对相同物品的偏好大体相同),那就认为他们的兴趣类似。

同样也可以借助基于物品的方法来做推荐。这种方法通常根据现有用户对物品的偏好或是评级情况,来计算物品之间的某种相似度。

3.矩阵分解:

3.1. 显式矩阵分解

例如我们可以得到多个用户对多部电影的评级的数据,这样我们就可以得到一个用户—电影评级的矩阵

我们所得到的这个矩阵是稀疏的,假设得到的“用户—物品”矩阵的维度为U×I,我们需要对其进行降维,然后得到一个表示用户的U×k维矩阵和一个表示物品的k×I维矩阵

要计算给定用户对某个物品的预计评级

只需要从用户因子矩阵和物品因子矩阵分别选取相应的行(用户因子向量)与列(物品因子向量),然后计算两者的点积即可

对于物品之间相似度的计算,可以用最近邻模型中用到的相似度衡量方法。不同的是,这里可以直接利用物品因子向量,将相似度计算转换为对两物品因子向量之间相似度的计算

1.使用的是Spark-shell和Scala语言,同样需要把文件放在Hadoop文件系统中

启动Spark-shell

  1. val rawData = sc.textFile("/user/common/ml-100k/u.data")
  2. rawData.first()
  1. #输出 res1: String = 196 242 3 881250949
  2. #该数据由用户ID、影片ID、星级和时间戳等字段依次组成

提取出前三个字段

  1. val rawRatings = rawData.map(_.split("\t").take(3))

使用ALS模型进行训练

  1. import org.apache.spark.mllib.recommendation.ALS
  2. val ratings = rawRatings.map { case Array(user, movie, rating) => Rating(user.toInt, movie.toInt, rating.toDouble) }
  1. scala> ratings.first()
  2. #输出 res24: org.apache.spark.mllib.recommendation.Rating = Rating(196,242,3.0)

  1. val model = ALS.train(ratings, 50, 10, 0.01)

结果,每个用户和每部电影都会有对应的因子数组(分别含943个和1682个因子)

  1. scala> model.userFeatures
  2. res26: org.apache.spark.rdd.RDD[(Int, Array[Double])] = users MapPartitionsRDD[454] at mapValues at ALS.scala:269
  3.  
  4. scala> model.userFeatures.count
  5. res27: Long = 943
  6.  
  7. scala> model.productFeatures.count
  8. res28: Long = 1682

1. 从MovieLens 100k数据集生成电影推荐

MLlib的推荐模型基于矩阵分解,因此可用模型所求得的因子矩阵来计算用户对物品的预计评级

  1. scala> val predictedRating = model.predict(789, 123)
  2. predictedRating: Double = 2.4585387904925593

predict 函数同样可以以 (user, item) ID对类型的RDD对象为输入,这时它将为每一对都生成相应的预测得分。我们可以借助这个函数来同时为多个用户和物品进行预测。

为某个用户生成前K个推荐物品 , 可借助 MatrixFactorizationModel 所提供的recommendProducts 函数来实现。该函数需两个输入参数: user 和 num 。其中 user 是用户ID,而 num 是要推荐的物品个数。

  1. val userId = 789
  2. val K = 10
  3. val topKRecs = model.recommendProducts(userId, K)
  4. println(topKRecs.mkString("\n"))
  5.  
  6. scala> println(topKRecs.mkString("\n"))
  7. Rating(789,179,5.5976762921826575)
  8. Rating(789,1022,5.431324881530808)
  9. Rating(789,182,5.4204134645044615)
  10. Rating(789,942,5.340233945688523)
  11. Rating(789,188,5.254370757962667)
  12. Rating(789,183,5.208694711418427)
  13. Rating(789,428,5.1758907376213825)
  14. Rating(789,198,5.150276931639322)
  15. Rating(789,59,5.123932678029936)
  16. Rating(789,715,5.103514906503706)

 2. 检验推荐内容

读入电影数据,导入为Map[Int, String] 类型,即从电影ID到标题的映射

  1. val movies = sc.textFile("/user/common/ml-100k/u.item")
  2. val titles = movies.map(line => line.split("\\|").take(2)).map(array=> (array(0).toInt,array(1))).collectAsMap()

查看123对应的电影的名称

  1. scala> titles(123)
  2. res30: String = Frighteners, The (1996)
  1. val moviesForUser = ratings.keyBy(_.user).lookup(789)
  2. println(moviesForUser.size) #这个用户对33部电影做过评级
  3. #获取评级最高的前10部电影
  4. scala> moviesForUser.sortBy(-_.rating).take(10).map(rating => (titles(rating.product),rating.rating)).foreach(println)
  5. (Godfather, The (1972),5.0)
  6. (Trainspotting (1996),5.0)
  7. (Dead Man Walking (1995),5.0)
  8. (Star Wars (1977),5.0)
  9. (Swingers (1996),5.0)
  10. (Leaving Las Vegas (1995),5.0)
  11. (Bound (1996),5.0)
  12. (Fargo (1996),5.0)
  13. (Last Supper, The (1995),5.0)
  14. (Private Parts (1997),4.0)
  15.  
  16. scala> topKRecs.map(rating => (titles(rating.product), rating.rating)).foreach(println)
  17. (Clockwork Orange, A (1971),5.5976762921826575)
  18. (Fast, Cheap & Out of Control (1997),5.431324881530808)
  19. (GoodFellas (1990),5.4204134645044615)
  20. (What's Love Got to Do with It (1993),5.340233945688523)
  21. (Full Metal Jacket (1987),5.254370757962667)
  22. (Alien (1979),5.208694711418427)
  23. (Harold and Maude (1971),5.1758907376213825)
  24. (Nikita (La Femme Nikita) (1990),5.150276931639322)
  25. (Three Colors: Red (1994),5.123932678029936)
  26. (To Die For (1995),5.103514906503706)

Spark学习笔记——构建基于Spark的推荐引擎的更多相关文章

  1. Spark学习笔记2(spark所需环境配置

    Spark学习笔记2 配置spark所需环境 1.首先先把本地的maven的压缩包解压到本地文件夹中,安装好本地的maven客户端程序,版本没有什么要求 不需要最新版的maven客户端. 解压完成之后 ...

  2. Spark学习笔记--Linux安装Spark集群详解

    本文主要讲解如何在Linux环境下安装Spark集群,安装之前我们需要Linux已经安装了JDK和Scala,因为Spark集群依赖这些.下面就如何安装Spark进行讲解说明. 一.安装环境 操作系统 ...

  3. Spark学习笔记1:Spark概览

    Spark是一个用来实现快速而通用的集群计算的平台. Spark项目包含多个紧密集成的组件.Spark的核心是一个对由很多计算任务组成的,运行在多个工作机器或者是一个计算集群上的应用进行调度,分发以及 ...

  4. Spark学习笔记5:Spark集群架构

    Spark的一大好处就是可以通过增加机器数量并使用集群模式运行,来扩展计算能力.Spark可以在各种各样的集群管理器(Hadoop YARN , Apache Mesos , 还有Spark自带的独立 ...

  5. Spark学习笔记——构建分类模型

    Spark中常见的三种分类模型:线性模型.决策树和朴素贝叶斯模型. 线性模型,简单而且相对容易扩展到非常大的数据集:线性模型又可以分成:1.逻辑回归:2.线性支持向量机 决策树是一个强大的非线性技术, ...

  6. Spark学习笔记6:Spark调优与调试

    1.使用Sparkconf配置Spark 对Spark进行性能调优,通常就是修改Spark应用的运行时配置选项. Spark中最主要的配置机制通过SparkConf类对Spark进行配置,当创建出一个 ...

  7. Spark 学习笔记之 MONGODB SPARK CONNECTOR 插入性能测试

    MONGODB SPARK CONNECTOR 测试数据量: 测试结果: 116万数据通过4个表的join,从SQL Server查出,耗时1分多.MongoSparkConnector插入平均耗时: ...

  8. spark学习笔记总结-spark入门资料精化

    Spark学习笔记 Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用. ...

  9. Spark学习笔记-GraphX-1

    Spark学习笔记-GraphX-1 标签: SparkGraphGraphX图计算 2014-09-29 13:04 2339人阅读 评论(0) 收藏 举报  分类: Spark(8)  版权声明: ...

随机推荐

  1. [BZOJ2238]Mst

    [BZOJ2238]Mst 题目大意: 给你一个\(n(n\le50000)\)个点,\(m(m\le10^5)\)条边的无向带权图.\(q(q\le10^5)\)次询问,每次询问去掉一条边后图能否连 ...

  2. java的关键字与保留字

    1,Java 关键字列表 (依字母排序 共50组): abstract, assert, boolean, break, byte, case, catch, char, class, const(保 ...

  3. JavaScript:谈谈let和const

    最近接触到ES6的一些相关新特性,想借let和const两个命令谈谈JavaScript在变量方面的改进. 由于let和const有很多相似之处,我们就先说一说let吧. 1. let添加了块级作用域 ...

  4. WCF、WebAPI、WCFREST和Web服务的差异 ASP.NETMVC和ASP.NETWebAPI的差异

    WCF.WebAPI.WCFREST和Web服务的差异: Web服务 它是基于SOAP和XML的形式返回数据. 它仅支持HTTP协议. 它是开放源,但是不消耗任何客户端可以同时理解XML. 它可以仅在 ...

  5. C#-MaximumSIze,MinimumSize,窗口默认大小范围---ShinePans

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  6. iOS 10.3下使用Fiddler抓取HTTPS请求

    最近使用Fiddler抓取手机上的HTTPS请求时,遇到一个问题.设置完之后,访问HTTPS的页面,却得到一个错误 网络出错,轻触屏幕重新加载:-1202 (如下图所示)   我印象中,之前都好好的, ...

  7. 【CSS Demo】纯 CSS 打造 Flow-Steps 导航

    low-Steps 导航效果常用于需要表示执行步骤的交互页面,效果如下: 步骤一 步骤二 步骤三   通常使用图片来实现 Flow-Steps 效果,但此方法的灵活性不足,当内容变化较大时就可能需要重 ...

  8. JSTL标签 使用总结,foreach

    最近开发一个网站,经常使用JSTL,这种语法与以前的不同,开始用着非常吃力,今天总结一下,供大家参考. 一.前言 JSTL全名为JavaServer Pages Standard Tag Librar ...

  9. virtualbox centos安装增强工具和Centos与VirtualBox共享文件夹设置

    VirtualBox 大家都习惯性把它简称为 Vbox ,比 VM 的体积小.开源.速 度快.不过在使用 VirtualBox  在虚拟机中安装 CentOS 之后,不能直接运行安装好 Virtual ...

  10. php 实现发送微信模板消息(转)

    <?php namespace Org\Weixin; /** * Created by PhpStorm. * User: StandOpen * Date: 15-1-7 * Time: 9 ...