Matlab函数中常见的奇异值分解方法

0
(0)

奇异值分解(Singular Value Decomposition,简称SVD)是一种重要的数学工具,它在信息处理、机器学习、图像处理等领域中被广泛应用。Matlab是一款强大的数值计算软件,拥有多种实现SVD的函数。本文将介绍Matlab中常见的SVD函数,包括svd、eig、qr等方法,并介绍SVD的原理和应用。

Matlab函数中常见的奇异值分解方法

1. SVD的原理

SVD是矩阵分解的一种方法,在线性代数中有重要的应用。对于任意一个矩阵A,它可以被分解成下面这个形式的乘积:

A = UΣV^T

其中,U和V是正交矩阵,Σ是对角矩阵,其对角线上的元素称为A的奇异值。Σ的大小取决于矩阵A的大小,如果是mxn的矩阵,那么Σ的大小为mxn。SVD可以分解任意矩阵,其中U是矩阵A的左奇异向量,V是矩阵A的右奇异向量,Σ是矩阵A的奇异值。它们的性质如下:

(1)U是mxm的正交矩阵,V是nxn的正交矩阵。

(2)Σ是mxn的矩阵,除了对角线上的元素外,其余元素均为0。

(3)奇异值从大到小排列,奇异向量也相应排列。

SVD的应用非常广泛,它可以用于降维、提取特征、信号处理、矩阵近似等。在机器学习中,SVD经常被用于PCA(Principal Component Analysis)算法,通过SVD分解矩阵,可以得到最大的特征值和对应的特征向量,进而将原始数据降到一维到几维,以达到对原数据精简的目的。

2. Matlab中的SVD函数

在Matlab中,有多种实现SVD的函数,包括svd、eig、qr等方法。下面将分别介绍这些函数的使用方法和特点。

(1)svd函数

使用svd函数实现SVD分解,其调用方式为:

[U,S,V] = svd(A)

其中,A是待分解的矩阵,U、S、V是分别对应其左奇异向量、奇异值、右奇异向量,它们可以通过SVD分解得到。在实际应用中,我们通常只需要取S矩阵的前k个主对角线元素来进行矩阵近似,即将其他元素置为0,这样可以达到对矩阵的压缩效果。使用svd函数实现矩阵近似的方式如下:

k = 10 % 前10个奇异值参与矩阵压缩
S_k = zeros(size(A));
S_k(1:k,1:k) = S(1:k,1:k);
A_k = U*S_k*V’

在上述代码中,我们首先设定前k个奇异值参与矩阵压缩,然后构造一个全零矩阵S_k,并将S的前k个主对角线元素复制到S_k对应的位置中。最后,通过U、S_k和V进行矩阵乘法,即可得到压缩后的矩阵A_k。

(2)eig函数

Matlab中的eig函数也可以用来实现SVD分解,其调用方式为:

[U,D] = eig(A*A’)

其中,D是A*A’的特征值矩阵,U是其对应的特征向量矩阵。如果想要求得A的右奇异向量,则可以通过A’*U/D来得到,即:

V = A’*U/D

使用eig函数进行SVD分解的优点在于,它不需要求解A的伪逆矩阵,计算速度比svd函数相对快一些。但是,由于将A*A’进行分解,会出现特征值为0的情况,从而导致U矩阵可能会出现病态。

(3)qr函数

qr函数也可以用于SVD分解,其调用方式为:

[Q,R,P] = qr(A)
U = Q
S = R*P’
V = P

其中,Q是A的列正交化的结果,R是A的行正交化的结果,P是置换矩阵,其作用是保证求得的SVD满足奇异值从大到小的顺序。与前两种函数不同的是,qr函数的输出中并没有直接给出奇异值矩阵Σ,而是通过S=R*P’的形式来计算得到,这种表示方式不利于对奇异值进行筛选,需要自行进行处理。

3. SVD的应用实例

SVD在实际应用中非常广泛,下面以矩阵近似为例,介绍SVD的具体应用。

我们可以从一张图片入手,构造一个512×512的矩阵,然后对其进行SVD分解。下面是相关代码:

I = imread(‘lena.jpg’);
I = im2double(I);
[m,n] = size(I);
[U,S,V] = svd(I);
figure;
imshow(I);

上述代码中,我们使用imread函数读入一张名为lena.jpg的图片,并将其转化为double类型的矩阵。然后,通过svd函数对其进行SVD分解,并将得到的U、S、V矩阵进行可视化,如下图所示:

可以看到,U和V矩阵的大小都是512×512,分别代表图片的左、右奇异向量;而S矩阵的大小为512×512,其对角线上的元素即为原始图片的奇异值。接下来,我们将使用SVD分解得到的U、S、V矩阵来对该图片进行压缩处理。

对S矩阵进行筛选:由于SVD分解得到的S矩阵是按照奇异值从大到小排列的,因此我们可以通过保留前k个主对角线元素来进行矩阵压缩,这里我们取前100个奇异值(即前100个主对角线元素)进行矩阵压缩,代码如下:

k = 100;
A_k = U(:,1:k)*S(1:k,1:k)*V(:,1:k)’;

对A_k进行可视化:将矩阵A_k进行重构,并进行可视化显示,代码如下:

figure;
imshow(A_k);

上述代码中,我们首先将U、S、V中的前100个主对角线元素分别取出来,构造出一个新的S_k矩阵;然后,将U、S_k和V进行矩阵乘法,得到压缩后的矩阵A_k,并将其进行可视化显示,如下图所示:

可以看到,经过矩阵压缩之后,图片的清晰度有所下降,但整体轮廓依然清晰可见,压缩比也达到了100/512=19.53%。这充分说明了SVD在图像处理中的优越性,这种方法即能达到压缩的目的,又能保留图片的整体特征。

4. 总结

SVD是一种非常重要的数学工具,在信息处理、机器学习、图像处理等众多领域中都有着广泛的应用。Matlab作为一款强大的数值计算软件,提供了多种实现SVD的函数,包括svd、eig、qr等方法。在使用这些函数时,需要根据具体的应用需求进行选择,以达到最佳的计算效率和计算精度。

共计0人评分,平均0

到目前为止还没有投票~

很抱歉,这篇文章对您没有用!

让我们改善这篇文章!

告诉我们我们如何改善这篇文章?

原创文章,作者:古哥,转载需经过作者授权同意,并附上原文链接:https://iymark.com/articles/9737.html

(0)
微信公众号
古哥的头像古哥管理团队
上一篇 2023年05月22日 14:45
下一篇 2023年05月22日 15:05

你可能感兴趣的文章

发表回复

登录后才能评论
微信小程序
微信公众号