1 奇异值分解(SVD)简介
Beltrami 和 Jordan 被认为是奇异值分解(Singular Value Decomposition,SVD)的共同开创者,二人于19世纪70年代相继提出了相关理论。奇异值分解主要解决的问题是数据降维。在高维度的数据中,数据往往是稀疏的,或者数据往往由几个重要的成分表达了大部分信息。因此,通过降维可以很好地化繁为简的解决问题,也可以降低数据的存储成本和运算成本。
奇异值分解有着比较广泛的应用,在图像处理、推荐系统中都有着比较重要的应用。
2 奇异值分解的基本原理
2.1 特征值与特征向量
对于阶方阵,若存在非零向量和非负值,使得,则称为线性变换的特征值,称为特征值的特征向量。
若方阵的所有特征值为,对应的一组特征向量为,
记,
则有。
当为实对称阵时,存在单位正交向量构成单位正交阵。对于正交阵,从而。
上式实际上是实现了将实对称阵对角化成。
2.2 矩阵的秩
矩阵任意选取的行和列的形成阶矩阵,其行列式称为矩阵的阶子式。矩阵的不为零的子式的最大阶数称为矩阵的秩。
对于矩阵,其秩记为。
对于方阵,其秩等于大于0的特征值的个数。
这里的也等于后文中大于0的奇异值的个数。
2.3 矩阵分解
2.3.1 矩阵分解的概念
任意矩阵都可分解为三个矩阵的乘积,即 ... (1)式。
其中是的正交矩阵,是的非负对角阵,是的正交矩阵。被称为左奇异向量,称为奇异值,称为右奇异向量。
其中,,,并且。
当如上进行矩阵分解后,我们选择奇异值中的前个奇异值,对应的选择前列的元素,得到的称为矩阵的截断奇异值分解。
截断奇异值分解可以看作对数据的降维,即
2.3.2 奇异值分解的推导
对于矩阵的奇异值分解,假设存在满足前述条件的,使得则有
。
由于为对角阵,因此 仍为对角阵,为阶对角阵。
,不妨将其记为。
则。
由于为正交矩阵,,因此将上式右侧同乘以,得到
。
由于为实对称阵,一定存在一组非负特征值和对应的特征向量(单位正交向量),不妨记该个特征值为()。对应的特征向量(单位正交向量)分别记为。
将特征值开方后得到。
令,,
则正好找到了对应的和,使得(1)式成立。
对于实对称阵,其非零特征值与的特征值相同,也为(),其余个特征值为0。对应的特征向量(单位正交向量)分别记为。
将特征值开方后得到。
同理,有
令,,
则正好找到了对应的和,使得(1)式成立。
如此,求出了(1)式所需的,问题得解。
3 奇异值分解的步骤
3.1 计算奇异值
计算矩阵乘积,求解,得到大于零的特征值。
令,得到奇异矩阵。
3.2 求解右奇异向量
将特征值代入,求解得的特征向量,并将其单位化,记为。
令,得右奇异向量。
3.3 求解左奇异向量
将特征值代入,求解得的特征向量,并将其单位化,记为。
令,得左奇异向量。
矩阵的奇异值分解完成。
4 奇异值分解的实例
numpy模块中有自带的奇异值分解函数。
import numpy as np
# 创建矩阵A
A = np.array([[3, 0, 0, 0],
[0, 0, 0, 4],
[0, 5, 0, 0],
[0, 0, 0, 2],
[2, 0, 0, 0]])
# 进行奇异值分解
U, S, V = np.linalg.svd(A)
# 打印结果
print("U:\n", U)
print("S:", S)
print("V:\n", V)
U: [[ 0. 0. -0.83205029 -0. -0.5547002 ] [ 0. 0.89442719 0. 0.4472136 0. ] [-1. 0. 0. 0. 0. ] [ 0. 0.4472136 0. -0.89442719 0. ] [ 0. 0. -0.5547002 0. 0.83205029]] S: [5. 4.47213595 3.60555128 0. ] V: [[-0. -1. -0. -0.] [ 0. 0. 0. 1.] [-1. -0. -0. -0.] [-0. -0. -1. -0.]]
5 奇异值分解的总结
(1)奇异值分解的原理和步骤比较简单;
(2)奇异值分解非常适合对高维数据的处理;
(3)奇异值分解一种非常重要的降维技术,尤其是在图像处理和推荐系统中有着重要的应用;
(4)奇异值分解后的结果不易直观理解。