[机器学习笔记]Note14--推荐系统

继续是机器学习课程的笔记,本节课将介绍推荐系统的内容。

问题形式化

推荐系统是机器学习的一个非常重要的应用,在很多音乐、购物等网站都有推荐系统,如豆瓣,淘宝,网易云音乐等都是有使用到推荐系统的,因此推荐系统的应用范围非常广泛。

我们从一个例子开始定义推荐系统的问题。

假设我们是一个电影供应商,我们有5部电影和4个用户,我们要求用户为电影评分。

这里写图片描述

由上图可以知道,前3部电影是爱情片,后两部是动作片,用户Alice和Bob似乎更倾向于爱情片,而其他两位用户Carol和Dave似乎更倾向于动作片。并且没有一个用户给所有的电影都打过分,我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并依此作为推荐的依据。

下面引入一些标记:

  • nu代表用户的数量
  • nm代表电影的数量
  • r(i,j)=1表示用户i给电影j评过分
  • y(i,j)代表用户i给电影j的评分,在上图中,其评分范围是0~5分
  • mj代表用户j评过分的电影的总数

基于内容的推荐系统

在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这些数据就是有关这些东西的特征。

在我们的例子中,我们可以假设每部电影都有两个特征,如x1代表电影的浪漫程度,x2代表电影的动作程度。

这里写图片描述

如上图所示,每部电影都有一个特征向量,如x(1)=[0.9,0]是第一部电影的特征向量。

下面我们可以基于这些特征来构建一个推荐系统算法。

假设我们使用线性回归模型,我们可以针对每个用户都训练一个线性回归模型,如θ(1)是第一个用户的模型的参数。

于是,我们有:
* θ(j)是用户j的参数向量
* x(i)是电影i的特征向量

对于用户j和电影i,我们预测评分为:(θ(j))T(x(i))

对于用户j,该线性回归模型的代价函数为预测误差的平方和,加上归一化项:

minθ(j)12i:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2k=1n(θ(j)k)2

其中,i:r(i,j)=1表示我们只计算用户j评过分的电影。在一般的线性回归模型中,误差项和归一化项应该都是乘以12m,在这里我们将m去掉,并且不对偏倚项θ0进行归一化处理。

上面的代价函数是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:

minθ(1),,θ(nu)12j=1nui:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nuk=1n(θ(j)k)2

如果我们要用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:

θ(j)k=θ(j)kαi:r(i,j)=1((θ(j))Tx(i)y(i,j))x(i)k (for k=0)θ(j)k=θ(j)kα(i:r(i,j)=1((θ(j))Tx(i)y(i,j))x(i)k+λθ(j)k) (for k0)

协同过滤算法

接下来介绍一种可以自行学习所要使用的特征的算法–协同过滤算法

在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有了用户的参数,我们可以学习得出电影的特征。也就是给出参数θ(1),,θ(nu),来学习x(1),,x(nm),那么优化代价函数的公式如下所示:

minx(1),,x(nm)12j=1nmi:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nmk=1n(x(i)k)2

但是如果我们即没有用户的参数,也没有电影的特征,这两种方法都不可行了。而协同过滤算法可以同时学习这两者。

我们的优化目标便改为同时针对xθ进行。

J(x(1),,x(nm),θ(1),,θ(nu))=12i:r(i,j)=1((θ(j))Tx(i)y(i,j))2+λ2j=1nmk=1n(x(i)k)2+λ2j=1nuk=1n(θ(j)k)2

对代价函数求偏导数的结果如下:
x(i)k=x(j)kα(i:r(i,j)=1((θ(j))Tx(i)y(i,j))θ(j)k+λx(i)k)θ(j)k=θ(j)kα(i:r(i,j)=1((θ(j))Tx(i)y(i,j))x(i)k+λθ(j)k)

注意,在协同过滤算法中,我们通常不使用偏倚项,如果需要的话,算法会自动学得。

协同过滤算法使用步骤如下:

  1. x(1),,x(nm),θ(1),,θ(nu)初始化为一些小的随机值
  2. 使用梯度下降算法最小化代价函数
  3. 在训练完算法后,我们预测(θ(j))T(x(i))为用户j给电影i的评分

通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为给用户推荐电影的依据。

低秩矩阵分解(Low Rank Matrix Factorization)

接下来会介绍协同过滤算法的向量化实现,以及使用该算法可以做的其他事情,比如正在观看一部电影,能否推荐另一部相关的电影。

首先还是利用初始给出的电影的例子,如下图所示:

这里写图片描述

矩阵Y是一个5×4的矩阵,代表的就是左边4个用户分别给5部电影的评分,其中?号表示该用户没有看过该电影,因此没有打分。根据这个矩阵,可以根据评分公式(θ(j))T(x(i)),得到如下图所示的评分矩阵:

这里写图片描述

上述预测评分矩阵中的位置(i,j)表示的就是用户j给电影i的评分,它的值就是(θ(j))T(x(i))。因而,这个矩阵第一行代表的就是所有用户分别给第一部电影的评分,即第i行表示所有用户给电影i的评分,而第j列表示用户j给所有电影的评分。

这里可以使用向量化实现,如定义一个Xθ矩阵,分别如下所示定义:

X=(x(1))T(x(2))T(x(nm))Tθ=(θ(1))T(θ(2))T(θ(nu))T

然后预测评分矩阵就等于 XθT

这里由于XθT的低秩属性,因此协同过滤算法也被称为低秩矩阵分解。

接下来就介绍如何寻找相关的电影,对于一部电影i,我们根据协同过滤算法可以学习到一个特征向量x(i),在这个向量中包含了x1,x2,,xn个特征,这些特征包含了电影的重要数据,但一般很难进行数据可视化,同时也可能是人很难解释的这些特征实际上是什么,但这种特征学习方法得到的特征却是可以帮助我们进行推荐。

例如,如果一个用户正在观看电影x(i),我们可以寻找另一部电影x(j),依据是两部电影的特征向量之间的距离||x(i)x(j)||的大小。当这个距离很小的时候,表示两部电影是非常相似的。

均值归一化

最后介绍均值归一化,它有时候可以使得推荐算法运行得更好。

首先看下如下面所示的用户评分数据:

这里写图片描述

这里新增一个用户Eve,并且Eve没有为任何电影评分,那么我们以什么为依据为Eve推荐电影呢?

我们首先需要对结果Y矩阵进行均值归一化处理,将每一位用户对某一部电影的评分减去所有用户对该电影评分的平均值,如下所示:

这里写图片描述

上图中μ矩阵就是一个均值矩阵,第i行表示所有用户对电影i的评分的平均值。进行均值归一化后,我们将使用最右边的新的Y矩阵来训练算法。

如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测值为(θ(j))T(x(i))+μi

对于Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。

此外,如果某部电影没有评分,也可以使用这种均值归一化的方法,只是变成对每列数据进行均值归一化。

小结

本节课,介绍了机器学习一个很重要的应用–推荐系统,介绍了其基本的定义以及使用的算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409042.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

手机应用开发的方式不能完全套用到iPad上

对于一些复杂的游戏,许多人已经不能满足于手机小巧的屏幕,大屏的画面感就成为许多人选择平板电脑的重要因素。当越来越多的80后开始为人父母,孩子们从大人手中得到的礼物,也不再局限于零食、玩具和游乐场入场券。随着智能手机的普…

java面向对象编程思想_Java面向对象编程思想

面向对象三个特征:封装、继承、多态封装:语法:属性私有化(private)、提供相对应的get/set 的方法进行访问(public)、在set/get的方法中对属性的数据 做相对应的业务逻辑的判断思想:封装外面的程序不能直接访问本类的属性&#xff…

[机器学习笔记]Note15--大规模机器学习

继续是机器学习课程的笔记,本节内容主要是介绍大规模机器学习的内容。 大型数据集的学习 对于一个过拟合的模型,增加数据集的规模可以帮助避免过拟合,并获得一个更好的结果。 但是对于一个大规模的数据,比如有100万个数据量的训…

Linux管道和重定向 ---多命令协作

管道及重定向就是Linux多命令协作的基础机制Linux的Shell对数据流进行以下分类定义:   stdin 标准输入 编号为:0 默认:键盘  stdout 标准输出 编号为:1 默认:终端  stderr 标准错误 编号为&…

java 骰子_基本随机滚动骰子Java

5 个答案:答案 0 :(得分:12)Random.nextInt()具有不可预测的行为 - 它可以为整数生成所有可能的值,包括负数。改为使用Random.nextInt(numSides) - 它将从[0,numSides]返回一个整数,即包括0并排除numSides。要获得所需的功能[1&am…

[机器学习笔记]Note16--应用示例:图像文字识别

继续是机器学习课程的笔记,本节课是最后一节内容了,主要是介绍一个应该–图中文字的识别。 问题描述和流程图 图像文字识别应用就是从给定的图片中识别文字。这比从一份扫描文档中识别文字要复杂得多。一个例子图片如下所示: 为了完成这样的…

java中文处理_Java的中文乱码处理

1,设置编译器的编码(Eclipse)、Window >preferences>Workspace> Text file encoding下的Other设置为UTF-8设置jsp页面的编码(Eclipse)Window >preferences>Web> JSPFile>Encoding设置为UTF-82.从前端获取的数据乱码(1)request.setCharacterEnc…

[线性代数]Note2--矩阵消元

第二节介绍矩阵消元的知识. 消元法 首先是给出一个例子来说明消元法的使用,例子如下所示: ⎧⎩⎨x2yz23x8yz124yz2\begin{cases} x+2y+z=2 \\ 3x+8y+z=12 \\4y+z=2 \end{cases}用矩阵表示就是 A⎡⎣⎢130284111⎤⎦⎥b⎡⎣⎢2122⎤⎦⎥A = \left[ \be…

error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup

一、问题描述: error LNK2019: unresolved external symbol _WinMain16 referenced in function ___tmainCRTStartup 二、产生原因: 1. 你用vc建了一个控制台程序,它的入口函数应该是main, 而你使用了WinMain.2. 你用vc打开了一个.c/.cpp 文…

python小老鼠编程_邯郸pythonnot学习费用多少

邯郸pythonnot学习费用多少更新时间:2020-08-02 12:49:04注意:如果出现错误,可能是因为安装时未勾选AddPython3.5toPATH选项,此时卸载Python后重新安装时勾选AddPython3.5toPATH选项即可。1.2Mac中安装Python3Mac系统中自带了Pyth…

[线性代数]Note3--乘法和逆矩阵

继续是线性代数的学习笔记,第三节课乘法和逆矩阵 矩阵乘法 首先是对于矩阵相乘,如矩阵A和B相乘得到C,即A*BC;那么如果要得到矩阵C的一个元素,如c34,其求解如下所示: c34a31∗b14a32∗b24…∑k1na3kbk4c_{34} = a_{3…

数学/sgu 130 Circle

题意 一个圆上有2k点,请输出点于点之间连线使得所分区域块数最小的方案总数以及区域数 分析 2k个点最少能把平面分成k1的区域,易证; 至于方案数,利用递推和乘法原理 令f[i]表示2i个点时的方案数,f[0]f[1]1,则f[i]sigma…

java多线程调用nsq消费_spark-streaming连接消费nsq

spark-streaming连接消费nsq目的使用 NSQ作为消息流使用 spark-streaming 进行消费对数据进行清洗后,保存到hive仓库中连接方案1、编写Spark Streaming Custom Receivers(spark-streaming 自定义接收器),详细见文档2、使用 nsq 官方提供的Java程序连接包…

[线性代数]Note4--A的LU分解转置-置换-向量空间

继续是线性代数的学习笔记,这次的笔记包含第四、五、六节三节课的内容。 第四节课是介绍A的LU分解。A的LU分解是指将矩阵A分解成一个下三角矩阵和一个上三角矩阵的乘积。其主要应用在数值分析中,用来解线性方程、求反矩阵或者计算行列式。 第五节课是介…

java:自定义数据库连接池

http://idata.blog.51cto.com/4581576/1159243转载于:https://www.cnblogs.com/fengjian/archive/2013/03/22/2975366.html