SVD(奇异值分解)数值计算方法解析(一):SVD的概念与人工手算SVD的方法

文章目录

  • 前言
  • 一、SVD是什么?
    • 1.特征值的定义与特征值分解
    • 2.奇异值的定义与奇异值分解
    • 3.SVD展示
  • 二、人工计算SVD方法
    • 1.奇异值分解的性质分析
    • 2.特征值分解的人工计算方法
    • 3.奇异值分解的人工计算方法
    • 4.总结


前言

奇异值分解(Singular Value Decomposition,简称SVD)是在现代科学计算中应用广泛的数学算法。
本系列文章《SVD(奇异值分解)数值计算方法解析》将基于笔者的开发经验,从SVD的概念入手,讲解如何人工手算SVD以及如何在计算机上实现SVD,并会在后篇给出详尽的代码与解析。笔者希望读者可以通过阅读这个系列的文章,熟悉SVD数值计算方法完整流程。同时这也是对笔者知识的一种巩固,和知识分享能力的一种锻炼。如果读者发现文章内容有错漏,或是认为部分描述不够清晰,欢迎在评论区提出指导意见。

本篇文章《SVD的概念与人工手算SVD的方法》重在引入SVD的概念,并介绍人工手算SVD的一种方法,笔者希望能通过这种方式让读者对SVD有个简单的了解,方便为后续文章做知识铺垫。如果读者已经熟悉SVD的概念,希望直接了解数值计算SVD的方法,可以关注笔者的后续文章。


一、SVD是什么?

1.特征值的定义与特征值分解

在了解SVD之前,我们先从特征值的概念入手。

  • 定义:设矩阵 A ∈ R m × n \bm{A} \in \R^{m \times n} ARm×n(本文章仅考虑实数矩阵,不涉及复数矩阵的内容),如果存在常数 λ \lambda λ n n n维非零列向量 x \bm{x} x,使得关系式
    A x = λ x \bm{Ax = } \lambda \bm{x} Ax=λx
    成立,则称这样的常数 λ \lambda λ为矩阵 A \bm{A} A特征值,称这样的 n n n维非零列向量 x \bm{x} x为矩阵 A \bm{A} A特征值向量
  • 特征值分解:设矩阵 A ∈ R n × n \bm{A} \in \R^{n \times n} ARn×n,则必存在正交矩阵
    Q = [ u 1 , . . . , u n ] ∈ R n × n \bm{Q=}[\bm{u_1, ...,u_n}] \in \R^{n \times n} Q=[u1,...,un]Rn×n
    使得:
    A = Q Σ Q − 1   . . .   ( 1 ) \bm{A}=\bm{Q}\bm{\varSigma}\bm{Q}^{-1} \space ... \space(1) A=QΣQ1 ... (1)
    我们称式(1)为矩阵 A \bm{A} A的特征值分解。其中 Σ = d i a g ( λ 1 , . . . , λ n ) ,   ( λ 1 ≥ 0 , . . . , λ n ≥ 0 ) \bm{\varSigma}=diag(\lambda_1,...,\lambda_n),\space (\lambda_1 \ge 0, ... ,\lambda_n \ge 0) Σ=diag(λ1,...,λn), (λ10...λn0)是对角线为矩阵 A \bm{A} A特征值的 n n n阶方阵。 u i \bm{u_i} ui是对应矩阵 A \bm{A} A特征值 λ i \lambda_i λi的特征列向量,满足 A u i = λ i u i \bm{Au_i = } \lambda_i \bm{u_i} Aui=λiui。矩阵 Q \bm{Q} Q称为矩阵 A \bm{A} A特征矩阵。
    由于 Q \bm{Q} Q是正交矩阵,满足 Q − 1 = Q T \bm{Q}^{-1} = \bm{Q}^T Q1=QT,因此矩阵 A \bm{A} A的特征值分解也可表示为 A = Q Σ Q T . \bm{A}=\bm{Q}\bm{\varSigma}\bm{Q}^T. A=QΣQT.

关于特征值的含义与作用,本文不做介绍,读者可以自行查阅资料了解。

2.奇异值的定义与奇异值分解

在特征值的定义中,我们注意到假设的矩阵是 n n n阶方阵。而当舍去这个限定条件时,我们便可引申出奇异值的概念。

  • 定义:设矩阵 A ∈ R m × n \bm{A} \in \R^{m \times n} ARm×n,则称矩阵 A T A \bm{A}^T\bm{A} ATA的特征值的非负平方根为矩阵 A \bm{A} A的奇异值。 A \bm{A} A的奇异值的全体记作 σ ( A ) \sigma(\bm{A}) σ(A)

有了奇异值的定义后,我们便可介绍奇异值分解定理。

  • 奇异值分解(SVD):设矩阵 A ∈ R m × n \bm{A} \in \R^{m \times n} ARm×n,则必存在正交矩阵
    U = [ u 1 , . . . , u m ] ∈ R m × m 和 V = [ u 1 , . . . , u n ] ∈ R n × n \bm{U=}[\bm{u_1, ...,u_m}] \in \R^{m \times m}和\bm{V=}[\bm{u_1, ...,u_n}] \in \R^{n \times n} U=[u1,...,um]Rm×mV=[u1,...,un]Rn×n
    使得:
    U T A V = [ Σ r 0 0 0 ] ( 或 A = U [ Σ r 0 0 0 ] V T )   . . .   ( 2 ) \bm{U}^T\bm{AV}=\begin{bmatrix} \varSigma_r & 0 \\ 0 & 0 \end{bmatrix}(或\bm{A}=\bm{U}\begin{bmatrix} \bm{\varSigma_r} & 0 \\ 0 & 0 \end{bmatrix}\bm{V}^T)\space ...\space (2) UTAV=[Σr000](A=U[Σr000]VT) ... (2)
    我们称式(2)为矩阵 A \bm{A} A的奇异值分解。其中 Σ r = d i a g ( σ 1 , . . . , σ r ) ,   σ 1 ≥ . . . ≥ σ r > 0. ( 0 ≤ r ≤ m i n ( m , n ) ) \bm{\varSigma_r}=diag(\sigma_1,...,\sigma_r),\space \sigma_1 \ge ... \ge \sigma_r \gt 0.(0 \le r \le min(m,n)) Σr=diag(σ1,...,σr), σ1...σr>0.(0rmin(m,n)) σ i \sigma_i σi是矩阵 A \bm{A} A的从大到小排序的第 i i i个奇异值。列向量 u i \bm{u_i} ui v i \bm{v_i} vi分别称为矩阵 A \bm{A} A对应奇异值 σ i \sigma_i σi的左奇异向量和右奇异向量,满足 A v i = σ i u i \bm{Av_i = } \sigma_i \bm{u_i} Avi=σiui。正交矩阵 U \bm{U} U V \bm{V} V分别称为矩阵 A \bm{A} A的左奇异矩阵和右奇异矩阵。

关于SVD的应用,本文不做介绍,读者可以自行查阅资料了解。

3.SVD展示

我们可以直接参考pytorch的svd算子官方文档内容。下图为pytorch的svd算子的接口:
pytorch的svd算子接口
下方代码为pytorch的svd算子官方文档内示例:

>>> a = torch.randn(5, 3)
>>> a
tensor([[ 0.2364, -0.7752,  0.6372],
        [ 1.7201,  0.7394, -0.0504],
        [-0.3371, -1.0584,  0.5296],
        [ 0.3550, -0.4022,  1.5569],
        [ 0.2445, -0.0158,  1.1414]])
>>> u, s, v = torch.svd(a)
>>> u
tensor([[ 0.4027,  0.0287,  0.5434],
        [-0.1946,  0.8833,  0.3679],
        [ 0.4296, -0.2890,  0.5261],
        [ 0.6604,  0.2717, -0.2618],
        [ 0.4234,  0.2481, -0.4733]])
>>> s
tensor([2.3289, 2.0315, 0.7806])
>>> v
tensor([[-0.0199,  0.8766,  0.4809],
        [-0.5080,  0.4054, -0.7600],
        [ 0.8611,  0.2594, -0.4373]])
>>> torch.dist(a, torch.mm(torch.mm(u, torch.diag(s)), v.t()))
tensor(8.6531e-07)
>>> a_big = torch.randn(7, 5, 3)
>>> u, s, v = torch.svd(a_big)
>>> torch.dist(a_big, torch.matmul(torch.matmul(u, torch.diag_embed(s)), v.transpose(-2, -1)))
tensor(2.6503e-06)

pytorch的svd算子详情可查看官方文档:
https://pytorch.org/docs/stable/generated/torch.svd.html?highlight=svd#torch.svd


二、人工计算SVD方法

在第一节中,我们给出了SVD的定义,但定理只说明了存在性,并没有给出求解的算法。如果我们希望计算矩阵的奇异值分解,应该如何操作呢?本节将以一个简单的矩阵作为例子,通过手算演示人工计算SVD的一个方法。

  • 注意:如果你想直接了解SVD的数值计算方法,可以跳过本节内容。

1.奇异值分解的性质分析

我们首先回顾奇异值分解定理:

  • 奇异值分解定理(SVD):设矩阵 A ∈ R m × n \bm{A} \in \R^{m \times n} ARm×n,则必存在正交矩阵
    U = [ u 1 , . . . , u m ] ∈ R m × m 和 V = [ u 1 , . . . , u n ] ∈ R n × n \bm{U=}[\bm{u_1, ...,u_m}] \in \R^{m \times m}和\bm{V=}[\bm{u_1, ...,u_n}] \in \R^{n \times n} U=[u1,...,um]Rm×mV=[u1,...,un]Rn×n
    使得:
    U T A V = [ Σ r 0 0 0 ] ( 或 A = U [ Σ r 0 0 0 ] V T )   . . .   ( 1 ) \bm{U}^T\bm{AV}=\begin{bmatrix} \varSigma_r & 0 \\ 0 & 0 \end{bmatrix}(或\bm{A}=\bm{U}\begin{bmatrix} \bm{\varSigma_r} & 0 \\ 0 & 0 \end{bmatrix}\bm{V}^T)\space ...\space (1) UTAV=[Σr000](A=U[Σr000]VT) ... (1)
    其中 Σ r = d i a g ( σ 1 , . . . , σ r ) ,   σ 1 ≥ . . . ≥ σ r > 0. ( 0 ≤ r ≤ m i n ( m , n ) ) \bm{\varSigma_r}=diag(\sigma_1,...,\sigma_r),\space \sigma_1 \ge ... \ge \sigma_r \gt 0.(0 \le r \le min(m,n)) Σr=diag(σ1,...,σr), σ1...σr>0.(0rmin(m,n))

我们可以注意到,如果将矩阵 A \bm{A} A和其自身的转置 A T \bm{A}^T AT做矩阵乘,便可得到:
A A T = ( U Σ V T ) ( V Σ T U T ) = U Σ ( V T V ) Σ T U T = U ( Σ Σ T ) U T = U Σ 2 U T ∈ R m × m A T A = ( V Σ T U T ) ( U Σ V T ) = V Σ T ( U T U ) Σ V T = V ( Σ Σ T ) V T = V Σ 2 V T ∈ R n × n \bm{AA}^T = (\bm{U \varSigma V}^T)(\bm{V \varSigma}^T\bm{U}^T)=\bm{U \varSigma}(\bm{V}^T\bm{V} )\bm{ \varSigma}^T\bm{U}^T=\bm{U}(\bm{ \varSigma}\bm{ \varSigma}^T)\bm{U}^T= \bm{U}\bm{\varSigma}^2\bm{U}^T\in \R^{m \times m} \\ \bm{A^TA} = (\bm{V \varSigma}^T\bm{U}^T)(\bm{U \varSigma V}^T)=\bm{V \varSigma}^T(\bm{U}^T\bm{U}) \bm{\varSigma V}^T= \bm{V}(\bm{ \varSigma}\bm{ \varSigma}^T)\bm{V}^T= \bm{V}\bm{\varSigma}^2\bm{V}^T \in \R^{n \times n} AAT=(UΣVT)(VΣTUT)=UΣ(VTV)ΣTUT=U(ΣΣT)UT=UΣ2UTRm×mATA=(VΣTUT)(UΣVT)=VΣT(UTU)ΣVT=V(ΣΣT)VT=VΣ2VTRn×n

也就是说,矩阵 A \bm{A} A左右奇异矩阵,分别等于对称方阵 A A T \bm{AA^T} AAT A T A \bm{A^TA} ATA的特征矩阵。并且 A A T \bm{AA^T} AAT A T A \bm{A^TA} ATA的特征值矩阵 Σ 2 \bm{ \varSigma}^2 Σ2即为矩阵 A \bm{A} A的奇异值矩阵 Σ \bm{ \varSigma} Σ的平方。这说明,我们可以通过计算对称方阵 A A T \bm{AA^T} AAT A T A \bm{A^TA} ATA特征值分解来间接计算矩阵 A \bm{A} A的奇异值分解。下文便介绍了一种人工计算特征值分解的方法。

2.特征值分解的人工计算方法

我们回顾一下特征值的定义:

  • 定义:设矩阵 A ∈ R m × n \bm{A} \in \R^{m \times n} ARm×n(本文章仅考虑实数矩阵,不涉及复数矩阵的内容),如果存在常数 λ \lambda λ n n n维非零列向量 x \bm{x} x,使得关系式
    A x = λ x \bm{Ax = } \lambda \bm{x} Ax=λx
    成立,则称这样的常数 λ \lambda λ为矩阵 A \bm{A} A特征值,称这样的 n n n维非零列向量 x \bm{x} x为矩阵 A \bm{A} A特征值向量

我们可以注意到,式 A x = λ x \bm{Ax = } \lambda \bm{x} Ax=λx也可以写成 ( A − λ E ) x = 0 (\bm{A} - \lambda\bm{E} )\bm{x}= 0 (AλE)x=0( E \bm{E} E为和 A \bm{A} A同阶的单位矩阵)。其中 x \bm{x} x有非零解的充分必要条件是其系数行列式 ∣ A − λ E ∣ = 0 |\bm{A} - \lambda\bm{E} |=0 AλE=0。注意此时 ∣ A − λ E ∣ |\bm{A} - \lambda\bm{E} | AλE是一个一元n次的多项式。因此,通过求解多项式 ∣ A − λ E ∣ |\bm{A} - \lambda\bm{E} | AλE的零解,我们便可得到矩阵 A \bm{A} A的特征值集合,进一步根据式 A x = λ x \bm{Ax = } \lambda \bm{x} Ax=λx计算就可以得到特征矩阵。

  • 示例1:设矩阵 A = [ 3 5 5 3 ] \bm{A}= \begin{bmatrix} 3 & 5 \\ 5 & 3 \end{bmatrix} A=[3553],求其特征值分解。
    解:
    (1)设特征值为 λ \lambda λ,求解多项式方程 ∣ A − λ E ∣ = 0 |\bm{A} - \lambda\bm{E} |=0 AλE=0
    ∣ A − λ E ∣ = 0 ⇒ ∣ 3 − λ 5 5 3 − λ ∣ = 0 ⇒ ( 3 − λ ) 2 − 25 = 0 ⇒ ( λ − 8 ) ( λ + 2 ) = 0 ⇒ λ 1 = 8 ,   λ 2 = − 2. |\bm{A} - \lambda\bm{E} |=0 \Rarr \begin{vmatrix} 3-\lambda & 5 \\ 5 & 3-\lambda \end{vmatrix} = 0 \Rarr (3 - \lambda)^2 - 25 = 0 \Rarr (\lambda - 8)(\lambda + 2) = 0 \Rarr \lambda_1 = 8, \space \lambda_2 = -2. AλE=03λ553λ=0(3λ)225=0(λ8)(λ+2)=0λ1=8, λ2=2.于是我们得到了矩阵 A \bm{A} A的特征值矩阵 Σ = [ 8 0 0 − 2 ] \bm{\varSigma} = \begin{bmatrix} 8 & 0 \\ 0 & -2 \end{bmatrix} Σ=[8002]
    (2)通过式 ( A − λ E ) x = 0 (\bm{A} - \lambda\bm{E} )\bm{x}= 0 (AλE)x=0求解特征向量:
    ( A − λ 1 E ) x 1 = 0 ⇒ [ 3 − 8 5 5 3 − 8 ] x 1 = 0 ⇒ [ − 5 5 5 − 5 ] x 1 = 0 ⇒ x 1 = [ 1 / 2 1 / 2 ] (\bm{A} - \lambda_1\bm{E} )\bm{x_1}= 0 \Rarr \begin{bmatrix} 3-8 & 5 \\ 5 & 3-8 \end{bmatrix} \bm{x_1} = 0 \Rarr \begin{bmatrix} -5 & 5 \\ 5 & -5 \end{bmatrix} \bm{x_1} = 0 \Rarr \bm{x_1} = \begin{bmatrix} 1/\sqrt{2} \\ 1/\sqrt{2} \end{bmatrix} (Aλ1E)x1=0[385538]x1=0[5555]x1=0x1=[1/2 1/2 ] ( A − λ 2 E ) x 2 = 0 ⇒ [ 3 + 2 5 5 3 + 2 ] x 2 = 0 ⇒ [ 5 5 5 5 ] x 2 = 0 ⇒ x 2 = [ 1 / 2 − 1 / 2 ] (\bm{A} - \lambda_2\bm{E} )\bm{x_2}= 0 \Rarr \begin{bmatrix} 3+2 & 5 \\ 5 & 3+2 \end{bmatrix} \bm{x_2} = 0 \Rarr \begin{bmatrix} 5 & 5 \\ 5 & 5 \end{bmatrix} \bm{x_2} = 0 \Rarr \bm{x_2} = \begin{bmatrix} 1/\sqrt{2} \\ -1/\sqrt{2} \end{bmatrix} (Aλ2E)x2=0[3+2553+2]x2=0[5555]x2=0x2=[1/2 1/2 ]由此我们便求出了矩阵 A \bm{A} A的两个特征向量 x 1 \bm{x_1} x1 x 2 \bm{x_2} x2(注意计算时要将特征向量单位化)。
    那么矩阵 A \bm{A} A的特征矩阵为 Q = [ x 1 , x 2 ] = [ 1 / 2 1 / 2 1 / 2 − 1 / 2 ] \bm{Q}=[\bm{x_1,x_2}]=\begin{bmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ 1/\sqrt{2} & -1/\sqrt{2} \end{bmatrix} Q=[x1,x2]=[1/2 1/2 1/2 1/2 ]
    (3)验证:
    Q Σ Q T = [ 1 / 2 1 / 2 1 / 2 − 1 / 2 ] [ 8 0 0 − 2 ] [ 1 / 2 1 / 2 1 / 2 − 1 / 2 ] = [ 3 5 5 3 ] = A \bm{Q \varSigma Q^T} = \begin{bmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ 1/\sqrt{2} & -1/\sqrt{2} \end{bmatrix} \begin{bmatrix} 8 & 0 \\ 0 & -2 \end{bmatrix} \begin{bmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ 1/\sqrt{2} & -1/\sqrt{2} \end{bmatrix}= \begin{bmatrix} 3 & 5 \\ 5 & 3 \end{bmatrix} = \bm{A} QΣQT=[1/2 1/2 1/2 1/2 ][8002][1/2 1/2 1/2 1/2 ]=[3553]=A

3.奇异值分解的人工计算方法

基于上文的铺垫,我们这里直接通过一个简单的例子来展示SVD的求解过程:

  • 示例2:设矩阵 A = [ 1 0 2 1 0 1 ] \bm{A}= \begin{bmatrix} 1 & 0 \\ 2 & 1 \\ 0 & 1 \end{bmatrix} A=120011,求其奇异值分解。
    解:
    (1)计算矩阵 A A T \bm{AA^T} AAT A T A \bm{A^TA} ATA
    A A T = [ 1 0 2 1 0 1 ] [ 1 2 0 0 1 1 ] = [ 1 2 0 2 5 1 0 1 1 ] A T A = [ 1 2 0 0 1 1 ] [ 1 0 2 1 0 1 ] = [ 5 2 2 2 ] \bm{AA^T}= \begin{bmatrix} 1 & 0 \\ 2 & 1 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 2 & 0 \\ 0 & 1 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 2 & 0 \\ 2 & 5 & 1 \\ 0 & 1 & 1\end{bmatrix} \\ \bm{A^TA}=\begin{bmatrix} 1 & 2 & 0 \\ 0 & 1 & 1 \end{bmatrix} \begin{bmatrix} 1 & 0 \\ 2 & 1 \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} 5 & 2 \\ 2 & 2 \end{bmatrix} AAT=120011[102101]=120251011ATA=[102101]120011=[5222](2)计算矩阵 A A T \bm{AA^T} AAT的特征值分解:
    ∣ A A T − λ E ∣ = 0 ⇒ ∣ 1 − λ 2 0 2 5 − λ 1 0 1 1 − λ ∣ = 0 ⇒ λ ( λ − 1 ) ( λ − 6 ) = 0 ⇒ λ 1 = 6 , λ 2 = 1 , λ 3 = 0. |\bm{AA^T} - \lambda\bm{E} |=0 \Rarr \begin{vmatrix} 1-\lambda & 2 & 0 \\ 2 & 5-\lambda & 1 \\ 0 & 1 & 1-\lambda \end{vmatrix} = 0 \Rarr \lambda(\lambda - 1)(\lambda-6) = 0 \Rarr \lambda_1 = 6,\lambda_2 = 1,\lambda_3 = 0. AATλE=01λ2025λ1011λ=0λ(λ1)(λ6)=0λ1=6,λ2=1,λ3=0.求解 ( A A T − λ 1 E ) u 1 = 0 ⇒ [ − 5 2 0 2 − 1 1 0 1 − 5 ] u 1 = 0 (\bm{AA^T} - \lambda_1\bm{E})\bm{u_1}=0 \Rarr \begin{bmatrix} -5 & 2 & 0 \\ 2 & -1 & 1 \\ 0 & 1 & -5 \end{bmatrix} \bm{u_1}= 0 (AATλ1E)u1=0520211015u1=0得到对应特征值 λ 1 = 6 \lambda_1=6 λ1=6的特征向量 u 1 = [ 2 / 30 5 / 30 1 / 30 ] \bm{u_1} =\begin{bmatrix} 2/\sqrt{30} \\ 5/\sqrt{30} \\ 1/\sqrt{30} \end{bmatrix} u1=2/30 5/30 1/30 。同理可得对应特征值 λ 2 = 1 \lambda_2=1 λ2=1的特征向量 u 2 = [ 1 / 5 0 − 2 / 5 ] \bm{u_2} =\begin{bmatrix} 1/\sqrt{5} \\ 0 \\ -2/\sqrt{5} \end{bmatrix} u2=1/5 02/5 ,对应特征值 λ 3 = 0 \lambda_3=0 λ3=0的特征向量 u 3 = [ 2 / 6 1 / 6 − 1 / 6 ] \bm{u_3} =\begin{bmatrix} 2/\sqrt{6} \\ 1/\sqrt{6} \\ -1/\sqrt{6} \end{bmatrix} u3=2/6 1/6 1/6
    于是我们得到了矩阵 A A T \bm{AA^T} AAT的特征矩阵 U = [ u 1 , u 2 , u 3 ] = [ 2 / 30 1 / 5 2 / 6 5 / 30 0 1 / 6 5 / 30 − 2 / 5 − 1 / 6 ] \bm{U}=[\bm{u_1,u_2,u_3}]=\begin{bmatrix} 2/\sqrt{30} & 1/\sqrt{5} & 2/\sqrt{6} \\ 5/\sqrt{30} & 0 & 1/\sqrt{6} \\ 5/\sqrt{30} & -2/\sqrt{5} & -1/\sqrt{6} \end{bmatrix} U=[u1,u2,u3]=2/30 5/30 5/30 1/5 02/5 2/6 1/6 1/6
    (3)计算矩阵 A T A \bm{A^TA} ATA的特征值分解:
    ∣ A T A − λ E ∣ = 0 ⇒ ∣ 5 − λ 2 2 2 − λ ∣ = 0 ⇒ ( λ − 1 ) ( λ − 6 ) = 0 ⇒ λ 1 = 6 , λ 2 = 1. |\bm{A^TA} - \lambda\bm{E} |=0 \Rarr \begin{vmatrix} 5-\lambda & 2 \\ 2 & 2-\lambda \end{vmatrix} = 0 \Rarr (\lambda - 1)(\lambda-6) = 0 \Rarr \lambda_1 = 6,\lambda_2 = 1. ATAλE=05λ222λ=0(λ1)(λ6)=0λ1=6,λ2=1.求解 ( A T A − λ 1 E ) v 1 = 0 ⇒ [ − 1 2 2 − 4 ] v 1 = 0 (\bm{A^TA} - \lambda_1\bm{E})\bm{v_1}=0 \Rarr \begin{bmatrix} -1 & 2 \\ 2 & -4 \end{bmatrix} \bm{v_1}= 0 (ATAλ1E)v1=0[1224]v1=0得到对应特征值 λ 1 = 6 \lambda_1=6 λ1=6的特征向量 v 1 = [ 2 / 5 1 / 5 ] \bm{v_1} =\begin{bmatrix} 2/\sqrt{5} \\ 1/\sqrt{5} \end{bmatrix} v1=[2/5 1/5 ]。同理可得对应特征值 λ 2 = 1 \lambda_2=1 λ2=1的特征向量 v 2 = [ − 1 / 5 2 / 5 ] \bm{v_2} =\begin{bmatrix} -1/\sqrt{5} \\ 2/\sqrt{5} \end{bmatrix} v2=[1/5 2/5 ]
    于是我们得到了矩阵 A T A \bm{A^TA} ATA的特征矩阵 V = [ v 1 , v 2 ] = [ 2 / 5 − 1 / 5 1 / 5 2 / 5 ] \bm{V}=[\bm{v_1,v_2}]=\begin{bmatrix} 2/\sqrt{5} & -1/\sqrt{5} \\ 1/\sqrt{5} & 2/\sqrt{5} \end{bmatrix} V=[v1,v2]=[2/5 1/5 1/5 2/5 ]
    (4)根据矩阵 A A T \bm{AA^T} AAT A T A \bm{A^TA} ATA的特征值分解结果得到矩阵 A \bm{A} A的奇异值分解:
    A = U Σ V T = U [ λ 1 0 0 λ 2 0 0 0 0 ] V T = [ 2 / 30 1 / 5 2 / 6 5 / 30 0 1 / 6 5 / 30 − 2 / 5 − 1 / 6 ] [ 6 0 0 0 1 0 0 0 0 ] [ 2 / 5 1 / 5 − 1 / 5 2 / 5 ] . \bm{A=U \varSigma V^T}=\bm{U} \begin{bmatrix} \sqrt{\lambda_1} & 0 \\ 0 & \sqrt{\lambda_2} & 0 \\ 0 & 0 & 0 \end{bmatrix} \bm{V}^T \\ = \begin{bmatrix} 2/\sqrt{30} & 1/\sqrt{5} & 2/\sqrt{6} \\ 5/\sqrt{30} & 0 & 1/\sqrt{6} \\ 5/\sqrt{30} & -2/\sqrt{5} & -1/\sqrt{6} \end{bmatrix} \begin{bmatrix} \sqrt{6} & 0 & 0\\ 0 & 1 & 0 \\ 0 & 0 & 0 \end{bmatrix} \begin{bmatrix} 2/\sqrt{5} & 1/\sqrt{5} \\ -1/\sqrt{5} & 2/\sqrt{5} \end{bmatrix}. A=UΣVT=Uλ1 000λ2 000VT=2/30 5/30 5/30 1/5 02/5 2/6 1/6 1/6 6 00010000[2/5 1/5 1/5 2/5 ].

4.总结

通过示例2的展示,我们可以看到手算SVD的步骤主要为:
(1)计算矩阵 A A T \bm{AA^T} AAT A T A \bm{A^TA} ATA
(2)计算矩阵 A A T \bm{AA^T} AAT的特征值分解。
(3)计算矩阵 A T A \bm{A^TA} ATA的特征值分解。
(4)根据矩阵 A A T \bm{AA^T} AAT A T A \bm{A^TA} ATA的特征值分解结果得到矩阵 A \bm{A} A的奇异值分解。

但是如果按照上面的算法,使用计算机去计算SVD,就会不可避免地遇到一个问题:计算矩阵的特征值分解时,需要求一元n次多项式方程 ∣ A − λ E ∣ = 0 |\bm{A} - \lambda\bm{E} |=0 AλE=0的解。而计算机通常是直接处理数值数据的,不能像人工计算时那样假设未知数,也就是说计算机是难以通过输入矩阵 A \bm{A} A和数 λ \lambda λ推导出多项式方程 ∣ A − λ E ∣ = 0 |\bm{A} - \lambda\bm{E} |=0 AλE=0的表达式,更不必论之后的求解了。
那么应该使用什么样的数学方法,才能满足计算机计算的特性,使得矩阵可以在计算机上做SVD求解呢?这一问题,我们将在本系列的下一篇文章进行解答。感谢您阅读本篇文章!

你可能感兴趣的:(SVD奇异值分解,机器学习,矩阵,线性代数,算法)