版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_27717921/article/details/78230699
关于SVD
SVD (Sigular Value Decomposition)奇异值分解,主要用于降维、压缩、隐性语义以及推荐系统上。要了解奇异值分解,首先要了解特征值分解,通过求解一个矩阵的特征值,我们可以把一个矩阵通过映射、拉伸或者压缩投射到一个新的空间中,相对于原空间来讲,投射到的新空间的维度会增加(一般是从一个二维空间向高维空间转换)在高维空间中的维度我们就能提取到一个矩阵的主要特征。奇异值也是这样,只不过特征值的特征提取只能针对与方阵而言,而奇异值并没有这个要求可以获得m*n矩阵的特征(m不等于n)。 特征分解
满足上式的lambda 为特征值,对应的向量x为特征向量。 A矩阵可以表示为:
k为A矩阵特征值的个数,U矩阵为正交矩阵。 A可以分解为特征向量加和的形式。最终Ax则演变为
x则会被经过拉长、压缩等操作映射到一个A的特征向量作为维度方向的空间中。 同样的我们再来看SVD。 SVD的适用性更强,不要求必须为方阵,在日常生活中可能很多情况都不能满足方阵,比如用户对菜品的打分,在一般情况下,菜品的维度要比用户的维度小很多,不能满足特征值分解对矩阵为方阵的条件,在这种情况下一般使用的就是奇异值分解。 奇异值的计算
为方阵,求这个方阵的特征值的平方根对应为矩阵A的奇异值。 同样的SVD还可以用来求解伪逆,这里推荐一篇博客。 SVD矩阵分解后
k是一个远小于m,n的整数。 U就是左奇异向量,VT就是右奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。
SVD的压缩存储
因此SVD可以应用在图片压缩上,原始图像假设为32*32=1024像素的,那么如果我们不进行压缩存储,那么我们就需要存储1024个像素点,但是如果我们采用SVD压缩存储,k=2的时候就能获得图像的90%以上的能量,那么我们只需要存储32*2 32*2 2=130个数字,通过
就能近似的还原原图像,并且实现了将近十几倍的压缩比。
SVD的隐性语义分析
对文章进行分类可以利用余弦相似度来计算,但是通常我们处理的文章数量十分大,词语非常多,可能会达到百万级别上,如果按照两两文章计算相似度计算量是非常大,而SVD矩阵分解能有效的降低计算复杂度。 首先有一个文章-词的矩阵A,维度为M*N,M为文章的个数,N为M个文章形成的整个语义库的大小。A表示了文章和词的关联程度。Ai,j表示第 j 个词在第 i 篇文章中出现的加权词频(比如,TF/IDF)。 SVD矩阵分解分解为3个矩阵
SVD分解不仅能减少存储量和计算量,并且这三个矩阵还有着十分明确的物理含义。第一个矩阵X中的每一行表示意思相关的一类词,其中的每个非零元素表示这类词中每个词的重要性(或者说相关性),数值越大越相关。最后一个矩阵Y中的每一列表示同一主题一类文章,其中每个元素表示这类文章中每篇文章的相关性。中间的矩阵则表示类词和文章雷之间的相关性。因此,我们只要对关联矩阵A进行一次奇异值分解,我们就可以同时完成了近义词分类和文章的分类。(同时得到每类文章和每类词的相关性)
SVD 的推荐系统
基于SVD的推荐系统要结合向量相似度的计算度的方法,找到与待推荐用户相似的用户的项目评分情况进行推荐(基于用户的协同过滤方法推荐)或者找到与待推荐用户评分高的项目相似的项目进行推荐(基于内容的协同过滤方法推荐)。所以如果我们要想进行协同过滤,需要经过向量相似度计算,而用户与用户的向量相似度计算或者是项目与项目的向量相似度计算都要涉及到获得用户的潜在特征向量和项目的潜在特征向量,而SVD的矩阵分解获得U矩阵和V矩阵的物理的含义无疑就是这样的。
U矩阵行向量表示用户u的k维特征表示,V矩阵的行向量表示项目i的k维特征表示。我们可以用U矩阵的任意两行行向量计算用户u1和u2的相似度,或者用V矩阵的任意两行行向量来计算项目i1和i2的相似度。计算向量相似度的公式有很多,这里用的为余弦相似度。 当我们拿到一个新的用户u3时,或许u3并没有对所有的项目打分或者是评价,那么这个行向量就是稀疏的,也就说N个元素的行向量中为0的元素非常多,我们希望能用协同过滤的方法推测出用户u3对这些缺失值的评分情况。 假设u3评分的行向量为w,w是稀疏的,首先我们要把w转换为低维空间
在U矩阵的m个用户分别与wnew计算余弦相似度,将与用户u3相似度高的用户打分的项目并且用户u3没有打分的项目推荐给用户u3或者作为用户u3对此项目的打分。