奇异值分解在机器学习中应用广泛,其中在PCA、LDA以及推荐系统中发挥着很大的作用,所谓的奇异值分解就是将一个复杂的矩阵用更小更简单的子矩阵相乘的形式来表示。这样就会存储空间减小,从而达到数据压缩的目的。奇异值分解是将矩阵中的主要特征提取出来,当然会一定程度上损失一些信息量,但是主要信息量是可以保存的。比如我们在描述一棵树的时候,我们只需要描述树有多粗,有没有树叶,树叶是什么颜色的,树叶的形状是什么样的这些基本特征就可以大致能想象出树的样子,而不需要把每一片树叶,树的纹理这些详细的细节进行描述说明。我们在提取这种重要特征的时候就会用到SVD的方法。接下来详细说明奇异值分解的有关内容。
目录
1. 奇异值分解的代数表示
在描述奇异值分解之前先看其特例,特征值分解。
设A是n阶方阵,如果存在n维非零向量x和数,使得
成立,则称数
是矩阵A的特征值,非零向量x为矩阵A的特征向量。
特征值分解就是将方阵A分解为:
其中Q是以A的特征向量为列向量组成的矩阵,且Q为正交矩阵,在欧几里得空间中成为酉矩阵。为对角矩阵,对角线上的元素为特征值。由矩阵相似的概念可以得到矩阵A与
相似,也就是说矩阵A可相似对角化,相似矩阵有相同的秩r(A)=r(
)。
实际情况中A不满足为方阵的条件,那怎么办呢,这时候奇异值分解就闪亮登场了。
奇异值分解就是将m*n矩阵A分解为:
其中U为m*m的酉矩阵,U由m个m维的向量组成,
称为左奇异向量,V为n*n的酉矩阵,V由n个n维向量
组成,
成为右奇异向量。
为m*n矩阵,除主对角线上的元素外,其余元素均为0,主对角线上的元素称为奇异值。同样的对于矩阵A和矩阵Σ相似,且有r(A)=r(
)。那么U、V以及
是怎样产生的呢。
U矩阵的求解:
因为A为m*n阵,所以(其中
表示矩阵
的转置)为m阶方阵,那么将
看做一个整体,问题又回到了特征值分解的知识上,即有
由此可以求出和u,所有的u为列向量构成了矩阵U
矩阵的求解
可以看出均大于0,且一般
在
中按照从大到小的顺序排列,即
>
>...>0
V矩阵的求解:
因为A为m*n阵,所以为n阶方阵,那么将
看做一个整体,即有
由此可以求出和
,所有的
为列向量构成了矩阵
矩阵中的
的大小代表了其对应的特征向量在A矩阵中的重要程度,即
i 越大,其特征向量越重要,一般情况下
中的前10%左右的
的和能占所有
总和的90%以上,那么我们可以取前r个奇异值来近似描述矩阵,即有
通常情况下r远小于m或n,即如下图:
从上图可以看出,A通过奇异值分解,减小了存储空间。
2. 奇异值分解的几何意义
在介绍奇异值分解的几何意义之前先说明下正交变换对一个向量在几何上产生的影响;维基百科中是这么定义正交变换的:对一个由空间投射到同一空间
的线性转换,如果转换后的向量长度与转换前的长度相同,则为正交变换。
向量OA在以x轴,y轴即、
为标准正交基的坐标下的坐标值为(a,b),在以e1',e2'为标准正交基的坐标下的坐标值为(a',b')。在上图中容易得出:e1' = (cos
,sin
),e2' = (-sin
,cos
)。而以向量e1',e2'为列向量组成的矩阵
则Q是由坐标基、
变换到坐标基e1'、e2'的正交矩阵。Q*(OA)相当于对向量OA顺时针旋转了
,Q是正交矩阵,所以转换后的向量的长度不变。
以2*2的方阵为例,对任何一个2*2的矩阵M,我们都可以找到另一个转换成另一个正交网格的正交网格。
假设有任意一组单位正交向量、
,则
和
也是正交的,如下图所示
用表示与
共线的单位向量,
表示与
共线的单位向量。
表示
的模,
表示
的模,
、
也就是矩阵M的奇异值。因此有
那么矩阵M怎么处理更一般的向量呢,因为
、
单位正交向量,所以有
其中是
在
上的投影,
是两个向量的点积所以它是一个数值,
是
在
上的分量,同理可知
是
在
上的分量。进一步有
(*)
因为是常量,所以
,同样的
,所以就有了上面的式子。
又因为、
,所以式(*)可以表示为
(**)
向量的点积即为向量中对应元素求积,然后对所有的积求和。所以有 ,那么(*)式和(**)式可以表示为:
等式两边消掉,得到下面的式子:
最终可以得到将矩阵M奇异值分解为U、Σ、V
其中以、
为列构成矩阵U,以
、
为列构成矩阵V,Σ为主对角元素为
、
的对角矩阵,U和V是正交矩阵。V描述的是定义域上的一组标准正交基,U描述的是经过M变换后的co-domain的标准正交基,Σ描述的是矩阵从V变换到U上的伸缩程度。
3. SVD在图像压缩中的应用
下面这幅图像是一个25*15个黑白像素点组成,矩阵中有375个元素,黑色像素点为0,白色像素点为1
若用矩阵M表示上面图像的话,实际上这幅图只需通过下面这三个列向量就可以表示出来,也就是说r(M)=3,同样的,r(Σ) = 3,因为对于矩阵Σ,只有主对角线上的元素非0 ,那么矩阵只有3个非零奇异值。
对第一幅图进行奇异值分解,可以得到矩阵的3个非零奇异值为:
可以看到,前三个奇异值之和就是所有奇异值总和,其实这三个奇异值就对应着上面三个列向量。
因为非零奇异值只有3个,那么Σ为3*3维,U为25*3维,V‘’为3*15.原来占据25*15个像素点的矩阵M,现在只占据3*3+25*3+3*15=129个像素点,达到了图像压缩的目的。
为了更加直观的理解SVD对图像进行压缩,下面用Python对实现图像压缩。示例图像用的是湖人名宿禾斗匕匕,原图像


当percent为0.1时的图像如下图,这时候得到的图片信息不多

当percent为0.3时的图像,这时科比的身体轮廓大致显现出来

当percent为0.5时的图像,图像的基本特征都涵盖了,只是清晰度不够高

再看percent为0.7时的图像

最后,percent为0.9时的图像,这和原始图像基本相差不多

因为图像矩阵image的维度为199*300*3,所以矩阵Σ的维度也是199*300,共有199个奇异值,前50个奇异值就占到了全部奇异值总和的0.7874;前80个奇异值占到了0.8803,所以只需要取前80个奇异值就可以达到最后一张图的效果。原图像矩阵中元素数为199*300*3 = 179100,经过奇异值分解后的图像矩阵中元素数为:(199*80+80*80+300*80)*3 = 138960,实际上矩阵Σ中的非零元素只有80个,所以可以认为SVD后的矩阵图像中元素数为(199*80+80+300*80)*3 = 120000,最终在图像保留主要特征的情况下对图像进行了压缩。
4. SVD在推荐系统中的应用:
2009年Netflix举办的推荐系统的冠军队伍使用的方法就是矩阵分解技术,也就是SVD,相比于当时最好的推荐系统,冠军队伍用SVD的方法将准确率提高了10%。近些年来推荐系统已经在很多软件或网站上得到应用,也取得了很好的效果。比如在淘宝网上根据用户的浏览记录会为你推送可能喜欢的商品;现在火遍全国的短视频APP抖音也是将推荐算法应用于软件上,根据用户的浏览习惯为每个用户定制个性化符合每个用户喜好的短视频,如果我经常看一些关于篮球和做饭的短视频,那么你在以后浏览抖音的时候你刷到的关于篮球和做饭的短视频会大大增多。
推荐系统的策略有两种:内容过滤和协同过滤。内容过滤为每个用户或产品创建一个概要文件来描述其性质,比如一个电影概要文件包括:电影的类型(动作、爱情、喜剧、惊悚等等),演员(老戏骨,小鲜肉),院线票房等等。这些概要文件允许程序将用户与匹配的产品关联起来。基于内容过滤的策略可能会收集到不可用或者不易收集的信息。协同过滤分析用户之间的关系和产品之间的相互依赖关系,以识别新的用户项关联。协同过滤的一个主要优点是它是无领域的,它可以解决数据方面的问题,而这些数据方面通常很难用内容过滤来分析。尽管协同过滤通常比基于内容的技术更精确,但由于它无法处理系统的新产品和用户,因此存在所谓的冷启动问题 。关于协同过滤,我们可以采用下面的两张图片进行说明。

左边可以看成一个5行4列的用户评级矩阵,行表示用户,列表示电影类型,那么左边的矩阵给出的是每个用户对不同类型的电影的喜爱程度,空白的地方可以认为是缺失值。那么我们要预测第5个用户对蓝色电影的喜爱程度,可以看到,用户5和用户3都喜欢红绿类型的电影,而用户2和用户5都不喜欢黄类型的电影,用户2和用户3都不喜欢蓝类型的电影,那么我们就可以初步预测,用户5不喜欢蓝色类型的电影,系统就不用向用户5推荐此类型的电影了。这只是我们直观上的预测,那么有没有什么量化的指标来更加准确的对其进行预测呢。相似度可以完成这样的事情,可以通过计算用户之间的相似度,比如用户甲和用户乙的相似度很高,那么可以把甲喜欢看的电影推荐给乙;同样的也可以计算产品之间的相似度,比如红色电影和绿色电影的相似度比较高,如果某用户喜欢红色电影,那么可以把绿色电影也推荐给此用户。
协同过滤导致的冷启动问题是由于用户给出的评价较少或者用户为新用户,如果为新用户,因为系统无法获知任何关于此用户与产品之间的信息,用户评级矩阵为全0矩阵或者为None,所以不容易处理;但是对于那些评价较少的用户来说,用户评级矩阵的缺失值很多,可以通过一些隐性的反馈来判断预测用户的喜好,以抖音短视频为例,我们可以将用户是否给某一视频点过红心看做是评价,但是有些用户没有点赞的习惯,也就是所谓的潜水者,那么此时我们就可以通过隐性反馈来对此用户的喜好进行判断,这里的隐性反馈可以是用户观看某一类视频的时长,比如我在大多数篮球类的视频中的停留时间都超过了5秒或者看完了此视频,那么系统就认为我比较喜欢篮球类的视频,以后可以多为我推荐篮球相关的视频;相反,我对做饭类的视频都是直接滑过,停留时间少于2秒,那么系统就可以认为我不喜欢此类视频,以后就减少为我推荐做饭相关的视频。这样就根据用户的喜好,为每一个用户量身定制了一个短视频APP,提高了用户体验。
协同过滤是一种基于用户喜好或行为数据的推荐实现方法。协同过滤的核心是相似度计算方法,有很多相似度计算方法都可以用于计算产品或用户之间的相似度。在低维空间下计算相似度,SVD提高了推荐系统引擎的效果。
4.1 相似度
在kNN的文章中,已经介绍了多种距离度量的方式,也说过,两个向量间的距离可以表示这两个向量间的相似度。我们最熟悉的距离度量方式是欧式距离,两个项量间的都是距离越小,那么这两个向量的相似度越高,我们用“相似度 = 1.0/1.0 + 欧式距离”的算式来计算相似度,当欧式距离为0时,相似度为1;当欧式距离为无穷大时,相似度趋近于0;我们还可以用皮尔森相关系数来度量两个向量之间的相似度,它可以有Numpy中的corrcoef()函数完成,皮尔森相关系数的取值范围为-1-1,我们可以通过0.5+0.5 * np.corrcoef(X,Y)来将其取值范围控制在0-1之间;另一种常见的相似度的度量方式是余弦距离,它计算的是两个向量夹角的余弦值,范围在-1-1之间,同样的我们可以将其限定在0-1之间。
从上面的图片中我们可以看到,输入数据为一个矩阵,行表示的是用户,列表示的是电影。那么我们在计算相似度的时候是基于用户还是基于产品(电影)呢,比如在Netflix大赛中,用户数量为48万,而电影数量为17700部,很明显,用户数量远大于电影数量,这时候我们更倾向于使用基于产品(电影)相似度的计算方法。
4.2 示例:餐馆菜肴推荐引擎
接下来构建一个推荐引擎,它关注的是餐馆的食物推荐。它的功能是:给定一个用户,系统会为此用户返回N个最好的推荐菜。这里的输入数据同样是一个矩阵,矩阵的行表示用户,矩阵的列表示菜品,矩阵中的元素由0-5不同的值组成,0表示没有吃过该菜品,1-5依次表示对某菜品的喜爱程度,数值越大,表示喜爱程度越高。
接下来基于菜品的相似度来构建推荐引擎,代码如下:

参考资料
1、机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
2、《We Recommend a Singular Value Decomposition》
3、A Singularly ValuableDecomposition:The SVD of a Matrix
4、《机器学习》 周志华
6、Matrix factorization techniques for recommender systems 这篇论文是Netflix电影推荐竞赛冠军的论文
5942

被折叠的 条评论
为什么被折叠?



