矩阵分解在协同过滤推荐算法中的应用

  在协同过滤推荐算法总结中,我们讲到了用矩阵分解做协同过滤是广泛使用的方法,这里就对矩阵分解在协同过滤推荐算法中的应用做一个总结。(过年前最后一篇!祝大家新年快乐!明年的目标是写120篇机器学习,深度学习和NLP相关的文章)

1. 矩阵分解用于推荐算法要解决的问题

    在推荐系统中,我们常常遇到的问题是这样的,我们有很多用户和物品,也有少部分用户对少部分物品的评分,我们希望预测目标用户对其他未评分物品的评分,进而将评分高的物品推荐给目标用户。比如下面的用户物品评分表:

用户\物品 物品1 物品2 物品3 物品4 物品5 物品6 物品7
用户1 3   5     1  
用户2   2         4
用户3       4      
用户4     2       1
用户5 1       4    

    对于每个用户,我们希望较准确的预测出用户对未评分物品的评分。对于这个问题我们有很多解决方法,本文我们关注于用矩阵分解的方法来做。如果将m个用户和n个物品对应的评分看做一个矩阵MM,我们希望通过矩阵分解来解决这个问题。

2. 传统的奇异值分解SVD用于推荐

    说道矩阵分解,我们首先想到的就是奇异值分解SVD。在奇异值分解(SVD)原理与在降维中的应用中,我们对SVD原理做了总结。如果大家对SVD不熟悉的话,可以翻看该文。

    此时可以将这个用户物品对应的m×nm×n矩阵MM进行SVD分解,并通过选择部分较大的一些奇异值来同时进行降维,也就是说矩阵MM此时分解为:

Mm×n=Um×kΣk×kVTk×nMm×n=Um×kΣk×kVk×nT

  

    其中k是矩阵MM中较大的部分奇异值的个数,一般会远远的小于用户数和物品树。如果我们要预测第i个用户对第j个物品的评分mijmij,则只需要计算uTiΣvjuiTΣvj即可。通过这种方法,我们可以将评分表里面所有没有评分的位置得到一个预测评分。通过找到最高的若干个评分对应的物品推荐给用户。

    可以看出这种方法简单直接,似乎很有吸引力。但是有一个很大的问题我们忽略了,就是SVD分解要求矩阵是稠密的,也就是说矩阵的所有位置不能有空白。有空白时我们的MM是没法直接去SVD分解的。大家会说,如果这个矩阵是稠密的,那不就是说我们都已经找到所有用户物品的评分了嘛,那还要SVD干嘛! 的确,这是一个问题,传统SVD采用的方法是对评分矩阵中的缺失值进行简单的补全,比如用全局平均值或者用用户物品平均值补全,得到补全后的矩阵。接着可以用SVD分解并降维。

    虽然有了上面的补全策略,我们的传统SVD在推荐算法上还是较难使用。因为我们的用户数和物品一般都是超级大,随便就成千上万了。这么大一个矩阵做SVD分解是非常耗时的。那么有没有简化版的矩阵分解可以用呢?我们下面来看看实际可以用于推荐系统的矩阵分解。

3. FunkSVD算法用于推荐

    FunkSVD是在传统SVD面临计算效率问题时提出来的,既然将一个矩阵做SVD分解成3个矩阵很耗时,同时还面临稀疏的问题,那么我们能不能避开稀疏问题,同时只分解成两个矩阵呢?也就是说,现在期望我们的矩阵MM这样进行分解:

Mm×n=PTm×kQk×nMm×n=Pm×kTQk×n

    我们知道SVD分解已经很成熟了,但是FunkSVD如何将矩阵MM分解为PP和QQ呢?这里采用了线性回归的思想。我们的目标是让用户的评分和用矩阵乘积得到的评分残差尽可能的小,也就是说,可以用均方差作为损失函数,来寻找最终的PP和QQ。

    对于某一个用户评分mijmij,如果用FunkSVD进行矩阵分解,则对应的表示为qTjpiqjTpi,采用均方差做为损失函数,则我们期望(mij?qTjpi)2(mij?qjTpi)2尽可能的小,如果考虑所有的物品和样本的组合,则我们期望最小化下式:

∑i,j(mij?qTjpi)2∑i,j(mij?qjTpi)2

    只要我们能够最小化上面的式子,并求出极值所对应的pi,qjpi,qj,则我们最终可以得到矩阵PP和QQ,那么对于任意矩阵MM任意一个空白评分的位置,我们可以通过qTjpiqjTpi计算预测评分。很漂亮的方法!

    当然,在实际应用中,我们为了防止过拟合,会加入一个L2的正则化项,因此正式的FunkSVD的优化目标函数J(p,q)J(p,q)是这样的:

argminpi,qj∑i,j(mij?qTjpi)2+λ(||pi||22+||qj||22)argmin?pi,qj∑i,j(mij?qjTpi)2+λ(||pi||22+||qj||22)

    其中λλ为正则化系数,需要调参。对于这个优化问题,我们一般通过梯度下降法来进行优化得到结果。

    将上式分别对pi,qjpi,qj求导我们得到:

?J?pi=?2(mij?qTjpi)qj+2λpi?J?pi=?2(mij?qjTpi)qj+2λpi

?J?qj=?2(mij?qTjpi)pi+2λqj?J?qj=?2(mij?qjTpi)pi+2λqj

    则在梯度下降法迭代时,pi,qjpi,qj的迭代公式为:

pi=pi+α((mij?qTjpi)qj?λpi)pi=pi+α((mij?qjTpi)qj?λpi)

qj=qj+α((mij?qTjpi)pi?λqj)qj=qj+α((mij?qjTpi)pi?λqj)

    通过迭代我们最终可以得到PP和QQ,进而用于推荐。FunkSVD算法虽然思想很简单,但是在实际应用中效果非常好,这真是验证了大道至简。

4. BiasSVD算法用于推荐

    在FunkSVD算法火爆之后,出现了很多FunkSVD的改进版算法。其中BiasSVD算是改进的比较成功的一种算法。BiasSVD假设评分系统包括三部分的偏置因素:一些和用户物品无关的评分因素,用户有一些和物品无关的评分因素,称为用户偏置项。而物品也有一些和用户无关的评分因素,称为物品偏置项。这其实很好理解。比如一个垃圾山寨货评分不可能高,自带这种烂属性的物品由于这个因素会直接导致用户评分低,与用户无关。

    假设评分系统平均分为μμ,第i个用户的用户偏置项为bibi,而第j个物品的物品偏置项为bjbj,则加入了偏置项以后的优化目标函数J(p,q)J(p,q)是这样的

argminpi,qj∑i,j(mij?μ?bi?bj?qTjpi)2+λ(||pi||22+||qj||22+||bi||22+||bj||22)argmin?pi,qj∑i,j(mij?μ?bi?bj?qjTpi)2+λ(||pi||22+||qj||22+||bi||22+||bj||22)

    这个优化目标也可以采用梯度下降法求解。和FunkSVD不同的是,此时我们多了两个偏执项bi,bjbi,bj,,pi,qjpi,qj的迭代公式和FunkSVD类似,只是每一步的梯度导数稍有不同而已,这里就不给出了。而bi,bjbi,bj一般可以初始设置为0向量,然后参与迭代。这里给出bi,bjbi,bj的迭代方法

bi=bi+α(mij?μ?bi?bj?qTjpi?λbi)bi=bi+α(mij?μ?bi?bj?qjTpi?λbi)

bj=bj+α(mij?μ?bi?bj?qTjpi?λbj)bj=bj+α(mij?μ?bi?bj?qjTpi?λbj)

    通过迭代我们最终可以得到PP和QQ,进而用于推荐。BiasSVD增加了一些额外因素的考虑,因此在某些场景会比FunkSVD表现好。

5. SVD++算法用于推荐

    SVD++算法在BiasSVD算法上进一步做了增强,这里它增加考虑用户的隐式反馈。好吧,一个简单漂亮的FunkSVD硬是被越改越复杂。

    对于某一个用户i,它提供了隐式反馈的物品集合定义为N(i)N(i), 这个用户对某个物品j对应的隐式反馈修正的评分值为cijcij, 那么该用户所有的评分修正值为∑s∈N(i)csj∑s∈N(i)csj。一般我们将它表示为用qTjysqjTys形式,则加入了隐式反馈项以后的优化目标函数J(p,q)J(p,q)是这样的:

argminpi,qj∑i,j(mij?μ?bi?bj?qTjpi?qTj|N(i)|?1/2∑s∈N(i)ys)2+λ(||pi||22+||qj||22+||bi||22+||bj||22+∑s∈N(i)||ys||22)argmin?pi,qj∑i,j(mij?μ?bi?bj?qjTpi?qjT|N(i)|?1/2∑s∈N(i)ys)2+λ(||pi||22+||qj||22+||bi||22+||bj||22+∑s∈N(i)||ys||22)

    其中,引入|N(i)|?1/2|N(i)|?1/2是为了消除不同|N(i)|个数引起的差异。式子够长的,不过需要考虑用户的隐式反馈时,使用SVD++还是不错的选择。

6. 矩阵分解推荐方法小结

    FunkSVD将矩阵分解用于推荐方法推到了新的高度,在实际应用中使用也是非常广泛。当然矩阵分解方法也在不停的进步,目前张量分解和分解机方法是矩阵分解推荐方法今后的一个趋势。

    对于矩阵分解用于推荐方法本身来说,它容易编程实现,实现复杂度低,预测效果也好,同时还能保持扩展性。这些都是它宝贵的优点。当然,矩阵分解方法有时候解释性还是没有基于概率的逻辑回归之类的推荐算法好,不过这也不影响它的流形程度。小的推荐系统用矩阵分解应该是一个不错的选择。大型的话,则矩阵分解比起现在的深度学习的一些方法不占优势。

时间: 2024-10-07 01:14:55

矩阵分解在协同过滤推荐算法中的应用的相关文章

协同过滤推荐算法简述

协同过滤推荐算法是一种主流的.目前广泛应用在工业界的推荐算法. 一般,协同过滤推荐分为三种类型. 1.基于用户(user-based)的协同过滤 基于用户的协同过滤算法,主要考虑的是用户和用户之间的相似度,只要找出与目标用户相似度高的其他用户,根据相似用户喜欢的物品,预测目标用户对对应物品的评分,就可以找到评分最高的若干个物品推荐给用户. 2.基于项目(item-based)的协同过滤 基于项目的协同过滤算法,类似于基于用户的协同过滤,只是这往往是根据用户的行为判断物品的相似度(并不是根据物品的

协同过滤推荐算法总结

推荐算法具有非常多的应用场景和商业价值,因此对推荐算法值得好好研究.推荐算法种类很多,但是目前应用最广泛的应该是协同过滤类别的推荐算法,本文就对协同过滤类别的推荐算法做一个概括总结,后续也会对一些典型的协同过滤推荐算法做原理总结. 一.推荐算法概述 推荐算法是非常古老的,在机器学习还没有兴起的时候就有需求和应用了.概括来说,可以分为以下5种: 1)基于内容的推荐:这一类一般依赖于自然语言处理NLP的一些知识,通过挖掘文本的TF-IDF特征向量,来得到用户的偏好,进而做推荐.这类推荐算法可以找到用

基于用户的协同过滤推荐算法原理和实现

在推荐系统众多方法中,基于用户的协同过滤推荐算法是最早诞生的,原理也较为简单.该算法1992年提出并用于邮件过滤系统,两年后1994年被 GroupLens 用于新闻过滤.一直到2000年,该算法都是推荐系统领域最著名的算法. 本文简单介绍基于用户的协同过滤算法思想以及原理,最后基于该算法实现园友的推荐,即根据你关注的人,为你推荐博客园中其他你有可能感兴趣的人. 基本思想 俗话说"物以类聚.人以群分",拿看电影这个例子来说,如果你喜欢<蝙蝠侠>.<碟中谍>.&l

一个简单的协同过滤推荐算法

1.推荐系统简介 个性化推荐是根据用户的兴趣特点和购买行为,向用户推荐用户感兴趣的信息和商品. 2.推荐系统分类 2.1基于内容的推荐(Content-based Recommendation) 基于内容的推荐系统的核心思想是挖掘被推荐对象的信息.基于内容的推荐算法的前提假设是:如果用户喜欢物品a,那么用户也应该会喜欢与a类似的物品.由于笔者的目的是侧重于介绍协同过滤推荐算法,所以对基于内容的推荐算法举个简单的例子一带而过: 假设一首歌有:名称.歌手.风格.作曲人这4个属性.如果用户Alice对

SimRank协同过滤推荐算法

在协同过滤推荐算法总结中,我们讲到了用图模型做协同过滤的方法,包括SimRank系列算法和马尔科夫链系列算法.现在我们就对SimRank算法在推荐系统的应用做一个总结. 1. SimRank推荐算法的图论基础 SimRank是基于图论的,如果用于推荐算法,则它假设用户和物品在空间中形成了一张图.而这张图是一个二部图.所谓二部图就是图中的节点可以分成两个子集,而图中任意一条边的两个端点分别来源于这两个子集.一个二部图的例子如下图.从图中也可以看出,二部图的子集内部没有边连接.对于我们的推荐算法中的

什么是协同过滤推荐算法?

剖析千人千面的大脑——推荐引擎部分,其中这篇是定位:对推荐引擎中的核心算法:协同过滤进行深挖. 首先,千人千面融合各种场景,如搜索,如feed流,如广告,如风控,如策略增长,如购物全流程等等:其次千人千面的大脑肯定是内部的推荐引擎,这里有诸多规则和算法在实现对上述各个场景进行“细分推荐排序”:最后是推荐引擎的算法又以“协同过滤”为最核心.最主流热门,也是当下众多内容型.电商型.社交工具.分发型的基础. 由于协同过滤的算法介绍,网上也蛮多但片段化.要么侧重讲“原理流程”,这个占了4成:要么讲算法公

推荐算法-协同过滤推荐算法

layout: post title: "推荐算法-协同过滤推荐算法" date: 2020-4-13 9:00:00 categories: [Algorithm] excerpt: "协同过滤推荐算法简介,参考https://zhuanlan.zhihu.com/p/40463528" 协同过滤推荐算法步骤 1.收集用户偏好 推测用户的喜好就要收集用户的信息,用户收藏的类别,评论,下载,转发这些信息可以数字化,作为用户信息二维矩阵的变量. 2.用户数据的减噪和归

(2)协同过滤推荐算法概述 摘要

依据网络用户对于信息的喜好程度,通过寻找信息之间的相关性或用户之间的相似性程度从而为用户提供有效内容的推荐算法即为协同过滤推荐算法.协同过滤推荐算法是推荐算法中应用最广泛,最成功的.它又分为基于用户的协同过滤和基于项目的协同过滤两种方式.前者是基于用户之间的相似性进行推荐,而后者是基于项目之间的相似性进行推荐.对两种协同过滤算法进行比较,基于用户的协同过滤算法更具社会化的特点,存储消耗和用户数量有关:基于项目的协同过滤算法更具个性化的特点,存储消耗和物品数量有关.协同过滤推荐算法存在数据稀疏性问

协同过滤推荐算法的原理及实现

一.协同过滤算法的原理及实现 协同过滤推荐算法是诞生最早,并且较为著名的推荐算法.主要的功能是预测和推荐.算法通过对用户历史行为数据的挖掘发现用户的偏好,基于不同的偏好对用户进行群组划分并推荐品味相似的商品.协同过滤推荐算法分为两类,分别是基于用户的协同过滤算法(user-based collaboratIve filtering),和基于物品的协同过滤算法(item-based collaborative filtering).简单的说就是:人以类聚,物以群分.下面我们将分别说明这两类推荐算法