推荐系统相关算法(1):SVD

假如要预测Zero君对一部电影M的评分,而手上只有Zero君对若干部电影的评分和风炎君对若干部电影的评分(包含M的评分)。那么能预测出Zero君对M的评分吗?答案显然是能。最简单的方法就是直接将预测分定为平均分。不过这时的准确度就难说了。本文将介绍一种比这个最简单的方法要准上许多,并且也不算复杂的算法。
      SVD(Singular Value Decomposition)的想法是根据已有的评分情况,分析出评分者对各个因子的喜好程度以及电影包含各个因子的程度,最后再反过来根据分析结果预测评分。电影中的因子可以理解成这些东西:电影的搞笑程度,电影的爱情爱得死去活来的程度,电影的恐怖程度。。。。。。SVD的想法抽象点来看就是将一个N行M列的评分矩阵R(R[u][i]代表第u个用户对第i个物品的评分),分解成一个N行F列的用户因子矩阵P(P[u][k]表示用户u对因子k的喜好程度)和一个M行F列的物品因子矩阵Q(Q[i][k]表示第i个物品的因子k的程度)。用公式来表示就是
R = P * T(Q)               //T(Q)表示Q矩阵的转置

     下面是将评分矩阵R分解成用户因子矩阵P与物品因子矩阵Q的一个例子。R的元素数值越大,表示用户越喜欢这部电影。P的元素数值越大,表示用户越喜欢对应的因子。Q的元素数值越大,表示物品对应的因子程度越高。分解完后,就能利用P,Q来预测Zero君对《七夜》的评分了。按照这个例子来看,Zero君应该会给《七夜》较低的分数。因为他不喜欢恐怖片。注意不要纠结图中的具体数值,因为那些数值是我随便填上去的。

      实际上,我们给一部电影评分时,除了考虑电影是否合自己口味外,还会受到自己是否是一个严格的评分者和这部电影已有的评分状况影响。例如:一个严格评分者给的分大多数情况下都比一个宽松评分者的低。你看到这部电影的评分大部分较高时,可能也倾向于给较高的分。在SVD中,口味问题已经有因子来表示了,但是剩下两个还没有相关的式子表示。因此有必要加上相关的部分,提高模型的精准度。改进后的SVD的公式如下:
R = OverallMean + biasU + biasI + P * T(Q)    (1)
其中OverallMean表示所有电影的平均分,biasU表示用户评分偏离OverallMean的程度,biasI表示电影评分偏离OverallMean的程度,P,Q意思不变。特别注意,这里除了OverallMean之后,其它几个都是矩阵。

     分解完后,即(1)式中的五个参数都有了正确的数值后,就可以用来预测分数了。假设我们要预测用户u对电影i的评分:

bu表示第u个用户的偏离程度,bi表示第i部电影的偏离程度,pu表示第u个用户的因子爱好程度,qi表示第i部电影的因子程度。

    

2. SVD实现

     在第一部分的例子中,你也许会有疑问:明明评分矩阵有一个元素的值是空的,为什么还能得到两个完整的矩阵P和Q呢?原因是那两个矩阵是通过学习(learning)得到的。SVD使用随机梯度下降(stochastic gradient descent)学习(1)式中除了OverallMean之外的参数。学习过程可以概括成这样:先给各个参数一个初值,然后利用这些参数进行预测,并将预测结果与已知评分进行对比,最后根据对比结果修正各个参数。更准确点的说法是调整参数的值,使得以下式子能取到最小值:

ALPHA表示所有训练样本。被第一个圆括号括着的部分表示当前的预测结果与实际值的偏差。被第二个圆括号括着的部分是为了防止过拟合(overfitting)。

     以上就是SVD实现时的主要思想了,至于具体实现可以参考我的代码。这个实现版本在movielens 1M上的效果比《A Guide to Singular Value Decomposition for Collaborative Filtering》中提到的要好一点点。这里,我主要提一下实现SVD时要注意的地方:
a. 更新qi时,要先保存
b. 预测分数时,范围要限制在最小值和最大值内

     此外,这是我找到的一些有用的建议:
a. 所有参数的regularization 值是一样的,不用特别区分bu, bi和 p,q
b. bu, bi不需要初始化,全部设成0
c. P,Q应该的初始化,一般使用  0.1 * rand(0,1) / sqrt(dim)  dim指特征的维数

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

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

相关文章

Tree前序反序列化

题目: 序列化:已知树如果当前节点不是空,则打印“值!” 如果为空,则打印“#!” 反序列化:1!2!#!#!3!#!#! 然后构建成树 比如树 1 2 3 null null null null …

vSphere日志分析器(vCenter Log Insight)安装、配置

很久没更新博客,最近在网上看到了1.0版本的vSphere分析器可下载并可测试,测试完后发觉以前人肉全手动分析log,看得眼前飘白雪的情况不会出现了。这里和大家分享一下。1 关于vCenter Log Insight当ESX/ESXi主机发生故障,很多用户或…

android开发将h5转换成pdf_一键将PDF转换成PPT,秒懂!

PDF因能良好的兼容各操作系统和软件版本的差异性,使得PDF文档在查阅播放的时候不影响排版变化,很多时候,我们因为工作上的需要,经常需要再次将PDF转换成PPT,那么怎样将PDF转换成PPT呢?需要下载专业的转换工…

日志文件记录的重要性

为什么做好日志记录1、良好的日志规范,能快速有效的定位问题。做开发最怕的就是线上系统出问题了,轻则留下产品和系统不安全可靠的不好印象,重则影响到公司的收入和口碑。当然了,线上bug总会存在,这很正常,…

MongoDB 权限认证

MongoDB已经使用很长一段时间了,基于MongoDB的数据存储也一直没有使用到权限访问(MongoDB默认设置为无权限访问限制),因为考虑到数据安全的原因特地花了一点时间研究了一下,网上搜出来的解决方法大都是3.0以下的版本的…

DBCP的配置参数

tomcatde DHCP的配置 <Resource driverClassName"com.microsoft.sqlserver.jdbc.SQLServerDriver" logAbandoned"true" maxActive"20" maxIdle"2" maxWait"5000" name"system" removeAbandonedTimeout"…

递归函数里面又有2个调用自身的递归函数里面参数变化总结

递归函数里面又有2个调用自身的递归函数里面参数变化总结 我们经常看见 public void f(int i){ //逻辑代码 f(i+1) f(i+1); } public void f(Queue queue){ //逻辑代码 f(queue); f(queue); } 这个时候我们的i,和参数queue怎么变…

推荐系统相关算法(2):k-nearest neighbor

1. kNN 1.1 基本的kNN模型 kNN(k-nearest neighbor)的思想简单来说就是&#xff0c;要评价一个未知的东西U&#xff0c;只需找k个与U相似的已知的东西&#xff0c;并通过k个已知的&#xff0c;对U进行评价。假如要预测风炎君对一部电影M的评分&#xff0c;根据kNN的思想&#…

看了《OCP/OCA认证考试指南全册:Oracle Database 11g(1Z0-051,...

为什么80%的码农都做不了架构师&#xff1f;>>> 一直对考试用书没好感&#xff0c;觉得里边的内容都刻板不实用。在查找Oracle书籍时&#xff0c;无意中看到有人在豆瓣里说&#xff0c;如果给他一次重新的机会&#xff0c;他只看OCP 052、053&#xff0c;Oracle编程…

.net 集合分成几个等数量集合_巧用数学游戏,帮助幼儿轻松掌握12种数量关系!...

网校在手 轻松教研线上学习灵活高效海量资源轻松获取一键搞定园本教研感知数量关系是幼儿园数学教育的核心内容&#xff0c;是发展幼儿数学思维的重要因素。那么&#xff0c;孩子在幼儿园阶段需要了解哪些数量关系呢&#xff1f;幼儿园有哪些数学教育内容包含着数量关系呢&…

我做的百度飞桨PaddleOCR .NET调用库

.NET Conf 2021中国我做了一次《.NET玩转计算机视觉OpenCV》的分享&#xff0c;其中提到了一个效果特别好的OCR识别引擎——百度飞桨PaddleOCR&#xff0c;后来我逐步把它封装了一下&#xff0c;代码全部开源&#xff08;可点击查看原文跳转到Github&#xff09;&#xff1a;ht…

python核心模块之pickle和cPickle讲解

pickle模块使用的数据格式是python专用的&#xff0c;并且不同版本不向后兼容&#xff0c;同时也不能被其他语言说识别。要和其他语言交互&#xff0c;可以使用内置的json包使用pickle模块你可以把 Python 对象直接保存到文件&#xff0c;而不需要把他们转化为字符串&#xff0…

反序列化层遍历二叉树

反序列化层遍历二叉树 规则: 序列化:如果这个节点有值,则打印“值!" 如果这个节点没有值,则打印“#!” 从上到下,从左到右 比如: 1 …

超棒的在线Bootstrap主题编辑工具 - lollytin

lollytin 是一款帮助制作Bootstrap3主题的在线工具&#xff0c;虽然现在仍旧是Beta版本&#xff0c;但是已经非常不错了。 主要功能&#xff1a; 通过拖拽来生成主题支持拖拽页头&#xff0c;页脚&#xff0c;内容&#xff0c;幻灯&#xff0c;地图&#xff0c;表单&#xff0c…

CentOS 5.9 yum安装LAMP(Apache+MySQL+PHP)

2019独角兽企业重金招聘Python工程师标准>>> 1、 yum -y install mysql mysql-server /*yum安装MySQL*/ 2、chkconfig --levels 235 mysqld on /*设置开机启动*/ 3、以MySQL用户root登陆: mysql -u root 登陆后设置root密码&#xff1a; set password for rootl…

C#获2021年度编程语言奖,开发者们最该关注这些亮点!

2022年的第一个好消息&#xff0c;应该就是C#获得“TIOBE 年度编程语言奖”。虽然眼下TIOBE的新闻尚未发布&#xff0c;但早在21年12月榜单发布的同时&#xff0c;TIOBE的CEO Paul Jansen表示&#xff0c;C#将获取“TIOBE 年度编程语言奖”。C#有着21年的悠久历史了&#xff0c…

编写程序在窗口中写出自己名字的拼音缩写_各类英文缩写:全称居然这么朴素?网友:最后一个我笑了...

提到听起来很牛的缩写&#xff0c;小优第一个想到的单词是VIP&#xff0c;一直认为它是一个很厉害的单词&#xff0c;那它的全称一定更厉害吧!直到初中&#xff0c;被英语老师打破幻想&#xff0c;原来VIP的全称就只是 Very Important Person! Excuse me ??好吧&#xff01;那…

如何像Uber一样给工程师派单,解放外包生产力?

2019独角兽企业重金招聘Python工程师标准>>> 2014年&#xff0c;陈柯好的第一个创业项目失败&#xff0c;半年之内&#xff0c;陈柯好以技术合伙人的方式游走于旅游、电商、团购、票务等各种领域。正当他对职业方向感到迷茫时&#xff0c;“大众创业、万众创新”的口…