SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高
1.背景知识
在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法。这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐。其公式为:
其中 rui 表示预测用户u对物品i的喜爱程度。wij 是物品i,j之间的相似度,N(u)代表用户曾经有过正反馈的物品的集合。
就比如说我们现在有三个用户A,B和C,还有四本书:《红楼梦》,《史记》,《微积分导论》和《时间简史》。用户和书籍之间的阅读关系为:
| A | B | C | |
| 红楼梦 | 1 | 1 | |
| 史记 | |||
| 微积分导论 | 1 | ||
| 线性代数 | 1 |
其中没有标注1的即表示用户没有阅读过此书籍。
那么我们首先需要一种相似度度量方法可以测得任意两本书之间的相似度,暂时我们认为方法已经有了,并且已经把书籍两两之间的相似度计算出来了,其可以用一个对称方阵W表示(在我们这个例子中是4X4的矩阵)。其具体值假设如下:
| 红楼梦 | 史记 | 微积分导论 | 线性代数 | |
| 红楼梦 | 1 | 0.7 | 0.2 | 0.1 |
| 史记 | 0.7 | 1 | 0.2 | 0.2 |
| 微积分导论 | 0.2 | 0.2 | 1 | 0.8 |
| 线性代数 | 0.1 | 0.2 | 0.8 | 1 |
那根据公式,我们计算用户C对史记的喜欢程度就是 : ( 0.7 + 0.2)/ sqrt(2) 。
2. SVD++ 原理
上面的方法有一个问题,就是相似度度量方法我们不太容易得到,也就是我们没法得到W这个矩阵。有一个想法就是我通过迭代优化的方法直接去计算整个W,其优化的lost function如下:
这样的话就再不需要我们认为去定义一个相似度度量方法。但是一个新的问题又出现了。由于一般推荐系统中物品的个数往往都很多,所以W会是一个非常大的矩阵,那么这样会给存储和计算带来很大的麻烦。这里我们把条件放宽一点,假设W是由两个矩阵X和Y点乘得到的(其实就是矩阵分解)。那么预测的公式就变成了:
其中Xi 和Yj 是矩阵X和Y中第i行和第j行。
那么到此为止,我们用了迭代和矩阵分解的方法来处理相似度的信息,那么我们将这个相似度影响因素加入我们之前讲的隐因子的矩阵分解方法中去,就得到:
可以看到,这个公式其实就是在隐因子的基础上多加了一项。
但是,牛逼的dalao们又发现,如果让矩阵P(这个是用户的隐参数矩阵)和上面提到的W分解得到的X矩阵相等,可以防止模型过拟合,那么公式又变为:
这个公式有点错误,其括号中的xi 应该是没有的。(太懒了,直接截图过来不想改==)
3.算法实现
(INCOMING)
https://github.com/ccienfall/RecommandSystem/blob/master/script/Factorize.py 先拿代码凑合着看吧。。。。
挖好坑,以后来填。(10.21)
前来填坑(11.2)
SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高的更多相关文章
- Mahout分布式运行实例:基于矩阵分解的协同过滤评分系统(一个命令实现文件格式的转换)
Apr 08, 2014 Categories in tutorial tagged with Mahout hadoop 协同过滤 Joe Jiang 前言:之前配置Mahout时测试过一个简 ...
- 基于用户的最近邻协同过滤算法(MovieLens数据集)
基于用户的最近邻算法(User-Based Neighbor Algorithms),是一种非概率性的协同过滤算法,也是推荐系统中最最古老,最著名的算法. 我们称那些兴趣相似的用户为邻居,如果用户 ...
- 【RS】List-wise learning to rank with matrix factorization for collaborative filtering - 结合列表启发排序和矩阵分解的协同过滤
[论文标题]List-wise learning to rank with matrix factorization for collaborative filtering (RecSys '10 ...
- 【机器学习笔记一】协同过滤算法 - ALS
参考资料 [1]<Spark MLlib 机器学习实践> [2]http://blog.csdn.net/u011239443/article/details/51752904 [3]线性 ...
- spark机器学习从0到1协同过滤算法 (九)
一.概念 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法. 基于用户的协同过滤算法和基于项目的协同过滤算法 1.1.以用户为基础(User-based)的协同过滤 用相似统 ...
- 推荐系统实践 0x0b 矩阵分解
前言 推荐系统实践那本书基本上就更新到上一篇了,之后的内容会把各个算法拿来当专题进行讲解.在这一篇,我们将会介绍矩阵分解这一方法.一般来说,协同过滤算法(基于用户.基于物品)会有一个比较严重的问题,那 ...
- 吴裕雄--天生自然HADOOP操作实验学习笔记:协同过滤算法
实验目的 初步认识推荐系统 学会用mapreduce实现复杂的算法 学会系统过滤算法的基本步骤 实验原理 前面我们说过了qq的好友推荐,其实推荐算法是所有机器学习算法中最重要.最基础.最复杂的算法,一 ...
- Slope one—个性化推荐中最简洁的协同过滤算法
Slope One 是一系列应用于 协同过滤的算法的统称.由 Daniel Lemire和Anna Maclachlan于2005年发表的论文中提出. [1]有争议的是,该算法堪称基于项目评价的non ...
- 电影推荐系统---协同过滤算法(SVD,NMF)
SVD 参考 https://www.zybuluo.com/rianusr/note/1195225 1 推荐系统概述 1.1 项目安排 1.2 三大协同过滤 1.3 项目开发工具 ...
随机推荐
- 初试微信小程序
2016年11月3日,微信小程序终于公测了,大家可以正式开发了.早在这之前,应公司要求,和同事就早早的试了一下微信小程序的开发,特此记录一下: 微信官方小程序文档:https://mp.weixin. ...
- 1、datatable与datagrid之间的绑定
1.前台代码: 插入一个datagrid控件,设置几列. 这里有两点要注意: 1)为了显示所要查询的日期,我将前台的列名与后台查询出来的日期绑定了,用了x:Name这个属性 2)与后台datatabl ...
- Collection(数组、字典、集合)
Collection -NSArray和NSMutableArray +array:创建一个空数组 +arrayWithArray:从另一个数组创建新的数组 ...
- 线程和NSThread 、 NSOperation
1 使用NSThread实现打地鼠 1.1 问题 NSThread是ios提供的轻量级的多线程解决方案,但是需要自己管理线程的生命周期.线程同步等.本案例使用NSThread实现一个打地鼠的小游戏,在 ...
- Oracle学习系列6
Oracle学习系列6 ************************************************************************************ 删除约 ...
- 排序算法总结(三)选择排序【Select Sort】
一.原理 选择排序的原理非常简单,就是选出最小(大)的数放在第一位,在剩下的数中,选出最小(大)的数,放在第二位......重复上述步骤,直到最后一个数. 二.过程 原始数据 第一次排序,选出最小的数 ...
- 关于 MAXScript 获取全部文件
MAXScript 官方文档里关于获取文件夹下所有文件的方法 fn getFilesRecursive root pattern = ( dir_array = GetDirectories (roo ...
- Python chr() ord() unichr()
chr()函数用一个范围在range(256)内的(就是0-255)整数作参数,返回一个对应的字符. unichr()跟它一样,只不过返回的是Unicode字符,这个从Python 2.0才加入的un ...
- SQL总结(三)其他查询
SQL总结(三)其他查询 其他常用的SQL,在这里集合. 1.SELECT INTO 从一个表中选取数据,然后把数据插入另一个表中.常用于创建表的备份或者用于对记录进行存档. 语法: SELECT c ...
- 3D Touch集成过程整理
1.集成App图标按压快速打开某个功能 在AppDelegate.m中加入以下三个东西 在启动方法里加入3D Touch菜单 - (BOOL)application:(UIApplication *) ...