简介
奇异值分解是线性代数中重要的矩阵分解,奇异值分解则是特征分解在任意矩阵上的推广。在信号处理、统计学等领域有重要作用。
原理推导
特征值与特征向量
定义:
A
x
=
λ
x
Ax = λx
Ax=λx
符号 | 含义 |
---|---|
A | n*n的矩阵 |
x | n维特征向量 |
λ | 矩阵A的特征值 |
将n个特征值、特征向量进行组合:
(
x
1
x
2
⋯
x
n
)
−
1
A
(
x
1
x
2
⋯
x
n
)
=
[
λ
1
⋯
0
⋮
⋱
⋮
0
⋯
λ
n
]
(x_1\quad x_2\cdots x_n )^{-1}A(x_1\quad x_2\cdots x_n ) = \begin{bmatrix} \lambda_1 & \cdots & 0 \\ \vdots & \ddots & \vdots \\ 0 & \cdots & \lambda_n \end{bmatrix}
(x1x2⋯xn)−1A(x1x2⋯xn)=⎣⎢⎡λ1⋮0⋯⋱⋯0⋮λn⎦⎥⎤
一般我们会对x进行单位化,即:向量内积为1。W的n个特征向量为标准正交基,即:
W
T
W
=
E
n
W^TW = E_n
WTW=En
W为酉矩阵(若酉矩阵所有元素为实数,即为正交矩阵),即:
W
T
=
W
−
1
W^T = W^{-1}
WT=W−1
即:
W
−
1
A
W
=
Λ
⇔
A
=
W
Λ
W
−
1
W^{-1}AW = \Lambda\Leftrightarrow A = W\Lambda W^{-1}
W−1AW=Λ⇔A=WΛW−1
符号 | 含义 |
---|---|
W | n个特征向量组成n维方阵 |
\Lambda | n个特征值组成的对角线方阵 |
这是对方阵A的分解原理,如果不是方阵就需要应用SVD。
SVD奇异值分解推导
-
假设一个矩阵M,大小为m*n。
M T M 为 一 个 方 阵 且 方 阵 对 称 。 M^TM为一个方阵且方阵对称。 MTM为一个方阵且方阵对称。 -
对于实对称矩阵,有一个性质就是存在正交矩阵Q,使得:
Q T A Q = d i a g ( λ 1 , λ 2 . . . ) Q^TAQ = diag(\lambda_1,\lambda_2...) QTAQ=diag(λ1,λ2...)
即存在:
Q T M T M Q = d i a g ( λ 1 , λ 2 . . ) Q^TM^TMQ = diag(\lambda_1,\lambda_2..) QTMTMQ=diag(λ1,λ2..) -
令 Σ = d i a g ( λ 1 , λ 2 . . ) , 即 Q T M T M Q = Σ 2 令\Sigma=\sqrt{diag(\lambda_1,\lambda_2..)} ,即Q^TM^TMQ = \Sigma^2 令Σ=diag(λ1,λ2..),即QTMTMQ=Σ2
-
令:
P T = Q T M T / Σ P^T=Q^TM^T/\Sigma PT=QTMT/Σ
则:
P = M Q / Σ P=MQ/\Sigma P=MQ/Σ -
由于
P T P = Q T M T M Q / Σ 2 = E P^TP=Q^TM^TMQ/\Sigma^2=E PTP=QTMTMQ/Σ2=E
所以P为正交矩阵。(P,Q都为正交矩阵) -
因此
M = P Σ Q T M=P\Sigma Q^T M=PΣQT -
得出结论:我们可以把任意矩阵分解成两个正交矩阵和一个对角阵。
SVD中P和Q的求解
-
由于
M T = Q Σ T P T M^T=Q\Sigma^TP^T MT=QΣTPT
则
M T M = Q Σ T P T P Σ Q T = Q Σ 2 Q T ( 其 中 Σ 为 对 角 阵 , P 为 正 交 矩 阵 ) M^TM=Q\Sigma^TP^TP\Sigma Q^T=Q\Sigma^2Q^T(其中\Sigma为对角阵,P为正交矩阵) MTM=QΣTPTPΣQT=QΣ2QT(其中Σ为对角阵,P为正交矩阵) -
即
M T M = Q Σ 2 Q T , M T M x i = λ i x i M^TM=Q\Sigma^2 Q^T,M^TMx_i=\lambda_ix_i MTM=QΣ2QT,MTMxi=λixi -
所 以 求 出 M T M 的 特 征 向 量 即 可 得 到 Q , 同 理 通 过 M M T 即 可 求 出 P 所以求出M^TM的特征向量即可得到Q,同理通过MM^T即可求出P 所以求出MTM的特征向量即可得到Q,同理通过MMT即可求出P
奇异值性质
- 奇异值在奇异值矩阵中是从大到小排列的。
- 奇异值的减小特别快。
- 常常用前几个奇异值和相应的左右向量取表述整个矩阵。如数据压缩,数据去噪,也可以用于推荐算法。
Matlab代码
filename='附件1.xls';
[num,txt,raw] = xlsread(filename,'gearbox00','B1:E29401');
x=1:1:29400;
plot(x,num(1:29400,4));
%奇异值分解,首先需要将数据处理成矩阵形式,矩阵形状应尽量接近方阵。
y1=reshape(num(1:29400,4),28,1050); %29400 = 28 *1050
[u,s,v]=svd(y1);
s1=s;
s(1:10,1:10)%输出奇异值,便是输出对角线元素
u1=u;v1=v;
%下面是滤波程序,假设我们要滤掉第二个奇异值之后的数值
s1(2:28,2:1050)=0;
for i=2:28
u1(i,i)=0;
end
for j=2:28
v1(j,j)=0;
end
%再将处理后的奇异值整合成数据集
y2=u1*s1*v1';
y2=reshape(y2,1,29400);
%画图
figure();
subplot(2,1,1);
plot(x,num1(1:29400,4),'k'); grid on;
title('a.原始信号');
subplot(2,1,2);
plot(x,y2,'k');grid on;
title('e.SVD去掉的噪声的信号');