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)奇异值分解后的结果不易直观理解。