首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
其他好文
> 详细
推荐系统中的矩阵分解演变方式
时间:
2016-04-09 07:03:40
阅读:
224
评论:
0
收藏:
0
[点我收藏+]
标签:
推荐算法主要分为基于内容的算法和协同过滤. 协同过滤的两种基本方法是基于邻居的方法(基于内容/物品的协同过滤)和隐语义模型. 矩阵分解乃是实现隐语义模型的基石.
矩阵分解根据用户对物品的评分, 推断出用户和物品的隐语义向量, 然后根据用户和物品的隐语义向量来进行推荐.
推荐系统用到的数据可以有显式评分和隐式评分. 显式评分时用户对物品的打分, 显式评分矩阵通常非常稀疏. 隐式评分是指用户的浏览, 购买, 搜索等历史记录, 表示的是用户行为的有无, 所以是一个密集矩阵.
1. 基本矩阵分解
矩阵分解方法会将用户和物品映射到
维的隐向量空间, 用户对物品的评分表示为两个向量的内积. 亦即, 每个物品
表示为向量
, 每个用户表示成向量
. 对于物品
, 向量
的元素表示的是物品
具有这些隐因子的程度, 对于用户
, 向量
表示的是用户对各个隐因子的兴趣, 元素的值可正可负. 两个向量的内积
表示的就是估计的用户对物品的评分. 所以主要的挑战就是计算用户和物品到隐向量的映射.
最简单的就是奇异值分解(Singular value decomposition, SVD), 使用SVD需要分解用户物品评分矩阵, 但是通常该矩阵中有很多值是缺失的, 这种情况下的SVD是不可行的. 另外, 只处理已知的这些评分容易导致过拟合. 可以通过填充数据来使得矩阵变得稠密, 但是填充数据的准确性很是问题.
最主流的做法是只对那些已观测到的评分进行建模, 并且通过使用正则化项来避免过拟合, 亦即求解以下问题:
其中
是所以已知评分的用户-物品对,
控制着正则化的程度.
2. 学习算法
两种常用的求解上式的算法为随机梯度下降(SGD)和ALS(Alternating Least Square).
2.1 随机梯度下降
对于每个用户-物品评分, 计算预测误差
然后按照梯度下降的方向更新用户和物品的隐向量:
2.2 ALS(Alternating Least Square)
因为
和
都是未知的, 所以公式2不是凸的. 但是, 当我们固定其中一个变量, 则2式变成一个二次函数, 能够被最优的求解. 所以ALS算法的思想就是交替的固定
和
, 然后求解另外一个变量的二次函数的最优值.
通常SGD都会比ALS要简单而且快速, 但是ALS的并行性比较好, 而且可以较好地处理稀疏数据(?).
3. 添加偏置项
矩阵分解方法的一个好处就是可以灵活的添加许多面向应用的要求. 比如, 通常来说, 不同用户的评分倾向不同, 用的用户的打分普遍较高, 有的普遍较低, 物品亦然. 所以仅仅使用用户和物品之间的交互
来对评分进行建模不是很好, 还需要加上一些偏置项. 一种一阶偏置项近似为:
其中
描述的是所有评分的平均值,
描述的是用户和物品相对于
的偏差.
评分模型为:
转化为最优化问题为:
4. 其他的输入源
当解决冷启动问题时, 用户的评分信息很少, 这时候就需要使用用户的其他输入信息, 比如用户隐式反馈(浏览, 购买历史等). 令
表示用户有隐反馈的物品. 系统可以通过这些物品来对用户建模, 亦即把每个物品表示成一个隐向量
, 则用户可以通过下式来描述:
可以对上式进行正则化:
也可以使用用户的一些其他属性(性别, 年龄, 收入等)来对用户建模, 令
表示用户的一些布尔属性,则隐向量
表示用户的某个属性, 用户的所有属性可以通过下式来描述:
用户对物品的评分可以表示为:
5. 时间因素
到现在为止, 模型是静态的, 但是实际中物品的流行程度会随着时间变化, 用户的评分倾向也会变化, 用户的隐向量也会随时间变化. 所以可以将这些变量表示成时间的函数来更好地描述这些现象:
6. 不同可信度的输入源
不同的评分的可信度不同. 比如广告会影响某个物品的评分, 另外, 有些作弊的用户会对某些物品恶意的打高分或者低分. 另外, 在使用隐式反馈时, 可以使用某些行为(比如浏览)等得次数来表示用户喜欢某个物品的程度. 可以通过为某个评分
设置权重
来解决上述问题:
参考文献:
[1]. Yuhuda Koren, Robert Bell and Chris Volinsky. Matrix Factorization Techniques for Recommender Systems.
推荐系统中的矩阵分解演变方式
标签:
原文地址:http://blog.csdn.net/winone361/article/details/51103054
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
分布式事务
2021-07-29
OpenStack云平台命令行登录账户
2021-07-29
getLastRowNum()与getLastCellNum()/getPhysicalNumberOfRows()与getPhysicalNumberOfCells()
2021-07-29
【K8s概念】CSI 卷克隆
2021-07-29
vue3.0使用ant-design-vue进行按需加载原来这么简单
2021-07-29
stack栈
2021-07-29
抽奖动画 - 大转盘抽奖
2021-07-29
PPT写作技巧
2021-07-29
003-核心技术-IO模型-NIO-基于NIO群聊示例
2021-07-29
Bootstrap组件2
2021-07-29
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!