简介
奇异值分解是线性代数中重要的矩阵分解,奇异值分解则是特征分解在任意矩阵上的推广。在信号处理、统计学等领域有重要作用。
原理推导
特征值与特征向量
定义:
符号 | 含义 |
---|---|
A | n*n的矩阵 |
x | n维特征向量 |
λ | 矩阵A的特征值 |
将n个特征值、特征向量进行组合:
一般我们会对x进行单位化,即:向量内积为1。W的n个特征向量为标准正交基,即:
W为酉矩阵(若酉矩阵所有元素为实数,即为正交矩阵),即:
即:
符号 | 含义 |
---|---|
W | n个特征向量组成n维方阵 |
\Lambda | n个特征值组成的对角线方阵 |
这是对方阵A的分解原理,如果不是方阵就需要应用SVD。
SVD奇异值分解推导
-
假设一个矩阵M,大小为m*n。
-
对于实对称矩阵,有一个性质就是存在正交矩阵Q,使得:
即存在:
-
令:
则:
-
由于
所以P为正交矩阵。(P,Q都为正交矩阵) -
因此
-
得出结论:我们可以把任意矩阵分解成两个正交矩阵和一个对角阵。
SVD中P和Q的求解
-
由于
则
-
即
奇异值性质
- 奇异值在奇异值矩阵中是从大到小排列的。
- 奇异值的减小特别快。
- 常常用前几个奇异值和相应的左右向量取表述整个矩阵。如数据压缩,数据去噪,也可以用于推荐算法。
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去掉的噪声的信号');
文章出处登录后可见!
已经登录?立即刷新