Matlab快速入门之线性代数:奇异值

4.3
(3)

本文属于Matlab快速入门之线性代数的第五篇,即奇异值,主要包括分批 SVD 计算低秩 SVD 逼近等相关内容。

Matlab快速入门之线性代数:奇异值

矩形矩阵 A 的奇异值和对应的奇异向量分别为满足以下条件的标量 σ 以及一对向量 u 和 v

Av=σu

AHu=σv,

其中 AH 是 A 的 Hermitian 转置。奇异向量 u 和 v 通常缩放至范数为 1。此外,如果 u 和 v 均为 A 的奇异向量,则 -u 和 -v 也为 A 的奇异向量。

奇异值 σ 始终为非负实数,即使 A 为复数也是如此。对于对角矩阵 Σ 中的奇异值以及构成两个正交矩阵 U 和 V 的列的对应奇异向量,方程为

AV=UΣ

AHU=VΣ.

由于 U 和 V 均为单位矩阵,因此将第一个方程的右侧乘以 VH 会生成奇异值分解方程

A=UΣVH.

m×n 矩阵的完整奇异值分解涉及:

  • m×m 矩阵 U
  • m×n 矩阵 Σ
  • n×n 矩阵 V

换句话说,U 和 V 均为方阵,Σ 与 A 的大小相同。如果 A 的行数远多于列数 (m > n),则得到的 m×m 矩阵 U 为大型矩阵。但是,U 中的大多数列与 Σ 中的零相乘。在这种情况下,精简分解可通过生成一个 m×n U、一个 n×n Σ 以及相同的 V 来同时节省时间和存储空间:

Matlab快速入门之线性代数:奇异值

特征值分解是分析矩阵(当矩形表示从向量空间到其自身的映射时)的合适工具,就像分析常微分方程一样。但是,奇异值分解是分析从一个向量空间到另一个向量空间(可能具有不同的维度)的映射的合适工具。大多数联立线性方程组都属于这第二类。

如果 A 是方形的对称正定矩阵,则其特征值分解和奇异值分解相同。但是,当 A 偏离对称性和正定性时,这两种分解之间的差异就会增加。特别是,实矩阵的奇异值分解始终为实数,但非对称实矩阵的特征值分解可能为复数。

对于示例矩阵:

>> A = [9 4;6 8;2 7]

A =

     9     4
     6     8
     2     7

完整的奇异值分解结果如下:

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

U =

   -0.6105    0.7174    0.3355
   -0.6646   -0.2336   -0.7098
   -0.4308   -0.6563    0.6194


S =

   14.9359         0
         0    5.1883
         0         0


V =

   -0.6925    0.7214
   -0.7214   -0.6925

可以验证 U*S*V' 在舍入误差界限内是否等于 A。对于此类小问题,精简分解只是略小一些。

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

U =

   -0.6105    0.7174
   -0.6646   -0.2336
   -0.4308   -0.6563


S =

   14.9359         0
         0    5.1883


V =

   -0.6925    0.7214
   -0.7214   -0.6925

同样,U*S*V' 在舍入误差界限内等于 A

分批 SVD 计算

如果需要分解一个由大小相同的矩阵组成的大型矩阵集合,则用 svd 在循环中执行所有分解是低效的。在这种情况下,您可以将所有矩阵串联成一个多维数组,并使用 pagesvd 通过一次函数调用对所有数组页执行奇异值分解。

函数用法
pagesvd使用 pagesvd 对多维数组的页执行奇异值分解。这是对大小相同的矩阵组成的大型集合执行 SVD 的高效方法。

例如,假设有一个包含三个 2×2 矩阵的集合。使用 cat 函数将这些矩阵串联成一个 2×2×3 数组。

A = [0 -1; 1 0];
B = [-1 0; 0 -1];
C = [0 1; -1 0];
X = cat(3,A,B,C);

现在,使用 pagesvd 同时执行三个分解。

[U,S,V] = pagesvd(X);

对于 X 的每页,输出 US 和 V 中都有对应的页。例如,矩阵 A 位于 X 的第一页上,其分解由 U(:,:,1)*S(:,:,1)*V(:,:,1)' 给出。

低秩 SVD 逼近

对于大型稀疏矩阵,使用 svd 计算所有奇异值和奇异向量并不始终可行。例如,如果您只需知道几个最大的奇异值,那么计算一个 5000×5000 稀疏矩阵的所有奇异值会带来额外的工作。

在只需要一部分奇异值和奇异向量的情况下,svds 和 svdsketch 函数优先于 svd

函数用法
svds使用 svds 计算 SVD 的 k 秩逼近。您可以指定一部分奇异值应为最大值、最小值还是最接近特定数字的值。svds 通常计算最可能的 k 秩逼近。
svdsketch使用 svdsketch 计算输入矩阵的满足指定容差的部分 SVD。svds 要求您指定秩,而 svdsketch 根据指定的容差以自适应方式确定矩阵草图的秩。svdsketch 最终使用的 k 秩逼近满足容差,但不同于 svds,它无法保证是最佳的。

例如,假设有一个密度约为 30% 的 1000×1000 随机稀疏矩阵。

n = 1000;
A = sprand(n,n,0.3);

最大的六个奇异值为:

>> S = svds(A)

S =

  130.2184
   16.4358
   16.4119
   16.3688
   16.3242
   16.2838

此外,最小的六个奇异值为:

>> S = svds(A,6,'smallest')

S =

    0.0740
    0.0574
    0.0388
    0.0282
    0.0131
    0.0066
Matlab快速入门之线性代数:奇异值

对于可作为满矩阵 full(A) 载入内存的较小矩阵,使用 svd(full(A)) 的速度可能仍快于使用 svds 或 svdsketch。但对于确实很大的稀疏矩阵,就有必要使用 svds 或 svdsketch

共计3人评分,平均4.3

到目前为止还没有投票~

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

让我们改善这篇文章!

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

文章目录

转载文章,原文出处:MathWorks官网,由古哥整理发布

如若转载,请注明出处:https://iymark.com/articles/3306.html

(1)
微信公众号
古哥的头像古哥管理团队
上一篇 2022年09月27日 00:53
下一篇 2022年09月29日 22:27

你可能感兴趣的文章

发表回复

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