重要说明:本文从网上资料整理而来,仅记录博主学习相关知识点的过程,侵删。
一、参考资料
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≥...≥σp≥0
σ
i
\sqrt{\sigma_i}
σi 为矩阵的奇异值。各矩阵的维度分别为
U
∈
R
m
×
m
\mathrm{U} \in \mathrm{R}^{\mathrm{m} \times \mathrm{m}}
U∈Rm×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}}
V∈Rn×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=UΣVT(UΣVT)T=UΣVTVΣTUT=UΣΣ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=(UΣV T ) T UΣV T =VΣ TU T UΣV T =VΣ T ΣV T
其中,
Σ
Σ
T
∈
R
m
×
m
\Sigma\Sigma^{\mathrm{T}}\in\mathrm{R}^{\mathrm{m\times m}}
ΣΣT∈Rm×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=[u1u2⋯um]
σ1σ2⋱⋱
m×n
v1v2⋮vn
在奇异值矩阵中奇异值按照从大到小排列,而且奇异值的减少特别的快。在很多情况下,前 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=σ1u1v1T+σ2u2v2T+⋯+σkukvkT
即:
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×N≫k(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/21/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/62/61/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/201/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/31/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/62/61/6−1/201/21/3−1/31/3
300010
[1/21/21/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. 总结
奇异值可以看作是一个矩阵代表值,或者说,奇异值能够代表这个矩阵的信息。当奇异值越大时,它代表的信息越多。因此,我们取前面若干个最大的奇异值,基本上可以还原出数据本身。