文章目录
- 一种矩阵因子分解方法
- 矩阵的奇异值分解一定存在,但不唯一
- 奇异值分解可以看作是矩阵数据压缩的一种方法,即用因子分解的方式近似地表示原始矩阵,这种近似是在平方损失意义下的最优近似
1. 奇异值分解的定义与性质
1.1 定义
- 称为矩阵 的奇异值分解(SVD), 是 阶正交矩阵, 是 阶正交矩阵, 是 的对角矩阵
- 称为矩阵 的奇异值
- 的列向量,左奇异向量
- 的列向量,右奇异向量
1.2 两种形式
1.2.1 紧奇异值分解
上面的SVD称为:完全SVD
紧奇异值分解,仅由前
列得到,对角矩阵
的秩与原始矩阵
的秩相等
1.2.2 截断奇异值分解
只取最大的 k 个奇异值 对应的部分,就得到矩阵的截断奇异值分解
- 实际应用中提到的,经常指的
截断SVD
- 在实际应用中,常常需要对矩阵的数据进行压缩,将其近似表示,奇异值分解提供了一种方法
- 奇异值分解是在平方损失(弗罗贝尼乌斯范数)意义下对矩阵的最优近似
- 紧奇异值分解—>无损压缩
- 截断奇异值分解—>有损压缩
1.3 几何解释
矩阵的SVD也可以看作是将其 对应的线性变换 分解为 旋转变换、缩放变换及旋转变换
的组合。
这个变换的组合一定存在。
1.4 主要性质
- (1) 由 有
对称矩阵
和
的特征分解 可由矩阵
的奇异值分解矩阵表示
-
(2)
-
(3) SVD奇异值 是唯一的,但矩阵 不唯一
-
(4) 矩阵 和 的秩相等,等于正奇异值 的个数
-
(5) 矩阵 的 个右奇异向量 构成 的值域 的一组标准正交基;
矩阵 的 个右奇异向量 构成 的零空间 的一组标准正交基;
矩阵 的 个左奇异向量 构成 的值域 的一组标准正交基;
矩阵 的 个左奇异向量 构成 的零空间 的一组标准正交基
2. 奇异值分解与矩阵近似
2.1 弗罗贝尼乌斯范数
奇异值分解也是一种矩阵近似的方法,这个近似是在弗罗贝尼乌斯
范数(Frobenius norm)意义下的近似
矩阵的弗罗贝尼乌斯
范数是 向量的L2
范数的直接推广,对应着机器学习中的平方损失函数
设矩阵
, 其弗罗贝尼乌斯
范数为:
假设 的奇异值分解为 ,其中对角矩阵 ,则
2.2 矩阵的最优近似
奇异值分解 是在平方损失(弗罗贝尼乌斯范数)
意义下对矩阵的最优近似,即数据压缩
- 紧奇异值分解:是在
弗罗贝尼乌斯范数
意义下的无损压缩 - 截断奇异值分解:是有损压缩。截断奇异值分解得到的矩阵的秩为k,通常远小于原始矩阵的秩r,所以是由
低秩矩阵实现了对原始矩阵的压缩
2.3 矩阵的外积展开式
矩阵 的奇异值分解 也可以由外积形式表示
- 将
的奇异值分解看成矩阵
和
的乘积,将
按列向量分块,将
按行向量分块,即得
3. 奇异值分解Python计算
import numpy as np
a = np.random.randint(-10,10,(4, 3)).astype(float)
print(a)
print("-----------------")
u, sigma, vT = np.linalg.svd(a)
print(u)
print("-----------------")
print(sigma)
print("-----------------")
print(vT)
print("-----------------")
# 将sigma 转成矩阵
SigmaMat = np.zeros((4,3))
SigmaMat[:3, :3] = np.diag(sigma)
print(SigmaMat)
print("------验证-------")
a_ = np.dot(u, np.dot(SigmaMat, vT))
print(a_)
结果:
[[-6. 8. 9.]
[ 6. 8. -8.]
[ 6. -1. 2.]
[ 6. 9. -9.]]
-----------------
[[-0.30430452 0.93673281 0.17295875 -0.00395842]
[ 0.64134399 0.19762952 0.04109474 -0.74022408]
[ 0.06410812 -0.16033168 0.98267774 0.0672931 ]
[ 0.70140345 0.24034966 -0.05235412 0.66897256]]
-----------------
[19.56867211 12.83046891 6.0370638 ]
-----------------
[[ 0.52466311 0.45709993 -0.71818401]
[-0.30821258 0.88838353 0.34026417]
[ 0.79355758 0.04282928 0.60698602]]
-----------------
[[19.56867211 0. 0. ]
[ 0. 12.83046891 0. ]
[ 0. 0. 6.0370638 ]
[ 0. 0. 0. ]]
------验证-------
[[-6. 8. 9.]
[ 6. 8. -8.]
[ 6. -1. 2.]
[ 6. 9. -9.]]