当前课程知识点:高级大数据系统 > Machine Learning System > Case Study: Recommendation > Video
下面我们会通过这个
一个具体的推荐的例子
来告诉大家
怎么样用mahout的
这种分布式的这种机器学习系统
来实现一个具体的
这种机器学习的一个任务
那么为了帮助
这个系统课上的同学
了解一下推荐
我们准备了一个简单例子
让大家体会一下
在这种有数据的这样一个情况下
到底是怎么样去做推荐的
那么推荐实际上
是一个非常典型的应用
那么从这种互联网诞生到现在
实际上有大量的这个研究都去
集中在怎么样提供好的
这种服务质量的推荐任务上
那么推荐它本质上
有些什么样的考虑
实际上我们就是想要挖掘出用户
对于某一些他之前没有看过读过
或者听过的这些书电影或者音乐
他的兴趣会有多强
本质上
我们是要把这个东西挖掘出来
那么这个发展
实际上经历了一系列的探索
从最开始
我们要去了解这个内容本身
比如说我们发现一个用户
他喜欢听古典音乐
我们就会去把其他的古典音乐
推荐给用户
然后从这条脉络
发展出了一系列的这个研究工作
那么到另外一种研究方向
就是说
我可以不知道这个用户是谁
我也不知道这个内容到底是什么
但是我知道用户和用户之间的
这样一个关联
利用这样的关联
我也能做到推荐
那么这是推荐系统
从内容到这种关联
它经历了一系列发展
那么从算法上
它也从原始的这种内容的相似度
发展到之后的协同过滤
挖掘用户对相同内容评判的
这种相似度
那么以及到后面的
这种矩阵的分解
那么在工业界也得到了
这种广泛的应用
那么这堂课
我们会用一个比较简单的
基于这种用户相似度
对内容相似度的
这种评分的这样一个机制
来做推荐的这样一个例子
帮助大家理解
如果我们要做并行的话
我们大概会有什么样的挑战
那么在这个里面
它的一个总的一个方法叫做
这个协同过滤collaborative filtering
那么协同过滤
有很多种这种实现方式
它核心的思想是要发现用户
或者内容之间的相似度
发现的过程中
我们不需要去了解用户的特征
和内容的特征
我们只需要去了解其他用户
或者其他的内容
在这上面的一个相似的一个投影
协同过滤
今天在大量的系统中
被得到了广泛的使用
它大概可以分成三类
基于用户的
通过用户对内容的评分
或者是点击的记录
我们去发现用户和用户的相似度
比如两个用户
他们同时看过三部电影
那么我们就说
这两用户在电影的口味上
可能具有一定的相似度
它本质上是这样一个原理
通过这种相似度
如果其中一个用户
看过一个新电影
而另外一个用户没有看过
我们可能就会把这个新电影
推荐给另外一个用户
那么item base实际上
它是把用户反过来
我们想通过用户的点击情况
发现内容的相似度
我们不需要去看内容本身
我们不管它是一个古典
或者是一个现代的音乐
我们只需要去看它的用户
比如两个内容a和b
他们同时被三个人看过
那么这三个人我们分别是一二三
这时候
如果这个内容a又被第4个用户
用户4看过
我们可能有理由相信
这个第4个用户
可能也会喜欢另外一个内容b
第三种简单的方法就是slope-one
就是我们在参考的时候
仅仅是去参考用户对不同内容的
打分的差值
所谓的slope
这是协同过滤的
一个比较简单的方法
这也是我们今天想通过这个例子
来给大家普及一下
推荐基本的这样一个思路
我们来看slope-one
在这个例子当中
实际上我们有这样的一个表格
这个表格是一系列的顾客
他们对不同的这个商品
给了一个评分
比如这个用户对item A
有一个5分
有一个三分
然后这个用户有这样的一些评分
那么在这个表格当中
存在着一些表象
比如说这里是他并没有去标的
那么在实际的情况中
这种没有标的内容
可能要远远的多于已经标的内容
那么整个矩阵会呈现出
标过的打过分这个内容的
这种稀疏性
这个矩阵是个非常稀疏的
一个矩阵
那我们的例子
仅仅有这两个地方没有标出来
那我们就想通过已经打分的内容
把没有打分的内容给猜出来
如果我们能猜出这个
我们就可以根据打分的高或者低
来对用户进行推荐
我们来看通过这个slope-one
我们是怎么样来做到这一点的
我们在slope-one里面
有一个假设就是用户的评分
他们会有一致性的偏好
那我们利用这种一致性的偏好
来计算出没有打分的位置
应该估计会是多少分
我们来看这个过程
它是怎么样进行的
我们在做slope-one的时候
每一次我们仅对这个
不同的item之间进行参考
在我们这个例子里面
当我们必经参考来
对a的这个没有打分的位置
进行猜测的时候
我们会把另外一个item
给隐藏掉
或者另外多个item
给隐藏掉
那我们仔细观察这两列
它具有什么样的特性呢
就是John对a的打分是5
对b的打分是3
然后Mark对a的打分是3
对b的打分是4
那我们就会发现这样的差值
也许能够用来帮助我们
预测出新的位置来
那具体是怎么预测的呢
我们来这样看
这边有两个内容
我们把它叠加起来之后是8
这边有两个内容叠加起来是7
那么8比7大了1
而这个1是由两个人贡献出来的
我们把它除以二等于0.5
也就是a这个item
会比b这个item
在已经有的这个参考的数据点上
平均高0.5
那么我们就有理由去猜测
lucy打的时候
可能也会和其他用户打出来的
这个差值一致
也就是说
他打的分可能会是2加上0.5
这样一个值
那么会和其他的是匹配上的
那这就是我们整个计算的过程
我们首先看出这个其他用户
打分的用户
在这个item上
打分的这样一个差值
因为每次我们只参与一个
这个新的item
它的这样一个评估
那我们得到这个差值
再把这个差值用到
给定要猜测的这个用户
和item上
那么我们得到一个
新的这样一个更新
在我们具体的例子里面
就是将这个差值的平均值
加到这个已打分的项目上
来猜测出未打分的这样一个项目
那么相同的办法
我们也可以把它运用到另外一列
或者说另外的其他列上
我们这边只有三列
那我们把这个数据
运用到这一列的时候
计算方法是一致的
我们发现已经打分的只有一列
那这一列的差值是三
所以我们就有理由
把没有打分的这一列
把它加上一个
加上一个差值三
得到没有打分的一个猜测
也就是说
通过item c
进行猜测的时候
我们会给他一个八这样一个分值
那在下面我们已经可以看得到
这个过程会这个不断的进行
把所有的这个列拿出来做参考
看看它最后会打多少分
那么这个过程进行之后呢
我们会需要对所有的结果
进行一个整合
整合的办法
在slope-one里面也很简单
我们只需要用参考过的这个
item的数量
进行一个加权就可以了
那么在我们这里面
这个加权的办法是这样的
我们刚刚说通过
item b这一列
进行参考的时候
需要给它2.5分
那我们参考的时候
用了两个用户的数据
所以我们给它的权重是2
那么通过item 3
对A进行评估的时候
我们用了只有一个有效数据
所以我们乘的这个权重是一
那么最后
对它进行加权平均
得到值是4.3
也就说我们猜出了
lucy对于item a
打的这个分
可能是这个4.3分
有了这个之后
实际上我们就可以迭代的进行
我们可以进一步算出其他的用户
会打什么样的分
当然这个过程
也依然是会有一些技巧的
比如说我们对这个矩阵
填充到什么样的程度
我们才能够进行这样的操作
比如说这个矩阵异常稀疏的话
可能我们这样的方法
得到的结果就是一个
不太可信的一个结果
因为我们可能参考了
用户非常随机打出来的
这样一个分值
同时大家也可以去考虑这种方法
它的其他的局限性
比如说这种打出来的这个值
可能并不具有什么代表性
因为我们猜测出来的分值
它基于的假设是用户会有
一致性的这种偏好
那这种偏好
在你的应用中到底存不存在
这大家去想的
当然slope-one是
推荐最初级的一个办法
是帮助我们去理解这个过程
可以并行的这样一个方法
那它在实际系统中可能并不会
真实的去用到
但大家需要注意的是
slope-one
大家可以想象
其实它具有很好的这样一个
并行性 对吧
每一列我们可以单独的去算
比如说我们可以把Map出去
我们可以让每个Map
去度固定的一些列
然后把这些列读出来之后
我们可以去做一个加和
做一个平均
就可以得到当前这个列
对于未知列它的一个猜测
然后我们在做
reduce的时候
可以把这些列的值做一个叠加
如果我们做猜测的过程的数据
会非常大
然后计算的过程如果不是用
简单的加法
而是用一些比较复杂的
操作的时候
那么Map reduce
就可以简单的
把这个任务给并行化
提高这个在并行环境底下
它的这样一个运算的一个速度
我们通过slope-one向大家介绍
很多的这种推荐算法
实际上是可以并行的
那么并行了之后
我们就可以利用到
分布式文件系统
可以利用到hdoop
它的一些并行的特性
可以来达到一个比较好的
计算速度
那么实际上这个思路
可以推广到其它的算法
那么我们在这里面略去了
一些复杂算法的并行的一个过程
大家可以去练习
如果当大家用到mahout或者
其他系统里面的一些算法的时候
可以去练习一下
怎么样用spark
怎么样用mapreduce
来做这样一个任务
当大家知道这个原理之后
大家在做系统真正优化的时候
可能会有更多的体验
那么我们后面会来真实的
给大家看
从代码层面我们怎么样去
用mahout
来实现一个推荐的系统
-What is big data and what is big data system?
--Video
-Problems in big data systems?
--Video
-Overview of the course
--Video
-Principles of big data system design
--Video
-Manipulating Data on Linux
--Video
--Video
--Video
-Basics of Linux Data Processing--Manipulating Data
-Running Commands on a Single Machine
--Video
-Running Commands on a Single Machine--作业
-Using a Linux Cluster
--Video
-Using a Linux Cluster--作业
-Storage for Big Data Computing: Distributed file system
--Video
-Storage for Big Data Computing: Distributed file system--作业
-File system and GFS
--Video
-File system and GFS--作业
-Understanding HDFS using Legos
--Video
-Understanding HDFS using Legos--作业
-File System Implementation and DFS
--Video
--Video
-File System Implementation and DFS--作业
-What is MapReduce and why
--Video
-What is MapReduce and why
-Learn MapReduce by playing with cards
--Video
-Processing pattern
--Video
-Processing pattern--作业
-Hadoop
--Video
-Hadoop--作业
-Algorithms in MapReduce
--Video
-Algorithms in MapReduce--作业
-Tutorial
--Video
-Background
--Video
-Background--作业
-Spark
--Video
-Spark--作业
-Use Spark for data mining
--Video
-Use Spark for data mining--作业
-Spark data processing
--Video
-Spark data processing--作业
-Experiment in Spark
--Video
-Experiment in Spark--作业
-Introduction to streaming data processing
--Video
-Introduction to streaming data processing--作业
-Storm
--Video
--Video
--Video
-Storm--作业
-Spark streaming
--Video
--Video
-Spark streaming--作业
-NoSQL introduction
--Video
-NoSQL introduction--作业
-Common Advantages
--Video
-Common Advantages--作业
-Bigtable
--Video
-Bigtable--作业
-Master Startup
--Video
-Master Startup--作业
-HBase
--Video
-HBase--作业
-What is GraphDB and Graph data processing
--Video
-What is GraphDB and Graph data processing--作业
-Graph systems
--Video
-Graph systems
-Example of a GraphDB
--Video
-Example of a GraphDB--作业
-Mahout
--Video
-Mahout--作业
-Case Study: Recommendation
--Video
-Case Study: Recommendatio作业
-Recommendation in Mahout
--Video
-Recommendation in Mahout--作业