奇异值分解(Singular Value Decomposition)是线性代数中一种重要的矩阵分解,和 特征值分解 有一定的关联,作用都在于将矩阵分解成 多个矩阵的乘积,从而方便进行数据的拆分,实现数据的投影或者降维。
从数学的角度来看,特征值分解 和 奇异值分解 都是给一个矩阵(线性变换)找一组特殊的基。
我们 先从特征值分解层面来引入问题:
● 特征值分解
特征值分解 是基于方阵来讲的,方阵 A 对应特征向量 v,v对应的 特征值 λ,描述为:
则 方阵A的 特征值分解形式为:
其中,Q对应方阵A 的特征向量组成的矩阵,Σ 是对角矩阵,对角线元素即为 特征值(从大到小排列),实际上我们认为 Q 就是这样一组基,原方阵A在这组基上的投影,而对角阵 就代表了在这组基上的影响指数,大的特征值 影响较大,小的特征值可以忽略,这就为实现PCA降维方法提供了基础。
● 奇异值分解
特征值分解 有一个限制条件,那就是 矩阵A 必须为方阵,那么针对待分解矩阵 不是方阵的情况,该如何处理呢?
这就是 本节要讲的任意矩阵分解的方法,针对 任意矩阵 A(m*n),奇异值分解:
其中,U是一个m*m的方阵(也称左奇异向量),VT是一个n*n的矩阵(也称右奇异向量),Σ 是一个m*n的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值)。
从数学上看,表示我们找到了U和VT这样两组基,并且这两组基正交。
参考代码(来自于Numerical Recipes in C):
/*******************************************************************************
Singular value decomposition program, svdcmp, from "Numerical Recipes in C"
(Cam