SVD奇异值分解相关技术

重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。

一、参考资料

Eigen 矩阵的SVD分解

奇异值分解(SVD)

二、相关介绍

1. 单位阵

主对角线全为1的方阵,称为单位阵,用 I \mathrm{I} I E \mathrm{E} E 表示单位阵。

2. 对称矩阵

对称矩阵(Symmetric Matrices)是指以主对角线为对称轴,各元素对应相等的矩阵。

如果 X \mathrm{X} X 是对称矩阵,对于任意的矩阵 A X A T \mathrm{AXA}^{\mathrm{T}} AXAT 也是对称矩阵。

3. 奇异值

奇异值是矩阵里的概念,一般通过奇异值分解定理求得。设A为mxn阶矩阵,q=min(m, n),AxA的q个非负特征值算数平方根称为A的奇异值。

矩阵A的秩等于它的非零奇异值的个数。

三、特征值分解(EVD)

特征值分解

1. 特征值分解原理

注意:实对称矩阵才能进行特征值分解。

如果矩阵A是一个 m × m m\times m m×m实对称矩阵(即 A = A T A=A^{T} A=AT),特征值分解是将一个矩阵A分解成:
A = Q Σ Q T = Q [ λ 1 ⋯ ⋯ ⋯ ⋯ λ 2 ⋯ ⋯ ⋯ ⋯ ⋱ ⋯ ⋯ ⋯ ⋯ λ m ] Q T A=Q\Sigma Q^T=Q\begin{bmatrix}\lambda_1&\cdots&\cdots&\cdots\\\cdots&\lambda_2&\cdots&\cdots\\\\\cdots&\cdots&\ddots&\cdots\\\cdots&\cdots&\cdots&\lambda_m\end{bmatrix}Q^T A=QΣQT=Q λ1λ2λm QT
其中, Q \mathrm{Q} Q 称为特征矩阵,是标准正交阵,即有 Q Q T = I {Q}Q^{T}=I QQT=I λ i \lambda_{i} λi 称为特征值 Σ \Sigma Σ 是特征值组成的对角矩阵,里面的特征值由大到小排列,这些特征值所对应的特征向量描述了矩阵变化方向。 q i q_{i} qi 是特征矩阵 Q \mathrm{Q} Q 中的列向量,称为特征向量

2. 特征值与特征向量

2.1 物理含义

特征值与特征向量的几何意义:矩阵和向量做乘法,向量会变成另一个方向或长度的新向量,主要发生旋转、伸缩的变量。如果矩阵乘以某些向量后,向量不发生旋转变换,只产生伸缩变换,那么就说这些向量是矩阵的特征向量,伸缩的比例是特征值。

2.2 特征矩阵与特征向量的关系

A q i = λ i q i , q i T q j = 0 ( i ≠ j ) Aq_i=\lambda_iq_i,\quad q_i^Tq_j=0(i\neq j) Aqi=λiqi,qiTqj=0(i=j)

三、SVD奇异值分解

1. 问题引入

特征值分解对矩阵A的要求较高,要求被分解的矩阵为实对称矩阵,但现实中所遇到的矩阵一般不是实对称矩阵。当遇到一般性的矩阵,如一个mxn的矩阵A,是否能够进行特征值分解,能否用 A = Q Σ Q T A=Q\Sigma Q^T A=QΣQT 表示呢?答案是可以的,通过SVD奇异值分解。

2. SVD定义

SVD也是对矩阵进行分解,但是和特征分解不同,SVD并不要求要分解的矩阵为实对称矩阵。SVD奇异值分解是将一个非零的实数矩阵 A m × n A_{m \times n} Am×n分解成由三个矩阵乘积形式的运算,即进行矩阵的因子分解:
A = U Σ V T \mathrm{A}=\mathrm{U} \Sigma \mathrm{V}^{\mathrm{T}} A=UΣVT
其中, U \mathrm{U} U 称为左奇异矩阵,为mxm的单位正交阵,即有 U U T = I \mathrm{UU}^{\mathrm{T}}=\mathrm{I} UUT=I V \mathrm{V} V 称为右奇异矩阵,为nxn的单位正交阵,即有 V V T = I \mathrm{V} \mathrm{V}^{\mathrm{T}}=\mathrm{I} VVT=I Σ \Sigma Σ 是 mxn 维的对角矩阵,其对角线上的数值即为奇异值,并按照降序排列,可以表示为:
Σ = d i a g ( σ 1 , σ 2 , . . . , σ p ) = [ σ 1 σ 2 ⋱ ⋱ ] m × n st. σ 1 ≥ σ 2 ≥ . . . ≥ σ p ≥ 0 \Sigma=\mathrm{diag}(\sigma_{1},\sigma_{2},...,\sigma_{\mathrm{p}})=\left[\begin{array}{cccc} \sqrt{\sigma_1} & & & \\ & \sqrt{\sigma_2} & \ddots & \\ & & & \ddots \end{array}\right]_{\mathrm{m} \times \mathrm{n}}\quad\quad\text{st.}\sigma_1\geq\sigma_2\geq...\geq\sigma_\text{p}\geq0 Σ=diag(σ1,σ2,...,σp)= σ1 σ2 m×nst.σ1σ2...σp0
σ i \sqrt{\sigma_i} σi 为矩阵的奇异值。各矩阵的维度分别为 U ∈ R m × m \mathrm{U} \in \mathrm{R}^{\mathrm{m} \times \mathrm{m}} URm×m Σ ∈ R m × n \Sigma\in\mathrm{R}^{\mathrm{m\times n}} ΣRm×n V ∈ R n × n \mathrm{V} \in \mathrm{R}^{\mathrm{n} \times \mathrm{n}} VRn×n

3. 奇异值求解

为求解上述 U \mathrm{U} U,$ \Sigma , , \mathrm{V}$,可以利用如下性质:
A A T = U Σ V T ( U Σ V T ) T = U Σ V T V Σ T U T = U Σ Σ T U T \mathrm{AA^{T}=U\Sigma V^{T}(U\Sigma V^{T})^{T}=U\Sigma V^{T}V\Sigma^{T}U^{T}=U\Sigma\Sigma^{T}U^{T}} AAT=VT(VT)T=VTVΣTUT=ΣTUT

A T A = ( U Σ V   T   )   T   U Σ V   T   = V Σ   T U   T   U Σ V   T   = V Σ   T   Σ V   T   \mathrm{A^{T}\mathrm{A}=(U\Sigma V^{~T~})^{~T~}U\Sigma V^{~T~}=V\Sigma^{~T}U^{~T~}U\Sigma V^{~T~}=V\Sigma^{~T~}\Sigma V^{~T~}} ATA=(V T ) T V T =VΣ TU T V T =VΣ T ΣV T 

其中, Σ Σ T ∈ R m × m \Sigma\Sigma^{\mathrm{T}}\in\mathrm{R}^{\mathrm{m\times m}} ΣΣTRm×m Σ T Σ ∈ R n × n \Sigma^{\mathrm{T}}\Sigma\in\mathrm{R^{n\times n}} ΣTΣRn×n,从矩阵的角度上来讲, Σ Σ T \Sigma\Sigma^\mathrm{T} ΣΣT Σ T Σ \Sigma^\mathrm{T}\Sigma ΣTΣ 是不相等的,但它们在主对角线的奇异值是相等的,即有:
Σ Σ T = [ σ 1 σ 2 ⋱ ⋱ ] m × m \Sigma\Sigma^\mathrm{T}=\begin{bmatrix}\sigma_1\\&\sigma_2\\&&\ddots\\&&&\ddots\end{bmatrix}_{\mathrm{m\times m}} ΣΣT= σ1σ2 m×m

Σ T Σ = [ σ 1 σ 2 ⋱ ⋱ ] n × n \Sigma^\mathrm{T}\Sigma=\begin{bmatrix}\sigma_1\\&\sigma_2\\&&\ddots\\&&&\ddots\end{bmatrix}_{\mathrm{n\times n}} ΣTΣ= σ1σ2 n×n

可以看到 Σ Σ T \Sigma\Sigma^\mathrm{T} ΣΣT Σ T Σ \Sigma^\mathrm{T}\Sigma ΣTΣ 的形式非常接近,进一步分析,可以发现 A A T \mathrm{AA}^{\mathrm{T}} AAT A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA 是对称矩阵,可以做特征值分解(EVD)。对 A A T \mathrm{AA}^{\mathrm{T}} AAT 特征值分解,得到特征矩阵为 U \mathrm{U} U。对 A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA 特征值分解,得到特征矩阵为 V \mathrm{V} V。对 A A T \mathrm{AA}^{\mathrm{T}} AAT A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA 中的特征值求算数平方根,得到所有的奇异值

由此可求得特征值为 σ 1 ⋅ σ 2 , ⋯ σ k \sqrt{\sigma_{1}}\cdot\sqrt{\sigma_{2}},\cdots\sqrt{\sigma_{\mathrm{k}}} σ1 σ2 ,σk 。所以,矩阵A:
A = U Σ V   T = [ u 1 u 2 ⋯ u m ] [ σ 1 σ 2 ⋱ ⋱ ] m × n [ v 1 v 2 ⋮ v n ] \mathrm{A}=\mathrm{U}\Sigma\mathrm{V}^\mathrm{~T}=\begin{bmatrix}\mathrm{u}_1&\mathrm{u}_2&\cdots&\mathrm{u}_\mathrm{m}\end{bmatrix}\begin{bmatrix}\sqrt{\sigma_1}\\&\sqrt{\sigma_2}\\&&\ddots\\&&&\ddots\end{bmatrix}_{\mathrm{m}\times\mathrm{n}}\begin{bmatrix}\mathrm{v}_1\\\mathrm{v}_2\\\vdots\\\mathrm{v}_\mathrm{n}\end{bmatrix} A=UΣV T=[u1u2um] σ1 σ2 m×n v1v2vn
在奇异值矩阵中奇异值按照从大到小排列,而且奇异值的减少特别的快。在很多情况下,前 10% 甚至 1%的奇异值的和就占了全部的奇异值之和的 99% 以上的比例。也就是说,我们也可以用最大的 k 个的奇异值和对应的左右奇异向量来近似描述矩阵。因此,进一步化简得到:
A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + ⋯ + σ k u k v k T \mathrm A=\sqrt{\sigma_1}\mathrm u_1\mathrm v_1^\mathrm{T}+\sqrt{\sigma_2}\mathrm u_2\mathrm v_2^\mathrm{T}+\cdots+\sqrt{\sigma_\mathrm{k}}\mathrm u_\mathrm{k}\mathrm v_\mathrm{k}^\mathrm{T} A=σ1 u1v1T+σ2 u2v2T++σk ukvkT
即:
A = λ 1 u 1 v 1 T + λ 2 u 2 v 2 T + ⋯ + λ k u k v k T \mathrm A=\lambda_1\mathrm u_1\mathrm v_1^\mathrm{T}+\lambda_2\mathrm u_2\mathrm v_2^\mathrm{T}+\cdots+\lambda_\mathrm{k}\mathrm u_\mathrm{k}\mathrm v_\mathrm{k}^\mathrm{T} A=λ1u1v1T+λ2u2v2T++λkukvkT
矩阵A被分解为k个小矩阵,每个矩阵都是 λ \mathrm{\lambda} λ 乘以 u i v i T \mathrm{u_{i}v_{i}^{\mathrm{T}}} uiviT。此时可以看到,若入取值较大,其对应的矩阵在矩阵A的占比也大,所以取前面主要的 λ \mathrm{\lambda} λ 来近似表示矩阵A,矩阵A可以表示为:
A m × n = U m × m Σ m × n V n × n T ≈   U m × k   Σ k × k   V k × n   T \mathrm{A_{m\times n}=U_{m\times m}\Sigma_{m\times n}V_{n\times n}^{\mathrm{T}}}\approx\mathrm{~U_{m\times k}~\Sigma_{k\times k}~V_{k\times n}^{~\mathrm{T}}} Am×n=Um×mΣm×nVn×nT Um×k Σk×k Vk×n T
其中,k要比n小很多,也就是一个大的矩阵 A 可以用三个小的矩阵 U m × k \mathrm{U}_{\mathrm{m\times k}} Um×k , Σ k × k \Sigma_{\mathrm{k\times k}} Σk×k V k × n T \mathrm{V}_{\mathrm{k\times n}}^{\mathrm{T}} Vk×nT 近似表示。
在这里插入图片描述
计算量对比

原矩阵计算量: M × N M\times N M×N
SVD分解之后的计算量: M × k + k × k × N = k ( M + N + k ) M\times k+k\times k\times N=k(M+N+k) M×k+k×k×N=k(M+N+k)
一般情况下, M × N ≫ k ( M + N + k ) M\times N\gg k(M+N+k) M×Nk(M+N+k),这使得数据的存储量计算量都远小于原始矩阵。

4. SVD分解举例

A = [ 0 1 1 1 1 0 ] \mathrm A=\begin{bmatrix}0&&1\\1&&1\\1&&0\end{bmatrix} A= 011110

求解 A A T \mathrm{AA}^{\mathrm{T}} AAT A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA
A T A = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 2 1 1 2 ] \text{A}^{\text{T}}\text{A}=\begin{bmatrix}0&1&1\\1&1&0\end{bmatrix}\begin{bmatrix}0&1\\1&1\\1&0\end{bmatrix}=\begin{bmatrix}2&1\\1&2\end{bmatrix} ATA=[011110] 011110 =[2112]

A A T = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 1 1 0 1 2 1 0 1 1 ] \mathrm{AA}^{\mathrm{T}}=\begin{bmatrix}0&1\\1&1\\1&0\end{bmatrix}\begin{bmatrix}0&1&1\\1&1&0\end{bmatrix}=\begin{bmatrix}1&1&0\\1&2&1\\0&1&1\end{bmatrix} AAT= 011110 [011110]= 110121011

进而求 A A T \mathrm{AA}^{\mathrm{T}} AAT 的特征值和特征向量:
λ 1 = 3 ; v 1 = [ 1 / 2 1 / 2 ] \lambda_1=3;\mathrm{v}_1=\begin{bmatrix}1/\sqrt2\\1/\sqrt2\end{bmatrix} λ1=3;v1=[1/2 1/2 ]

λ 2 = 1 ; v 2 = [ 1 / 2 − 1 / 2 ] \lambda_2=1;\mathrm{v}_2=\begin{bmatrix}1/\sqrt{2}\\-1/\sqrt{2}\end{bmatrix} λ2=1;v2=[1/2 1/2 ]

A T A \mathrm{A}^{\mathrm{T}}\mathrm{A} ATA 的特征值和特征向量:
λ 1 = 3 ; v 1 = [ 1 / 6 2 / 6 1 / 6 ] \lambda_1=3;\mathrm{v}_1=\begin{bmatrix}1/\sqrt6\\2/\sqrt6\\1/\sqrt6\end{bmatrix} λ1=3;v1= 1/6 2/6 1/6

λ 2 = 1 ; v 2 = [ − 1 / 2 0 1 / 2 ] \lambda_2=1;\mathrm{v}_2=\begin{bmatrix}-1/\sqrt{2}\\0\\1/\sqrt{2}\end{bmatrix} λ2=1;v2= 1/2 01/2

λ 3 = 0 ; v 3 = [ 1 / 3 − 1 / 3 1 / 3 ] \lambda_3=0;\mathrm{v}_3=\left[\begin{array}{c}1/\sqrt{3}\\-1/\sqrt{3}\\1/\sqrt{3}\end{array}\right] λ3=0;v3= 1/3 1/3 1/3

利用 σ i = λ i \sigma_{\mathrm{i}}=\sqrt{\lambda_{\mathrm{i}}} σi=λi ,可得奇异值为 3 \sqrt{3} 3 和 1。最终得矩阵A的奇异值分解为:
A = U Σ V T = [ 1 / 6 − 1 / 2 1 / 3 2 / 6 0 − 1 / 3 1 / 6 1 / 2 1 / 3 ] [ 3 0 0 1 0 0 ] [ 1 / 2 1 / 2 1 / 2 − 1 / 2 ] \mathrm A=\mathrm U\Sigma\mathrm V^\text{T}=\begin{bmatrix}1/\sqrt{6}&&-1/\sqrt{2}&&1/\sqrt{3}\\2/\sqrt{6}&&0&&-1/\sqrt{3}\\1/\sqrt{6}&&1/\sqrt{2}&&1/\sqrt{3}\end{bmatrix}\begin{bmatrix}\sqrt{3}&&0\\0&&1\\0&&0\end{bmatrix}\begin{bmatrix}1/\sqrt{2}&&1/\sqrt{2}\\1/\sqrt{2}&&-1/\sqrt{2}\end{bmatrix} A=UΣVT= 1/6 2/6 1/6 1/2 01/2 1/3 1/3 1/3 3 00010 [1/2 1/2 1/2 1/2 ]

5. 用Eigen库实现SVD分解

#include <iostream>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

int main()
{
	MatrixXf m = MatrixXf::Zero(3, 2);
	m << 0,1,1,1,1,0;
	cout << "Here is the matrix m:" << endl << m << endl;
	JacobiSVD<MatrixXf> svd(m, ComputeFullU | ComputeFullV);
	cout << "Its singular values are:" << endl << svd.singularValues() << endl;
	cout << "Its left singular vectors are the columns of the thin U matrix:" << endl << endl << svd.matrixU() << endl;
	cout << "Its right singular vectors are the columns of the thin V matrix:" << endl << endl << svd.matrixV() << endl;
	system("pause");
	return 0;
}

输出结果

Here is the matrix m:
0 1
1 1
1 0
Its singular values are:
1.73205
      1
Its left singular vectors are the columns of the thin U matrix:

   0.408248   -0.707107     0.57735
   0.816496 5.96046e-08    -0.57735
   0.408248    0.707107     0.57735
Its right singular vectors are the columns of the thin V matrix:

 0.707107  0.707107
 0.707107 -0.707107

6. 对图像进行SVD分解

对图片进行奇异值分解(SVD)

SVD(奇异值分解)小结

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取图像(路径不能有中文)
img = cv2.imread('img.jpg')
# 原图大小为 h * w * c
h, w, c = img.shape

def decompose(img):
    # 将图片转换成 h * wc
    img_temp = img.reshape(h, w * c)
    # 奇异值分解
    u, sigma, vt = np.linalg.svd(img_temp)
    return u, sigma, vt

def rebuild(u, sigma, vt, sval_num):
    # 每个矩阵取前 500 个奇异值,近似得到原图
    img_temp = (u[:, 0:sval_num]).dot(np.diag(sigma[0:sval_num])).dot(vt[0:sval_num, :])
    # 转换为原图像的大小
    svd_img = img_temp.reshape(h, w, c)
    # 注意需要转换成uint8
    return np.array(svd_img, dtype=np.uint8)

u, sigma, vt = decompose(img)
svd_img = rebuild(u, sigma, vt, 500)

原图
在这里插入图片描述

SVD得到的
在这里插入图片描述

7. 总结

奇异值可以看作是一个矩阵代表值,或者说,奇异值能够代表这个矩阵的信息。当奇异值越大时,它代表的信息越多。因此,我们取前面若干个最大的奇异值,基本上可以还原出数据本身。

猜你喜欢

转载自blog.csdn.net/m0_37605642/article/details/132245610