ML之DR之SVD:SVD算法的简介、场景实现、案例应用之详细攻略
目录
《Cool Linear Algebra: Singular Value Decomposition》翻译与解读
SVD算法的简介
1、SVD算法的概述
奇异值分解Singular Value Decomposition:简称SVD,特征分解的广义化,是一种提取特征信息的方法。
《Cool Linear Algebra: Singular Value Decomposition》翻译与解读
地址 | 论文地址:Cool Linear Algebra: Singular Value Decomposition - Andrew Gibiansky |
时间 | 2013年5月29日 |
作者 | Andrew Gibiansky |
解读 | 这篇文章主要论述了矩阵奇异值分解(Singular Value Decomposition, SVD)的理论与应用。 其主要点总结如下: >> 介绍了矩阵对角化的概念,对角化是对对称矩阵有效,且矩阵必须是方阵。 >> SVD能对任意形状的矩阵进行分解,是一种更普遍的对角化方法。它适用于所有矩阵,因此更具应用价值。 >> SVD将一个矩阵A分解为三个矩阵的乘积:A = UΣV^T。其中U和V的列向量正交,Σ为对角矩阵。Σ上的元素称为奇异值。 >> SVD从物理意义上可以解释为:任何矩阵变换都可以看作先旋转,然后缩放,最后再旋转。 >> 文章给出了 SVD在数据压缩、低秩矩阵近似和解线性方程组等多个应用场景的实例,说明其广泛应用价值。 >> 作者总结 SVD几乎应用在所有学科地,如果在线性代数中记住一个概念,那应该就是奇异值分解。它被广泛应用,是很强大的工具。 本文系统而清晰地介绍了SVD的定义、理论基础以及其在数学、计算机科学等多个应用场景中的实用性,强调了SVD作为一种强大而通用的矩阵分解方法的重要性。 |
2、SVD算法过程
(1)、SVD的数学定义
假设我们的矩阵A是一个m×n的矩阵,那么我们定义矩阵A的SVD:
(1)、通常将奇异值由大而小排列。这样,Σ便能由A唯一确定了。
(2)、与特征值、特征向量的概念相对应:
U的列(columns),组成一套对M的正交"输入"或"分析"的基向量。这些向量是MM*的特征向量。
V的列(columns),组成一套对M的正交"输出"的基向量。这些向量是M*M的特征向量。
Σ对角线上的元素是奇异值,可视为是在输入与输出间进行的标量的"膨胀控制"。这些是M*M及MM*的奇异值,并与U和V的列向量相对应。
(3)、因为U 和V 向量都是单位化的向量, 我们知道U的列向量u1,...,um组成了K空间的一组标准正交基。同样,V的列向量v1,...,vn也组成了K空间的一组标准正交基。
SVD和特征分解的关系 | SVD和特征分解的关系:SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为方阵。 |
SVD求伪逆 | SVD求伪逆:奇异值分解可以被用来计算矩阵的伪逆。若矩阵A的奇异值分解为A=UΣVT ,那么A的伪逆为A伪逆=VΣ伪逆UT 其中Σ伪逆是Σ的伪逆,是将主对角线上每个非零元素都求倒数之后再转置得到的。 (1)、求伪逆通常可以用来求解最小二乘法问题。 |
(2)、公式的推导
(3)、SVD算法两步过程
第一步,先将原始数据表示成一个矩阵A_m*n;
第二步,SVD把这个大型矩阵分解为3个小矩阵的连乘:
其中r是一个很小的值。对角矩阵Σ_r*r中的所有值,被称为奇异值。
(4)、理解SVD
已知4×5阶实矩阵A,求A的SVD分解:
(1)、矩阵U和V都是单位正交方阵:U^T*U=1,V^T*V=1
奇异值分解有时非唯一性:由于Σ有一个对角元是零,故这个奇异值分解值不是唯一的。
3、SVD和子空间的关系
任何秩为r的矩阵A,可以被分解为
(1)、SVD提供了计算四个子空间正交基的一种快速方法。SVD牛叉在,可以把四个正交矩阵联系起来。
SVD算法的应用场景
1、图像领域的图片压缩案例
奇异值top不同个数的应用 |
可以发现,如果我们根据大小排序这些奇异值(矩阵 Σ 的值),那么前 50 个奇异值将包含整个矩阵 Σ 的大小的 85%。根据这个事实,我们可以丢弃后面的 250 个值(即将它们设为 0),仅保留这张小狗图像的「rank(秩)50」版本。值的数量差不多少了 5 倍,但质量却下降很少。上述计算的原因是当我们执行 UΣ'V 运算时,U 和 V 矩阵中的一部分因为乘 0 也被丢弃(其中 Σ' 是 Σ 的修改后版本,其中仅包含了前面的 30 个值)。 |
低秩矩阵的近似应用 | 图像压缩,其实80与原图相差不是很大。SVD中的奇异值的个数分别为1、10、80。 |
2、推荐领域的产品推荐案例
假定Ben、Tom、John、Fred对6种产品进行了评价,评分越高,代表对该产品越喜欢。0表示未评价。
第一步,进行SVD分解并提取前2个特征
(1)、产品矩阵的压缩、用户矩阵的压缩
第二步,利用SVD进行新用户的个性化推荐
思路:对于新用户,如何对其做个性化推荐呢?将A扩展后重新计算SVD,然后聚类用户?
过程:求出新数据的未知V,因为此时已经建立模型(即已知U、Σ),传入新数据A,目的是变换公式求出未知V。
(1)、假设有个Bob的新用户,对6个产品的评分为(5,5,0,0,0,5)T,通过上边的公式计算出Bob的特征点坐标。
(2)、通过计算Bob和现有用户的距离进行聚类:计算余弦距离(一定意义下即相关系数),与其最近的是Ben,因此,可以给Bob推荐Ben喜欢的S5、S3。
Ben:553055
Bob:550005
SVD的使用方法
1、SVD的python代码实现
import numpy as np
def load_data():
return [ [0,0,0,1,1],
[0,0,0,2,2],
[0,0,0,3,3],
[4,4,4,0,0],
[5,5,5,0,0],
[6,6,6,0,0],
[7,7,7,0,0]]
data = load_data()
u, sigma, vt = np.linalg.svd(data) #Sigma是个矩阵,Python内部的机制,为了节省空间,因为它除了对角线都是0
print(sigma)#前两个值比后三个值大的多,所以可以取这两个奇异值,把其余三个置0。
[1.94422221e+01 5.29150262e+00 1.86910323e-15 4.48702001e-16
8.62587679e-18]