[机器学习笔记]Note14--推荐系统
继续是机器学习课程的笔记,本节课将介绍推荐系统的内容。
问题形式化
推荐系统是机器学习的一个非常重要的应用,在很多音乐、购物等网站都有推荐系统,如豆瓣,淘宝,网易云音乐等都是有使用到推荐系统的,因此推荐系统的应用范围非常广泛。
我们从一个例子开始定义推荐系统的问题。
假设我们是一个电影供应商,我们有5部电影和4个用户,我们要求用户为电影评分。
由上图可以知道,前3部电影是爱情片,后两部是动作片,用户Alice和Bob似乎更倾向于爱情片,而其他两位用户Carol和Dave似乎更倾向于动作片。并且没有一个用户给所有的电影都打过分,我们希望构建一个算法来预测他们每个人可能会给他们没看过的电影打多少分,并依此作为推荐的依据。
下面引入一些标记:
- nun_u代表用户的数量
- nmn_m代表电影的数量
- r(i,j)=1r(i,j)=1表示用户i给电影j评过分
- y(i,j)y^{(i,j)}代表用户i给电影j的评分,在上图中,其评分范围是0~5分
- mjm_j代表用户j评过分的电影的总数
基于内容的推荐系统
在一个基于内容的推荐系统算法中,我们假设对于我们希望推荐的东西有一些数据,这些数据就是有关这些东西的特征。
在我们的例子中,我们可以假设每部电影都有两个特征,如x1x_1代表电影的浪漫程度,x2x_2代表电影的动作程度。
如上图所示,每部电影都有一个特征向量,如x(1)=[0.9,0]x^{(1)}=[0.9, 0]是第一部电影的特征向量。
下面我们可以基于这些特征来构建一个推荐系统算法。
假设我们使用线性回归模型,我们可以针对每个用户都训练一个线性回归模型,如θ(1)\theta^{(1)}是第一个用户的模型的参数。
于是,我们有:
* θ(j)\theta^{(j)}是用户j的参数向量
* x(i)x^{(i)}是电影i的特征向量
对于用户j和电影i,我们预测评分为:(θ(j))T(x(i))(\theta^{(j)})^T(x^{(i)})
对于用户j,该线性回归模型的代价函数为预测误差的平方和,加上归一化项:
min_{\theta^{(j)}} \frac{1}{2} \sum_{i:r(i,j)=1} ((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{\lambda}{2} \sum_{k=1}^n (\theta_k^{(j)})^2
其中,i:r(i,j)=1i:r(i,j)=1表示我们只计算用户j评过分的电影。在一般的线性回归模型中,误差项和归一化项应该都是乘以12m\frac{1}{2m},在这里我们将m去掉,并且不对偏倚项θ0\theta_0进行归一化处理。
上面的代价函数是针对一个用户的,为了学习所有用户,我们将所有用户的代价函数求和:
min_{\theta^{(1)},\ldots,\theta^{(n_u)}} \frac{1}{2} \sum_{j=1}^{n_u}\sum_{i:r(i,j)=1} ((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{\lambda}{2} \sum_{j=1}^{n_u}\sum_{k=1}^n (\theta_k^{(j)})^2
如果我们要用梯度下降法来求解最优解,我们计算代价函数的偏导数后得到梯度下降的更新公式为:
\theta_k^{(j)} = \theta_k^{(j)} -\alpha \sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)}\ (for\ k=0) \\ \theta_k^{(j)} = \theta_k^{(j)} -\alpha (\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)}+\lambda \theta_k^{(j)})\ (for\ k\neq 0)
协同过滤算法
接下来介绍一种可以自行学习所要使用的特征的算法–协同过滤算法。
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数。相反地,如果我们拥有了用户的参数,我们可以学习得出电影的特征。也就是给出参数θ(1),…,θ(nu)\theta^{(1)},\ldots,\theta^{(n_u)},来学习x(1),…,x(nm)x^{(1)},\ldots,x^{(n_m)},那么优化代价函数的公式如下所示:
min_{x^{(1)},\ldots,x^{(n_m)}} \frac{1}{2} \sum_{j=1}^{n_m}\sum_{i:r(i,j)=1} ((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2 + \frac{\lambda}{2} \sum_{j=1}^{n_m}\sum_{k=1}^n (x_k^{(i)})^2
但是如果我们即没有用户的参数,也没有电影的特征,这两种方法都不可行了。而协同过滤算法可以同时学习这两者。
我们的优化目标便改为同时针对x和θx和\theta进行。
J(x^{(1)},\ldots,x^{(n_m)},\theta^{(1)},\ldots,\theta^{(n_u)})=\frac{1}{2} \sum_{i:r(i,j)=1} ((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})^2+\frac{\lambda}{2} \sum_{j=1}^{n_m}\sum_{k=1}^n (x_k^{(i)})^2+\frac{\lambda}{2} \sum_{j=1}^{n_u}\sum_{k=1}^n (\theta_k^{(j)})^2
对代价函数求偏导数的结果如下:
x_k^{(i)} = x_k^{(j)} -\alpha (\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})\theta_k^{(j)}+\lambda x_k^{(i)}) \\ \theta_k^{(j)} = \theta_k^{(j)} -\alpha (\sum_{i:r(i,j)=1}((\theta^{(j)})^Tx^{(i)}-y^{(i,j)})x_k^{(i)}+\lambda \theta_k^{(j)})
注意,在协同过滤算法中,我们通常不使用偏倚项,如果需要的话,算法会自动学得。
协同过滤算法使用步骤如下:
- 将x(1),…,x(nm),θ(1),…,θ(nu)x^{(1)},\ldots,x^{(n_m)},\theta^{(1)},\ldots,\theta^{(n_u)}初始化为一些小的随机值
- 使用梯度下降算法最小化代价函数
- 在训练完算法后,我们预测(θ(j))T(x(i))(\theta^{(j)})^T(x^{(i)})为用户j给电影i的评分
通过这个学习过程获得的特征矩阵包含了有关电影的重要数据,这些数据不总是人能读懂的,但是我们可以用这些数据作为给用户推荐电影的依据。
低秩矩阵分解(Low Rank Matrix Factorization)
接下来会介绍协同过滤算法的向量化实现,以及使用该算法可以做的其他事情,比如正在观看一部电影,能否推荐另一部相关的电影。
首先还是利用初始给出的电影的例子,如下图所示:
矩阵Y是一个5×45\times 4的矩阵,代表的就是左边4个用户分别给5部电影的评分,其中?号表示该用户没有看过该电影,因此没有打分。根据这个矩阵,可以根据评分公式(θ(j))T(x(i))(\theta^{(j)})^T(x^{(i)}),得到如下图所示的评分矩阵:
上述预测评分矩阵中的位置(i,j)(i,j)表示的就是用户j给电影i的评分,它的值就是(θ(j))T(x(i))(\theta^{(j)})^T(x^{(i)})。因而,这个矩阵第一行代表的就是所有用户分别给第一部电影的评分,即第i行表示所有用户给电影i的评分,而第j列表示用户j给所有电影的评分。
这里可以使用向量化实现,如定义一个X和θX和\theta矩阵,分别如下所示定义:
X = \begin{bmatrix} (x^{(1)})^T \\ (x^{(2)})^T \\ \vdots \\ (x^{(n_m)})^T \end{bmatrix} \qquad \theta = \begin{bmatrix} (\theta^{(1)})^T \\ (\theta^{(2)})^T \\ \vdots \\ (\theta^{(n_u)})^T \end{bmatrix}
然后预测评分矩阵就等于 XθTX\theta^T。
这里由于XθTX\theta^T的低秩属性,因此协同过滤算法也被称为低秩矩阵分解。
接下来就介绍如何寻找相关的电影,对于一部电影i,我们根据协同过滤算法可以学习到一个特征向量x(i)x^{(i)},在这个向量中包含了x1,x2,…,xnx_1,x_2,\ldots,x_n个特征,这些特征包含了电影的重要数据,但一般很难进行数据可视化,同时也可能是人很难解释的这些特征实际上是什么,但这种特征学习方法得到的特征却是可以帮助我们进行推荐。
例如,如果一个用户正在观看电影x(i)x^{(i)},我们可以寻找另一部电影x(j)x^{(j)},依据是两部电影的特征向量之间的距离||x(i)−x(j)|||| x^{(i)}- x^{(j)} ||的大小。当这个距离很小的时候,表示两部电影是非常相似的。
均值归一化
最后介绍均值归一化,它有时候可以使得推荐算法运行得更好。
首先看下如下面所示的用户评分数据:
这里新增一个用户Eve,并且Eve没有为任何电影评分,那么我们以什么为依据为Eve推荐电影呢?
我们首先需要对结果Y矩阵进行均值归一化处理,将每一位用户对某一部电影的评分减去所有用户对该电影评分的平均值,如下所示:
上图中μ\mu矩阵就是一个均值矩阵,第i行表示所有用户对电影i的评分的平均值。进行均值归一化后,我们将使用最右边的新的Y矩阵来训练算法。
而如果我们要用新训练出的算法来预测评分,则需要将平均值重新加回去,预测值为(θ(j))T(x(i))+μi(\theta^{(j)})^T(x^{(i)})+\mu_i。
对于Eve,我们的新模型会认为她给每部电影的评分都是该电影的平均分。
此外,如果某部电影没有评分,也可以使用这种均值归一化的方法,只是变成对每列数据进行均值归一化。
小结
本节课,介绍了机器学习一个很重要的应用–推荐系统,介绍了其基本的定义以及使用的算法。
[机器学习笔记]Note14--推荐系统相关推荐
- 七月算法机器学习笔记9 推荐系统
七月算法(http://www.julyedu.com) 12月份 机器学习在线班 学习笔记
- 猪猪的机器学习笔记(九)推荐系统
推荐系统 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第九次次课在线笔记.推荐系统是机器学习的一个直观而又有趣的系统,例如我们在上淘宝时候会弹出推荐的商品,百度搜索 ...
- 机器学习笔记:Overview
1)机器学习笔记(1):Introduction 2)机器学习笔记(2):单变量线性回归 3)机器学习笔记(3):线性代数回顾 4)机器学习笔记(4):多变量线性回归 5)机器学习笔记(五):逻辑回归 ...
- 读书笔记 | 《推荐系统》
读书笔记 | <推荐系统> 引言 协同方法背景下常见问题如下 1.如何发现与我们要推荐的用户有着相似偏好的用户? 2.如何衡量相似度? 3.如何处理还没有购买经历的用户? 4.如果只有很少 ...
- 吴恩达机器学习笔记整理(Week6-Week11)
1. Week 6 1.1 应用机器学习的建议(Advice for Applying Machine Learning) 1.1.1 决定下一步做什么 到目前为止,我们已经介绍了许多不同的学习算法, ...
- Python_ML_斯坦福机器学习笔记
斯坦福机器学习笔记 Introduction 线性回归 回归问题 线性回归与梯度下降 程序示例--梯度下降 正规方程 特征缩放 多项式回归 程序示例--多项式回归 欠拟合与过拟合 程序示例--局部加权 ...
- 【经典】吴恩达——机器学习笔记001
[经典]吴恩达--机器学习笔记001 机器学习(Machine Learning)笔记001 学习地址:[中英字幕]吴恩达机器学习系列课程 文字版参考及PPT来源:Coursera-ML-Andrew ...
- 一份520页的机器学习笔记!附下载链接
点击上方"视学算法",选择"星标"公众号 第一时间获取价值内容 近日,来自SAP(全球第一大商业软件公司)的梁劲(Jim Liang)公开了自己所写的一份 52 ...
- 第四范式程晓澄:机器学习如何优化推荐系统
本文经AI新媒体量子位(公众号ID:qbitai )授权转载,转载请联系出处 本文长度为9532字,建议阅读10分钟 本文为你介绍推荐系统的诞生土壤和早起演进.推荐系统当下的基本架构以及如何搭建一个推 ...
- 700 页的机器学习笔记火了!完整版开放下载
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 作者 梁劲(Jim Liang),来自SAP(全球第一大商业软件公司). 书籍特点 条理清晰 ...
最新文章
- 机器视觉:ransac算法详解
- java swing 弹出登录框_用JavaSwing制作一个简单的登录框
- android onpreviewframe保存mp4_无需第三方工具!教你如何保存抖音完整版视频
- React开发(177):opentab没有menu会报错
- 一文告诉你,如何在 Kubernetes 的容器引擎中运行 KVM 和 VMware VM!
- asp.net web submit链接页面_41. Web 安全之 target=quot;_blankquot; 触发钓鱼风险
- Data - 大数据生态圈
- matlab数字图像处理-找不同
- 懒懒的Rain的寒假小结
- 【攻防世界-Web简单篇】
- 机器学习笔记 - 行列式
- 怎么Collections.sort()方法进行List排序
- 苹果手机没有备份怎么恢复照片?
- 成为或不成为开发者的拥护者
- ubuntu命令行 播放音乐
- java计算机毕业设计汽车销售系统源码+数据库+系统+lw文档+mybatis+运行部署
- 一些忠告给想转行当程序员的你
- python弹出输入框_Python实现使用tkinter弹出输入框输入数字, 具有确定输入和清除功能...
- 怎么样使用计算机新建文件,电脑初学者如何新建和使用文件夹
- 【bugku】-getshell-蚁剑插件的下载
热门文章
- 如何用计算机管理员权限,教你电脑使用代码添加管理员权限的详细教程
- mysql dump 1017_MySQL数据库导出 - Can't Wait Any Longer - OSCHINA - 中文开源技术交流社区...
- matlab用泰勒展开解微分方程,mathematica的解微分方程的能力让人大失所望啊
- python使用proxy
- 我的makefile写法(一)
- React开发(245):ant design form自定义验证
- 前端学习(3272):js中this的使用
- 前端学习(3241):react生命周期forceUpdate
- [html] 请说说你在写布局时对于浏览器兼容性的感受或总结
- [jQuery] jQuery的队列是如何实现的?队列可以用在哪些地方?