推荐算法集锦(中)—— SVD和CB
1.导读
通过上一篇对推荐系统的协同过滤算法进行详细的介绍后,并且给出模拟推荐案例,相信广大读者对于协同过滤算法的原理也有了一个基本的了解,以及对其中的推荐过程和使用该推荐算法的场景和优势有了一个基本的掌握。在上一篇文章的结尾部分我留了几个思考,也就是关于协同过滤算法劣势的研究,用来引出其他的推荐算法。因此在这篇文章中,我会从这些方面出发,实际地去解决这几点疑虑,并且透彻地去阐述协同过滤算法的劣势,然后给出相应的解决方案和对应的推荐算法。
2.“巧妇乃为无米之炊”——矩阵稀疏问题
2.1 “米”不够?
首先对于协同过滤推荐算法,推荐计算过程中涉及到一个关键性也是基础性的参数就是评分矩阵,这就引出了今天我们需要解决的第一个问题:评分矩阵的疏密程度。评分矩阵的疏密程度是选择对应推荐算法或者处理方法的关键。在实际的应用过程中,由于很多用户在生活中只会对少部分商品进行浏览、购买或者评价,对于大部分的商品都会视而不见、置之不理,因此这样就会导致最终形成的评分矩阵过于稀疏。在设计推荐系统的时候,就会面临一个挑战:使用相对较少或者根本不够的有效评分数据来完成一个相对比较准确的预测。这样的问题无疑是“巧妇难为无米之炊”,至于选取任何一个推荐算法所带来的结果并不会有太大区别。就好比你要煮饭,你的米不够甚至没有米,即使你用铁锅还是铜锅甚至金锅也做不出来满足一家人吃的饭。这里的“米”也就是用户对于物品的评分,而“锅”,则就好比推荐系统,锅的材质也就好比推荐算法。这样,读者就能明白其中的含义了,并能够意识到评分的重要性。
面对这种评分矩阵过于稀疏的问题,最直接的办法就是利用用户或者物品的额外属性数据,对这些数据进行分类和整合操作,来求解相对应的相似用户或者物品列表。这种方法如果这样描述,广大读者可能并不是能够很好地理解其中含义,并不会对这种方法产生深刻的印象。因此,我还是用煮饭的例子来解释下,用户—物品的评分矩阵过于稀疏时(在这先不考虑评分矩阵为空的情况),也就是煮饭的米不够,那么采用的方法就是想办法把米进行分解,也就是把米弄碎,从而得到更多的碎米,利用这些碎米去煮粥就可以满足一家人的需求了。这种比喻也就是上面说的利用用户和物品的额外特征属性数据来进行分类和整合。
2.2 没有“米”?
当然还存在一种情况就是没有米的时候,也就是用户没有任何评分或者说是新来的用户,这里不知道读者有没有似曾相识的感觉。没错,这种情况也就是冷启动情况,在推荐系统详解里已经有了相对应的解决办法,也就是完成一个非个性化推荐。大部分都是使用热销物品或者榜单数据来完成推送,或者在首页弹出窗口来询问用户的喜好和兴趣,根据用户点击的模块来完成推荐。具体的操作方法详见我的文稿(推荐系统详解——个性化推荐与非个性化推荐),在这里就不赘述了。
2.3 基于近邻算法的短板揭露
回到之前说的利用用户和物品的额外特征属性对数据进行分类整合,这种操作相对应的一种算法叫做SVD矩阵因子分解。后面我会讲到;除此之外,还可以通过缺省投票的形式来补全物品的评分,原理就是给那些只有一个或者两个的用户评价的物品一个缺省值,这种方法类似于隐式评分计算;最后还有一个办法,当然也是无奈之举。那就是在没有评分的用户和物品旁边或者近邻找到有评分的用户和物品,以它的评分来填充当前的评分,或者用递增、求均值之类的方法获取到评分来完成当前用户和物品评分。因此,现在可以得出CF——基于近邻推荐算法的全部劣势或者说是短板了,如下所示:
(1)覆盖有限:由于计算两个用户之间的相似度是基于这些用户对于相同一类物品的评分的,并且只有对这一类物品进行评分的用户才可以作为近邻,也叫对等用户。但是由于在实际场景中,很多用户很少对物品进行评分或者没有评分,但是他们的确又有相同的兴趣爱好,这样就会导致推荐算法的覆盖范围受到限制和影响。为解决这一问题,引出了SVD矩阵因子分解推荐算法,它是根据已有用户对物品的评分情况,分析出评分的用户对各个物品的因子喜好程度,以及各个物品对于这些因子的包含程度,最后再反过来根据最终的分析结果预测评分。举个例子来说,在没有进行SVD矩阵因子分解前,只用户A和用户B以及用户C都喜欢看电影,而且看电影的频次也相差不大。但是就看了几部电影,这样就导致可能就两三部电影具有用户们的评分值,这样的评分数量对于评分矩阵来说无疑是不够的,也就会造成评分矩阵的稀疏了。但是通过SVD矩阵因子分解后,发现每个电影可以提取到额外的特征属性因子(有励志、搞笑、人文、爱情等属性因素),这样就可以提取到更多属性的评分值。通过这种属性也就会发现用户A可能跟用户B喜好相同,可能都喜欢看搞笑或者爱情类的电影,而用户C可能更喜欢看恐怖或者励志类的电影。这样就可以根据用户B的行为来预测A的行为了。使推荐给A的电影更符合A的口味。因此,通过SVD矩阵因子的方式就可以找出更多影响评分的因子,并且将更多有意义的关联信息挖掘出来,推荐出符合用户需求和意愿的物品。
(2)对稀疏数据的敏感:其实这个问题和上面覆盖有限的问题有些类似。因为评分矩阵的稀疏性是大多数推荐系统的共同问题。主要是看评分举证的稀疏程度,在上面讲的SVD矩阵因子分解算法使用中,如果分解后的物品属性因子还是不够稠密,形成的因子评分矩阵依旧稀疏,但是又不是新用户,还有有一定的历史购买行为或者浏览行为。类似这样的用户就不至于采取非个性化推荐了,因为毕竟要考虑到推荐的人性化、智能化,榜单热销物品数据不是万能的,有一定历史行为的用户还是要考虑其中的历史行为因素,争取做到个性化推荐。目前为了解决这一类问题,可采取基于内容的推荐算法。基于内容的推荐算法是直接根据用户的历史偏好来推荐与用户历史偏好相关的物品,这样就兼顾了每个用户所特有的属性,完成个性化推荐。
针对上面两个问题引出来了两个算法分别是SVD矩阵因子分解算法和基于内容的推荐算法,这两个算法就是这篇文章的重点。有了这个“引子”,下面就开始燃起这两个算法的“导火线”了。
3.SVD矩阵因子分解算法
3.1 SVD算法
首先来看下SVD(Singular Value Decomposition)的数学定义:将给定的评分矩阵S分解成为三个矩阵的乘积,其中U和V称为左、右奇异向量,在本章中可理解为用户矩阵和物品因子矩阵,对角线上的值称为奇异值;S为n*m的矩阵,U为n*n矩阵,Q为n*m的矩阵,V为m*m的矩阵;在下面公式中,可以使用k个奇异值来近似地替代R矩阵,因为前1%的奇异值的和就占了全部奇异值和的99%以上,因为除了中间的奇异值之外,其余的奇异值基本都是0。公式如下:
然后需要将U、V矩阵进行转换得到用户因子矩阵C和物品因子矩阵P,将奇异矩阵Q开平方分别乘到U和V矩阵,如同将奇异矩阵Q做了一个开方然后乘积的变换。得到用户因子矩阵C和物品因子矩阵P如下:
最后用户t对物品i的评分预测就为用户因子矩阵的第t行乘上物品因子矩阵的第i列(即物品因子矩阵的第i行的转置),如下所示:
3.2 参数优化
在进行用户因子矩阵C和物品因子矩阵P的计算时,可以通过SGD随机梯度下降的方式进行学习来不断迭代调整更新相关参数。对于没有评分的情况则不需要计算误差值,直接令误差值为0即可。上面提到的SGD随机梯度下降的方法由于涉及的内容较多,不容易理解,并且怕读者将SGD随机梯度下降和SVD矩阵因子分解相互混淆,在这就不再继续对SDG随机梯度下降进行原理上的阐述了。我会将SGD随机梯度下降方法令作一个专题去分析阐述,因为它也涉及到一些人工智能的神经网络的运用。希望广大读者在这就先熟悉适应下公式即可:
3.3 SVD算法缺陷
SVD矩阵因子分解在实际推荐系统中很少使用,因为它很难进行在线计算,以至于不能很好地处理用户的实时行为反馈,也就没有实时处理能力。而且对于大型的推荐系统而言,直接进行协同过滤或者SVD矩阵因子分解的话,可能会存在计算的复杂度过高的问题,这个时候就可以考虑K-means聚类算法做处理,将大量的评分数据进行分组,将每一组的所有数据归为一类或一个因子,然后再进行协同过滤处理,对于K-means算法原理和作用在这就不作赘述。之后这些漏掉的算法原理会以补充篇来专门讲述。
4.CB—基于内容的推荐算法
4.1 CB算法及其特点、应用
基于内容的推荐算法(Content-based Recommendations)相比较于协同过滤算法,也是一种工业界或者互联网业界应用比较广泛的推荐算法了。这是针对于协同过滤推荐算法中,仅仅基于用户对商品评分推荐导致的评分矩阵过于稀疏(以至于矩阵因子分解后依旧达不到理想的丰富评分矩阵要求)所提出的推荐算法。这种推荐算法在某种程度上也解决了一部分冷启动问题(虽然不是进行新用户推荐)。基于内容的推荐算法可以根据物品的特性或者用户的历史行为或者特殊偏好等特征属性来进行比较直观的推荐。这种算法仅仅只考虑推荐的用户,而不去在意其他用户群以及最近邻。
CB算法特点:CB—基于内容的推荐算法虽然也需要依赖物品和用户偏好的额外信息,但是它并不需要太多的用户评分和对等用户群的偏好属性记录,换句话说,也就是只有一个用户时,使用基于内容的推荐算法也可以完成推荐功能,并且产生一个物品的推荐列表。而这些是基于协同过滤算法的推荐所办不到的。
CB算法应用:基于内容的推荐算法起初设计出来时为了推荐用户感兴趣或者有意思的文本文档,在一些文本文档推荐中经常可以看到基于内容的推荐算法的“身影”。但是在目前也会开始将该算法应用在其他推荐领域了。基于内容完成推荐在未来也会得到进一步的推广与应用。
4.2 CB算法 VS 协同过滤算法
下面我们来看下CB(基于内容)和(协同过滤)两个算法的区别:
CB(基于内容的推荐算法)的推荐系统会根据用户过去喜欢物品,试图推荐给用户过去喜欢的物品的相似替代品,所推荐的物品是跟用户过去感兴趣或者购买过的物品是属于同一类的,并且CB算法不需要依赖用户—物品评分矩阵;
CF(协同过滤的推荐算法)的推荐系统则会试图识别出与当前用户具有相同兴趣爱好的其他用户,来将这些其他用户所喜欢过的物品推荐给当前用户。CF算法则是需要基于用户—物品评分矩阵来完成推荐的。
4.3 CB算法实现步骤与结构
CB算法实现步骤如下:
(1)Item Representation(对象表示):就是为每一个item(对象)抽取出一些特征属性出来,也就是结构化物品的操作,相对应的处理过程也叫内容分析;
(2)Profile Learning(特征学习):利用当前用户的历史行为信息或者过去喜欢(不喜欢)的item的特征数据信息,来学习当前用户的喜好特征(Profile),相对应的处理过程叫做Profile Learning;
(3)Recommendation Generation(推荐迭代):通过分析上一步得到的用户Profile(特征),为该当前用户推荐一组相关性或者相似度最大的item即可,相对应的处理过程叫做Filtering Component(过滤组件)。
由BC推荐算法的实行步骤不难得出BC推荐算法运行的结构,将BC推荐原理过程绘制成直观的结构图如下所示:
4.4 CB—Item Representation
在绘制完BC推荐算法的结构图后,在这额外补充一点:在对物品特征属性的挖掘抽取中,也就是Item Representation过程中,主要包括对数值型数据的处理和非数值型数据的处理,这在机器学习中采用的主要处理方式有以下几种:
(1)数值型数据归一化:就是将数值型数据统一除以自己数据总和,用每一个数据在数据总和中的占比来表示该数据,使得每个数据的表示范围都在[0,1]之间,这也是最为简单的数值型数据归一化方法;
(2)数值型数据二值化:依据各个数据值来设置一个默认值,设定一个条件规则如数
据值大于等于默认值,则表示为1,小于默认值表示为-1。像这样的设定限定条件来使每一个数据值都只有两种值中的一种,也就是所谓的二值化;
(3)非数值型数据转换成特征向量:将每一个非数值型数据用对应的向量型数值表示;
(4)TF-IDF:一种用于信息检索与数据挖掘的常用加权技术。TF是词频,IDF是逆文本频率指数,通常用来评估一个字词对于一个文件集中的一份文件的重要程度。
(5)Word2Vec:一群用来产生词向量的相关模型,会涉及到神经网络的训练。
4.5 CB—Pofile Learning
假设用户对于某些物品已经有了喜好判断,喜欢其中一部分的物品,不喜欢另外一部分,那么这个过程其实就是通过用户过去的喜好来进行判断,从而构建一个判别模型,最后再根据这个模型来判断用户对于一个新的物品是否喜欢。这是一个比较典型的有监督学习问题,在理论上也是可以使用机器学习的分类算法来求解所需要的的判别模型,这也为今后算法的优化提供了研究方向,也就是结合深度学习技术来不断完善判别模型,使得判别模型更加地贴合用户兴趣。
在这一过程中涉及到的常用算法有最近邻方法、决策树方法、线性分类算法、朴素贝叶斯算法等,这些算法都是在人工智能领域或者说是深度学习领域常用的处理数据的算法,由于本文只讲推荐算法,涉及到的这些深度学习领域的算法我会在今后介绍深度学习的专题里进行阐述。至于最近邻方法由于是推荐系统最关键、也最常用的算法,我会以补充稿的形式来详细阐述并更好地进行该推荐算法系列的差缺补漏。通过这些涉及到机器学习的知识不难发现,基于内容推荐其实主要就依赖机器学习算法的基础上来做的一个推荐。
4.6 CB算法大剖析
通过上述文字,不难知道基于内容的推荐算法(CB)的优缺点,下面我们就展开了解下,
对于CB推荐算法的优点主要有以下几个:
(1)用户独立性:这个性质也脱离了协同过滤算法依赖其他近邻的特征属性的限制,真正意义上做到仅有一个用户也能完成个性化推荐。在构建模型的过程中,CB算法只需要考虑当前推荐用户的信息就可以了,非常独立的一种推荐算法;
(2)透明度:通过CB算法的运行结构就可以知道,CB算法通过显式地列出使得物品出现在推荐列表中的内容特征和描述信息,也就可以很好的、较为明确或者透明地解释推荐系统是如何工作的了;
(3)新物品性:这个是针对于物品评分没有的情况下的特性。也就是说,即使当前用户对这个物品并没有评分,甚至这个物品没有任何评分,但是BC算法可以基于当前用户历史行为找到与该物品想类似且有用户评分的物品,那么CB推荐算法就可以将这个没有任何评分的物品推荐给当前用户,也就是完成了新物品(没有任何评分的物品)的推荐。
当然,任何推荐算法都是只能用来解决某一类问题或者处理某一类情况的,因此,CB算法也有它自身难以克服的缺点:
(1)抽取特征难度大(可分析的内容有限):对于当前用户(物品),如果他的浏览历史(特征属性)不够丰富,那么就会导致提取的特征不具备很好的表示能力,对于最终的推荐效果产生负面的影响。这个问题是与推荐对象相关的特征数量和类型有限相关的,并且依赖于领域知识,也就是机器学习算法的好坏;
(2)容易造成长尾效应:长尾效应在之前的文章中已经做过解释,CB算法推荐很可能会导致长尾效应的出现,以至于无法发现用户的潜在兴趣,造成用户的兴趣过度专一特化。因为CB推荐算法中的推荐结果一直都是和用户以前喜欢的物品类似的,经过CB算法推荐,用户始终停留在以前那一块兴趣领域中,无法跨越出来,喜欢上其他领域的物品。但是真实情况是当前用户肯定不止这一块领域的兴趣爱好,因而CB推荐算法就无法发现该当前用户可能还喜欢其他领域内容,也就会造成用户兴趣过度专一特化,长尾效应也就出现了;
(3)冷启动问题:也就是无法为新注册的用户产生推荐,因为CB算法依赖的是当前用户的历史行为数据,对于一个完全没有历史行为数据的新注册用户也就不可能为他产生一个比较可靠的推荐结果了。这个问题也是之前协同过滤算法存在的问题,好在已将在之前的文
章中用非个性化推荐解决了这个问题,就不再继续描述了。