奇异值分解SVD在简单推荐系统中的应用

来源:互联网 发布:淘宝电子面单打印软件 编辑:程序博客网 时间:2024/06/11 17:12

说到奇异值分解SVD,对机器学习有所了解的朋友都或多或少了解一些,无非就是将原始数据按照一定规则分解为三个矩阵,其中中间的矩阵的对角元素就是“奇异值”,是按照从大到小的顺序排列的。我们可以按照一定的方法选择最重要的前几个奇异值,同时相应地删减第一个和第二个矩阵的某些行和列。这样,删减后的三个矩阵相乘后,可以重构出一个数据矩阵,而这个矩阵和原始数据矩阵在一定程度上相差无几,从而达到了降维和简化运算的目的。

        然而,除了简单的理解了SVD的原理之外,我们还需要结合表达式对其概念进行精确的理解,这样才能具体地使用SVD去解决我们遇到的问题。这几天又拿出《机器学习实战》来看,看到第十四章“利用SVD简化数据”,有些地方有一些说的不明确,所以拿出来讨论一下。

        说到SVD,就不得不提到一篇论文《2010 A SINGULAR VALUE DECOMPOSITION APPROACH FOR RECOMMENDATION SYSTEMS》,网上的很多和SVD有关的信息都或多或少提到这篇论文。这篇论文把SVD讲的非常简单明了,还对SVD在推荐系统中的应用进行了详细的探讨。建议对推荐系统有强烈兴趣的朋友一定要仔细研读这篇论文。本文也就是结合这篇论文和《机器学习实战》,将一些细节问题搞清楚。

        假设原始数据矩阵为A,有m行n列,这里记作Amxn,经过SVD分解后,Amxn可以表达成以下形式:

                        

        其中,U的每一列称作左奇异向量;S是对角矩阵,对角线上的值按照从大到小排列,称作奇异值;V的每一列(即V的转置VT的每一行)称作右奇异向量。计算SVD实际上就是计算ATA或者AAT的特征值和特征向量,然后将它们组合成上边表达式形式。AAT的特征向量按照特征值的大小按列排列便组成了U矩阵,同样ATA的特征向量按照其特征值的大小按列排列便组成了V矩阵,S矩阵对角线上的值实际就是AAT或者ATA特征值的平方根。

        以上是理论,下面开始实战了!

        刚开头的时候讲到,SVD之后,我们选取最有价值的几个奇异值重构矩阵,这样就可以起到去除噪声,简化数据的作用。但是,降维是怎么做到的呢?其实,在推荐系统中,将矩阵进行SVD处理之后,我们提取出最关键的奇异值之后,并没有重构矩阵用于使用,而是直接使用分解得到的U矩阵或者V矩阵。

        在《机器学习实战》中的推荐引擎,采用的是称作基于物品的协同过滤算法。关于此算法在这里不做阐述。既然是基于物品的,那么免不了要计算物品之间的相似度。如果原始矩阵的每一行代表同一个用户对不同物品的评价,每一列代表所有用户对同一物品的评价。在最初的时候,原始矩阵的每一列组成这个物品的一个向量。那么,计算两个物品的相似度少不了计算这样的两个向量之间的距离。这样,向量的长度就成为影响计算量的一个影响因素。最初的时候向量的长度为同时对这两个物品都有过反馈的用户的个数。可以想象当用户很多时这个个数也就很大。

        于是,我们采用SVD对原始数据进行简化。如果用于基于物品的协同过滤推荐,那么就直接使用V矩阵代替A矩阵;如果是基于用户的协同过滤推荐,就直接用U矩阵代替A矩阵。这时,在计算上述的两个向量之间的距离的时候,向量的长度不再是对这两个物品都有过反馈的用户的个数,而是简化后数据的维度,即S矩阵中我们保留前k个奇异值,那么这个k就是现在向量的长度。当然,这时候的物品向量也和之前大有不同,相当于之前所有物品组成的向量是A,简化后所有物品组成的向量为V[:,0:k],即V的前k列,也是VT的前k行。

        那么,在基于物品的协同过滤算法中,如何得到简化后的数据呢?也就是上面说到的矩阵V的前k列。在《机器学习实战》中,采用的是用原始数据A和矩阵U的精简部分以及S的精简部分重构,即:

                                          xformedItems = dataMat.T * U[:,:4] * Sig4.I

这里dataMat相当于前面的A矩阵,U还是那个U,Sig4.I是奇异值矩阵S的逆。其实就是进行了转化运算。为什么不直接用矩阵VT呢?费解~

        在这里需要提出的是:那篇著名的论文中似乎有一个小错误,就是论文第28页,降维后VT应该取前2行而不是前两列。欢迎同学们一起讨论。还有,为什么V要采用VT这种转置的表达形式呢?我觉得是因为,本来V和U都是一致的形式,即他们的列向量都是左或者右奇异向量。然后为了保留T的这种特性,然而又要照顾到公式中的矩阵连乘,便将T转置了。但是我们一定要明白,VT的行向量才是右奇异向量。

        最后需要说明的是,SVD的神奇之处不止于此。上面的基于物品的协同过滤算法,我们用V的一部分来代替全部数据A;如果是基于用户的协同过滤算法,我们就可以用U的一部分来代替全部数据A。真的只有这个作用吗?没了吗?其实,SVD不光是简化了数据,其降维后实际相当于对原来数据进行了一次特征提取,根据此特征对原始数据进行了一次聚类。聚类的个数就是简化后物品向量的维数。聚类后每一个特征相当于某种概念或者主题。在信息检索领域,。我们称利用SVD的方法为隐性语义索引(Latent Semantic Indexing, LSI) 或隐性语义分析(LatentSemanticAnalysis, LSA)。关于此问题下次有空再总结。

        

0 0
原创粉丝点击