当前位置:   article > 正文

mf模型 svd++_推荐系统入门(三):矩阵分解MF&因子分解机FM(附代码)

因子分解机模型svd++

861bac1f41cf9336a62dbeecb5de1399.png

推荐系统入门(三):矩阵分解MF&因子分解机FM(附代码)

本文与 推荐系统入门(三):矩阵分解MF&因子分解机FM(附代码)为同一作者

一、 矩阵分解MF

矩阵分解(Matrix Factorization,MF)技术实际上就是把用户-项目评分矩阵分解为若干个部分的组合,它在 Netfilx公司举办的推荐系统大赛上得到了广泛的应用,基于矩阵分解的推荐算法本质上是一种基于模型的协同过滤推荐算法

基于矩阵分解的推荐算法,实现简单,预测准确度高,扩展性强,在一定程度上缓解了数据的稀疏性问题,但可解释性差

1. 隐含语义分析技术

随着用户和项目数量的急剧增长,用户和项目之间评分矩阵的维度也在在急剧增加。而由此带来的问题是计算用户与用户、项目与项目之间相似度矩阵的速度越来越慢,计算问题成为推荐系统的瓶颈。此外,随着评分矩阵越来越稀疏,推荐精度也会受到严重的影响。

对推荐系统研究过程中有很多人提出给用户或项目进行分类,但是根据传统的推荐算法很难真正发掘出用户用户潜在的兴趣度。为了解决这个问题研究人员提出从数据出发,自动找出项目的分类信息和用户的兴趣度信息。因此,隐含语义分析技术(Latent Variable Analysis)就出现了。

隐语义模型(Latent Factor Model,LFM)这个概念是由Netflix Prize冠军Koren在2006年提出的。隐语义模型使用一种替代的法则来发现潜在的主题或分类。隐含语义分析技术从诞生至今产生了很多著名的模型和算法。其中和该项技术相关且耳熟能详的名词有隐含主题模型(latent topic model)24、矩阵分解(matrix factorization)、pLSA、LDA 等。

协同过滤算法的特点就是完全没有利用到物品本身或者是用户自身的属性,仅仅利用了用户与物品的交互信息就可以实现推荐,是一个可解释性很强,非常直观的模型,但是也存在一些问题, 第一个就是处理稀疏矩阵的能力比较弱,所以为了使得协同过滤更好处理稀疏矩阵问题, 增强泛化能力, 从协同过滤中衍生出矩阵分解模型或者叫隐语义模型, 两者差不多说的一个意思,就是在协同过滤共现矩阵的基础上, 使用更稠密的隐向量表示用户和物品,挖掘用户和物品的隐含兴趣和隐含特征,在一定程度上弥补协同过滤模型处理稀疏矩阵能力不足的问题。

1.1 隐语义模型

隐语义模型最早在文本领域被提出,用于找到文本的隐含语义。在2006年, 被用于推荐中, 它的核心思想是通过隐含特征(latent factor)联系用户兴趣和物品(item), 基于用户的行为找出潜在的主题和分类, 然后对item进行自动聚类,划分到不同类别/主题(用户的兴趣)

这么说可能有点抽象,所以下面拿项亮老师《推荐系统实践》里面的那个例子看一下:

如果我们知道了用户A和用户B两个用户在豆瓣的读书列表, 从他们的阅读列表可以看出,用户A的兴趣涉及侦探小说、科普图书以及一些计算机技术书, 而用户B的兴趣比较集中在数学和机器学习方面。 那么如何给A和B推荐图书呢?

先说说协同过滤算法, 这样好对比不同:

  • 对于UserCF,首先需要找到和他们看了同样书的其他用户(兴趣相似的用户),然后给他们推荐那些用户喜欢的其他书。
  • 对于ItemCF,需要给他们推荐和他们已经看的书相似的书,比如作者B看了很多关于数据挖掘的书,可以给他推荐机器学习或者模式识别方面的书。

而如果是隐语义模型的话, 它会先通过一些角度把用户兴趣和这些书归一下类, 当来了用户之后, 首先得到他的兴趣分类, 然后从这个分类中挑选他可能喜欢的书籍。

这里就看到了隐语义模型和协同过滤的不同, 这里说的角度其实就是这个隐含特征, 比如书籍的话它的内容、作者、年份、主题等都可以算隐含特征,如果这个例子还不是很清晰的话,那么下面再举个更为具体的例子,看看是如何通过隐含特征来划分开用户兴趣和物品的。但是在这之前,相信通过上面这个例子,我们已经隐隐约约感受到了协同过滤和隐语义模型的区别了,下面放上王喆老师《深度学习推荐系统》的一个原理图作为对比,区别简直一目了然:

698c69137796cf88641ea5dceefc7d98.png

我们下面拿一个音乐评分的例子来具体看一下隐特征矩阵的含义。

假设每个用户都有自己的听歌偏好, 比如A喜欢带有小清新的吉他伴奏的王菲的歌曲,如果一首歌正好是王菲唱的, 并且是吉他伴奏的小清新, 那么就可以将这首歌推荐给这个用户。 也就是说是小清新, 吉他伴奏, 王菲这些元素连接起了用户和歌曲。 当然每个用户对不同的元素偏好不同, 每首歌包含的元素也不一样, 所以我们就希望找到下面的两个矩阵

1)潜在因子—— 用户矩阵Q

这个矩阵表示不同用户对于不同元素的偏好程度, 1代表很喜欢, 0代表不喜欢, 比如下面这样:

35705207f530aa2aff02fe96bab84b20.png

2)潜在因子——音乐矩阵P

表示每种音乐含有各种元素的成分,比如下表中,音乐A是一个偏小清新的音乐, 含有小清新的Latent Factor的成分是0.9,重口味的成分是0.1,优雅成分0.2.....

99ed256ecda3b3e240083b26da05d5de.png

利用上面的这两个矩阵, 我们就能得出张三对音乐A的喜欢程度:

张三对小清新的偏好 * 音乐A含有小清新的成分 + 张三对重口味的偏好 * 音乐A含有重口味的成分 + 张三对优雅的偏好 * 音乐A含有优雅的成分....,

下面是对应的两个隐向量

40d51c073bb3591811dd69b37093b460.png

根据隐向量其实就可以得到张三对音乐A的打分,即:

0.6∗0.9+0.8∗0.1+0.1∗0.2+0.1∗0.4+0.7∗0=0.69

按照这个计算方式, 每个用户对每首歌其实都可以得到这样的分数,最后就得到了我们的评分矩阵

dc5f8abfda7c1c38c010b0953e1bc480.png

这里的红色表示用户没有打分,我们通过隐向量计算得到的。

上面例子中的小清晰、 重口味、 优雅这些就可以看做是隐含特征, 而通过这个隐含特征就可以把用户的兴趣和音乐的进行一个分类,其实就是找到了每个用户每个音乐的一个隐向量表达形式(embedding的原理其实也是这样,那里是找到每个词的隐向量表达),这个隐向量就可以反映出用户的兴趣和物品的风格,并能将相似的物品推荐给相似的用户等。有没有感觉到是把协同过滤算法进行了一种延伸,把用户的相似性和物品的相似性通过了一个叫做隐向量的方式进行表达。

但是,真实的情况下我们其实是没有上面那两个矩阵的,音乐那么多,用户那么多, 我们没有办法去找一些隐特征去表示出这些东西,另外一个问题就是即使能表示也不一定准,对于每个用户或者每个物品的风格,我们每个人都有不同的看法。所以事实上,我们有的只有用户的评分矩阵,也就是最后的结果,并且一般这种矩阵长这样:

e03e3d7a29789c0f60a34b9624db0292.png

这种矩阵非常的稀疏,如果直接基于用户相似性或者物品相似性去填充这个矩阵是不太容易的, 并且很容易出现长尾问题, 所以矩阵分解就可以比较容易的解决这个问题。

矩阵分解模型其实就是在想办法基于这个评分矩阵去找到上面例子中的那两个矩阵, 也就是用户兴趣和物品的隐向量表达, 然后就把这个评分矩阵分解成Q和P两个矩阵乘积的形式, 这时候就可以基于这两个矩阵去预测某个用户对某个物品的评分了。 然后基于这个评分去进行推荐。这就是矩阵分解算法的原理

1.2 矩阵分解算法

在矩阵分解的算法框架下, 我们就可以通过分解协同过滤的共现矩阵来得到用户和物品的隐向量, 就是上面的用户矩阵Q和物品矩阵P,这也是“矩阵分解”名字的由来。

d23666b0b19256b5a0399da9488e6361.png

矩阵分解算法将 m×n 维的共享矩阵 R 分解成 m×k 维的用户矩阵 U 和 k×n 维的物品矩阵 V 相乘的形式。其中 m 是用户数量,n 是物品数量,k 是隐向量维度,也就是隐含特征个数,只不过这里的隐含特征变得不可解释了,即我们不知道具体含义了,要模型自己去学。k 的大小决定了隐向量表达能力的强弱,k 越大,表达信息就越强,理解起来就是把用户的兴趣和物品的分类划分的越具体。

那么如果有了用户矩阵和物品矩阵的话,我们就知道了如果想计算用户 u 对物品 i 的评分, 只需要

081163c9d035bd775811605922a3f531.png

这里的 pu 就是用户 u 的隐向量, 就类似与上面的张三向量,注意这是列向量, qi 是物品 i 的隐向量,就类似于上面的音乐A向量, 这个也是列向量,所以才用了 pTuqi 得到了一个数,也就是用户的最终评分, 计算过程其实和上面例子中一样。这里的 pu,k 和 qi,k 是模型的参数, 也正是我们想办法要计算的,pu,k 度量的是用户 u 的兴趣和第 k 个隐类的关系,而 qi,k 度量了第 k 个隐类和物品 i 之间的关系。

1.3 矩阵分解算法求解

谈到矩阵分解,最常用的方法是特征值分解(EVD)或者奇异值分解(SVD),但是这两种方式在这里不适用。

首先是EVD,它要求分解的矩阵是方阵,显然用户-物品矩阵不满足这个要求,而传统的SVD分解,会要求原始矩阵是稠密的,而我们这里的这种矩阵一般情况下是非常稀疏的,如果想用奇异值分解,就必须对缺失的元素进行填充,而一旦补全,空间复杂度就会非常高,且补的不一定对。然后就是SVD分解计算复杂度非常高,而我们的用户-物品矩阵非常大,所以基本上无法使用。

2. Funk-SVD算法

2006年的Netflix Prize之后, Simon Funk公布了一个矩阵分解算法叫做Funk-SVD, 后来被Netflix Prize的冠军Koren称为Latent Factor Model ( LFM )。 Funk-SVD的思想很简单: 把求解上面两个矩阵的参数问题转换成一个最优化问题, 可以通过训练集里面的观察值利用最小化来学习用户矩阵和物品矩阵

我们上面已经知道了,如果有了用户矩阵和物品矩阵的话,我们就知道了如果想计算用户 u 对物品i的评分,只需要

ac657b62864227f2794da9e0eb7bba43.png

而现在,我们有真实的 ru,i , 但是没有pTuqi, 那么我们可以初始化一个啊,随机初始化一个用户矩阵 U 和一个物品矩阵 V ,然后不就有pTuqi了?当然你说,随机初始化的肯定不准啊,但是,有了 pTuqi之后,我们就可以计算一个猜测的 ^rui , 即

29f75d613bdfa105039e95d2cfa43777.png

这时候,肯定是不准,那么这个猜测的和真实值之间就会有一个误差

8a7d9824634e35110752efed694caaa7.png

有了误差,我们就可以计算出总的误差平方和

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/582679
推荐阅读
相关标签
  

闽ICP备14008679号