推荐模型

推荐模型的种类分为:

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

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

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

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

3.矩阵分解:

3.1. 显式矩阵分解

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

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

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

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

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

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

启动Spark-shell

val rawData = sc.textFile("/user/common/ml-100k/u.data")
rawData.first()

#输出 res1: String = 196    242 3   881250949
#该数据由用户ID、影片ID、星级和时间戳等字段依次组成

提取出前三个字段

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

使用ALS模型进行训练

import org.apache.spark.mllib.recommendation.ALS
val ratings = rawRatings.map { case Array(user, movie, rating) => Rating(user.toInt, movie.toInt, rating.toDouble) }

scala> ratings.first()
#输出 res24: org.apache.spark.mllib.recommendation.Rating = Rating(196,242,3.0)

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

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

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

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

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

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

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

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

val userId = 789
val K = 10
val topKRecs = model.recommendProducts(userId, K)
println(topKRecs.mkString("\n"))scala> println(topKRecs.mkString("\n"))
Rating(789,179,5.5976762921826575)
Rating(789,1022,5.431324881530808)
Rating(789,182,5.4204134645044615)
Rating(789,942,5.340233945688523)
Rating(789,188,5.254370757962667)
Rating(789,183,5.208694711418427)
Rating(789,428,5.1758907376213825)
Rating(789,198,5.150276931639322)
Rating(789,59,5.123932678029936)
Rating(789,715,5.103514906503706)

 2. 检验推荐内容

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

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

查看123对应的电影的名称

scala> titles(123)
res30: String = Frighteners, The (1996)

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

转载于:https://www.cnblogs.com/tonglin0325/p/6786377.html

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

  1. Spark学习笔记1——第一个Spark程序:单词数统计

    Spark学习笔记1--第一个Spark程序:单词数统计 笔记摘抄自 [美] Holden Karau 等著的<Spark快速大数据分析> 添加依赖 通过 Maven 添加 Spark-c ...

  2. Spark学习笔记[1]-scala环境安装与基本语法

    Spark学习笔记[1]-scala环境安装与基本语法   正所谓工欲善其事必先利其器,Spark的开发语言不是java而是scala,虽然都是运行于JVM,但是两门语言的基本特性还是有些不一样,这里 ...

  3. spark 学习笔记

    spark 学习笔记 spark介绍 Spark是是一种快速通用的集群计算系统,它的主要特点是能够在内存中进行计算.它包含了 spark 核心组件 spark-core,用于 SQL 和结构化处理数据 ...

  4. Spark学习之路一——Spark基础及环境搭建

    Spark学习之路一--Spark基础及环境搭建 文章目录 一. Spark 概述 1.1 概述 1.2 优势特性 1.2.1 运行速度快 1.2.2 容易使用 1.2.3 通用性 1.2.4 运行模 ...

  5. 尚硅谷大数据技术Spark教程-笔记01【Spark(概述、快速上手、运行环境、运行架构)】

    视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01[Spark(概述.快速上手.运行环境.运行架构)] 尚硅谷大数据技术Spark教 ...

  6. Spark学习一 ——初步认识Spark

    1.什么是Spark Apache Spark™是用于大规模数据处理的统一分析引擎. 是基于内存计算的大数据并行计算框架 spark是一个实现快速通用的集群计算平台.它是由加州大学伯克利分校AMP实验 ...

  7. 学习笔记之——基于深度学习的图像超分辨率重建

    最近开展图像超分辨率( Image Super Resolution)方面的研究,做了一些列的调研,并结合本人的理解总结成本博文~(本博文仅用于本人的学习笔记,不做商业用途) 本博文涉及的paper已 ...

  8. 学习笔记之——基于matlab的数字通信系统(2)之离散信号的傅里叶分析

    关于连续信号的傅里叶分析,可以参考博文<学习笔记之--基于matlab的数字通信系统(1)&连续信号的傅里叶分析> 目录 离散时间信号的傅里叶变换(DTFT) 连续时间信号的抽样- ...

  9. C#入门学习笔记(基于刘铁锰老师C#入门2014教学视频)【1】

    C#入门学习笔记(基于刘铁锰老师C#入门2014教学视频)[1] 前言: 本笔记作为记录我从零开始学习C#的记录,为了unity的兴趣爱好自学一门C#,也算是寒假为自己充个电,希望这个寒假可以坚持下去 ...

  10. C#入门学习笔记(基于刘铁锰老师C#入门2014教学视频)【2】

    C#入门学习笔记(基于刘铁锰老师C#入门2014教学视频)[2] 初识类和名称空间 前言: 本笔记作为记录我从零开始学习C#的记录,为了unity的兴趣爱好自学一门C#,也算是寒假为自己充个电,希望这 ...

最新文章

  1. linux nginx php 目录权限,Nginx环境中配置网站目录权限设置
  2. 维纳滤波原理(Wiener Filter)
  3. 用JavaScript中的示例进行fill()函数
  4. OJ1029: 三角形判定
  5. 计算机视觉基础:自适应阈值分割(Computer Vision Fundamentals: Adaptive Threshold Segmentation)
  6. 网络端口扫描器程序设计
  7. Unix-Center.Net需要你的帮助
  8. 什么软件测试情侣头像,情侣头像搜索另一半 另一半情头查找器在线匹配 - 株洲娱乐网...
  9. 量子笔记:量子计算祛魅
  10. MSOCache文件夹能否删除?
  11. 国内免备案服务器有哪些?
  12. 【Codeforces】Chloe and the sequence (递归)
  13. Google推出GDrive免费云存储服务
  14. Vue3二维码生成(简洁明了)
  15. Unity3d开发之二十:闪电
  16. C++运算符重载(类内、外重载)
  17. 前端开发实习生-实习日志
  18. 八皇后问题动态演示_Qt5实现
  19. LAMP环境搭建与配置(一)
  20. linux 网络不可达 网卡,我的服务器日志中的linux – (网络不可达)错误

热门文章

  1. Joda-Time简单使用
  2. 2.10.PHP7.1 狐教程-【PHP 函数】
  3. linux ubuntu/centos git 客户端编译安装升级
  4. Android 资源(Resources)访问
  5. Python_作业_Day_1
  6. 第二阶段冲刺(第十天)
  7. 个人收藏的移动端网页布局rem解决方案
  8. javascript焦点图自动播放
  9. HTTP-meta标签
  10. .NET开发设计模式-获取某个接口下面所有的派生类