推荐系统实例-基于矩阵分解
基于矩阵分解的推荐系统实例
使用MATLAB尝试了随机梯度下降的矩阵分解方法,实现了一个比较简单的推荐系统的原理。
常用推荐系统的方法有协同过滤, 基于物品内容过滤等等。
这次是用的矩阵分解模型属于协同过滤的一种方法,大致原理是通过一定数量的因子来描述各个用户的喜好和各个物品的属性。
通过随机梯度下降法分解后得到两个矩阵,一个是用户因子矩阵,另一个是物品因子矩阵。
这两个矩阵相乘可以得到所有用户对所有电影的预测评分。
以Movie-Lens数据集举例,这包含943个用户对1682部电影的十万条评分。
第一列用户编号,第二列电影编号,第三列用户对该物品的评分(1-5分);
Matlab代码:
function [ Grade,userCal,itemCal,deviation ] = iterator( GradeData ,iteraTime ) % 利用随机梯度下降法分解稀疏的用户评分矩阵,得到用户因子矩阵和物品因子矩阵,因子项数30; % iteraTime : 迭代次数,建议值:30 alpha = 0.01; lambda = 10; userCal = rand(943,30); itemCal = rand(1682,30); range = size(GradeData,1); userCal_last = userCal; itemCal_last = itemCal; for limit = 1:1:iteraTimefor i = 1:1:rangetempUser = GradeData(i,1); tempItem = GradeData(i,2); tempGrade = GradeData(i,3); E = tempGrade - userCal(tempUser,:) * itemCal(tempItem,:)'; userCal(tempUser,:) = userCal_last(tempUser,:) + alpha * ( E * itemCal_last(tempItem,:) - lambda * userCal_last(tempUser,:) ); itemCal(tempItem,:) = itemCal_last(tempItem,:) + alpha * ( E * userCal_last(tempUser,:) - lambda * itemCal_last(tempItem,:) ); enduserCal_last = userCal; itemCal_last = itemCal; alpha = alpha / (1 + limit); end deviation= Deviation(GradeData ,lambda , userCal, itemCal); realGrade = pack(GradeData); Grade = userCal * itemCal' - realGrade; endfunction [ deviation ] = Deviation( GradeData , lambda ,user , item ) %计算平方误差,误差越小,拟合效果越好 range = size(GradeData(:,1)); deviation = 0; for i = 1:1:rangetempUser = GradeData(i,1); tempItem = GradeData(i,2); tempGrade = GradeData(i,3); deviation = deviation + ( tempGrade - user(tempUser,:) * item(tempItem,:)' )^2 + lambda * ( sum(user(tempUser,:).^2 ) + sum(item(tempItem,:).^2) ) ; end endfunction [realGrade] = pack(GradeData) %realGrade = []; range = size(GradeData,1); for i =1:1:rangerealGrade(GradeData(i,1),GradeData(i,2)) = GradeData(i,3); end end
设置了30个因子项,这个可以根据实际情况调整。
迭代次数可以根据每一次迭代的deviation与上一次的deviation比较来判定是否收敛。
代码中直接迭代了20次,可以算出一个比较好的结果。
这样用户因子矩阵为943*30,物品因子矩阵为,1682*30;
分解后得到这两个矩阵:
将用户因子矩阵(943*30)与物品因子矩阵(1682*30)的转置相乘即可得到评分预测矩阵(943*1682):
根据评分预测矩阵,就可以对用户进行相关推荐了。
基于随机梯度下降法的推荐系统虽然是基于内容推荐,但是系统设计者无需清楚每一个物品的内容属性和每一个用户的喜好,通过矩阵分解法得出的因子矩阵可以很好的描述用户和物品的属性,当然,这来自于用户的历史行为,用户过去的行为越多,则推荐越准确。比较流行的矩阵分解法还有SVD分解法等。
因为是协同过滤的方法,所以也存在着冷启动的问题,比如一个新物品,未和任何用户产生交互,则它永远不会被推荐,而新注册的用户也因为没有历史行为而无法对其推荐。其次,还有稀疏性问题,当系统中 用户与物品的交互过少时,推荐结果往往不会太准确。
来自
http://www.wjxfpf.com/2015/10/868497.html
推荐系统实例-基于矩阵分解相关推荐
- SVD++:推荐系统的基于矩阵分解的协同过滤算法的提高
1.背景知识 在讲SVD++之前,我还是想先回到基于物品相似的协同过滤算法.这个算法基本思想是找出一个用户有过正反馈的物品的相似的物品来给其作为推荐.其公式为: 其中 rui 表示预测用户u对物品i的 ...
- 协同过滤与隐语义模型推荐系统实例3: 基于矩阵分解(SVD)的推荐
[ 协同过滤与隐语义模型推荐系统实例1: 数据处理 ] [ 协同过滤与隐语义模型推荐系统实例2: 基于相似度的推荐 ] 隐语义模型推荐 基于矩阵分解(SVD)的推荐 # 先计算歌曲被当前用户播放量/用 ...
- 基于hadoop的商品推荐系统_【论文笔记】基于矩阵分解的推荐系统
本文是对经典论文的阅读笔记,大部分为论文的中文翻译内容(笔者英语水平也就六级飘过的水准,不喜勿喷) 论文标题:Matrix factorization techniques for recommend ...
- 基于矩阵分解的推荐系统
基于矩阵分解的推荐算法 1.概述 基于用户和基于项的协同过滤推荐算法,难以实现大数据量下的实时推荐.这时我们可以使用基于模型的协同过滤算法,矩阵分解(Matrix Factorization,M ...
- 基于矩阵分解的推荐算法,简单入门
摘自:http://www.cnblogs.com/kobedeshow/p/3651833.html 本文将要讨论基于矩阵分解的推荐算法,这一类型的算法通常会有很高的预测精度,也活跃于各大推荐系统竞 ...
- 推荐系统知识梳理——矩阵分解
隐语义模型与矩阵分解 协同过滤算法的特点就是完全没有利用到物品本身或者是用户自身的属性, 仅仅利用了用户与物品的交互信息就可以实现推荐,是一个可解释性很强, 非常直观的模型, 但是也存在一些问题, 第 ...
- numpy 矩阵 秩_大规模电商推荐数据分析-基于矩阵分解的召回
前面两篇文章回顾了我们团队做天池数据比赛<CIKM 2019 EComm AI:用户行为预测>的复赛方案,现在让我们的目光回到初赛.初赛数据组织和复赛一样,只是数据量差异较大.(初赛才2G ...
- 自己动手写一个推荐系统,推荐系统小结,推荐系统:总体介绍、推荐算法、性能比较, 漫谈“推荐系统”, 浅谈矩阵分解在推荐系统中的应用...
自己动手写一个推荐系统 废话: 最近朋友在学习推荐系统相关,说是实现完整的推荐系统,于是我们三不之一会有一些讨论和推导,想想索性整理出来. 在文中主要以工程中做推荐系统的流程着手,穿插一些经验之谈,并 ...
- 推荐系统中的矩阵分解技术
推荐系统中的矩阵分解技术 本文翻译自Koren Y, Bell R, Volinsky C. Matrix Factorization Techniques for Recommender Syste ...
- 基于矩阵分解的协同过滤推荐
基于矩阵分解的协同过滤推荐 Traditional SVD 通常SVD矩阵分解指的是SVD奇异值分解,我们姑且将其命名为Traditional SVD(传统并经典着)其公式如下: M m × n = ...
最新文章
- 第 34 章 Gnuplot
- 来自damon的zencart二次开发教程-3.2复制模板(仿站)操作教程
- nginx 上传 文件超时设置_Nginx大文件上传413和500问题排查总结
- Qt的index 用方法static_castCTableItem*(index.internalPointer())取出来的值的成员都未初始化...
- phpcms文章 title 溢出 str_cut 省略号(······) - 代码篇
- LeetCode: Word Ladder
- 数据预处理与特征工程—6.Kaggle房价预测中数据预处理与特征工程
- SVN Server修改端口与SVN修改版本库URL
- 推荐8个自媒体免费工具,不仅提高工作效率,还能提供灵感
- 业界 | 数据科学家要先学逻辑回归?图样图森破!
- 性能工具之 Locust 工具 Get 与 Post 请求
- 【C语言】飞翔的小鸟游戏
- Dojo: Quick Start
- 从学校,到字节跳动,追忆似水流年
- Android面试总结-中高级
- C的指针疑惑:C和指针17(经典抽象数据类型)
- KEIL软件错误代码及错误信息
- DOjo的一个幻灯片播放例子
- Win10重装win7时一直显示windows启动中,不要慌
- 经验分布函数无偏性的证明和方差的推导
热门文章
- 关于javascript控制系统弹出下载提示 用以下载图片
- H3C VLAN同步MVRP实验
- TLS1.3对CIP的影响(对密码套件的解释)
- AI智能人脸识别很难?30行Python代码完美打造
- js学习(六)- js对象创建
- AST解析基础: 如何写一个简单的html语法分析库
- 关于解决Windows server系统用户无法远程的问题
- [翻译]jQuery 1.5.1 发布,全面支持IE9
- [JavaScript]面向对象编程
- linux 档案类型s,深入了解Linuxs归档和压缩命令 | MOS86