7.2 奇异值分解的基与矩阵
一、奇异值分解
奇异值分解(SVD)是线性代数的高光时刻。 A A A 是一个 m × n m\times n m×n 的矩阵,可以是方阵或者长方形矩阵,秩为 r r r。我们要对角化 A A A,但并不是把它化成 X − 1 A X X^{-1}A X X−1AX 的形式。这是因为 X X X 中的特征向量有三个大问题:它们通常并不正交,并不总是有足够数量的特征向量,并且 A x = λ x A\boldsymbol x=\lambda\boldsymbol x Ax=λx 要求 A A A 是方阵。 A A A 的奇异值向量(Singular vectors)完美的解决了这些问题。
由 SVD 我们可以得到:四个基本子空间合适的基。下面是按照基向量的重要性顺序,来求得这些基向量的步骤。
我们需要有两组奇异值向量 u i \boldsymbol u_i ui 和 v i \boldsymbol v_i vi,其中 u i \boldsymbol u_i ui 在 R m \pmb {\textrm R}^m Rm 中, v i \boldsymbol v_i vi 在 R n \textrm{\pmb R}^n Rn 中,它们将分别是 m × m m\times m m×m 的矩阵 U \pmb U U 和 n × n n\times n n×n 的矩阵 V \pmb V V 的列。下面会先根据这些基向量来描述 SVD,然后再根据正交矩阵 U U U 和 V V V 来描述 SVD。其基本思想是,在行空间中找到一组基标准交向量 v i \boldsymbol v_i vi,然后通过 A v i = σ i u i A\boldsymbol v_i=\sigma_i\boldsymbol u_i Avi=σiui 映射到列空间中的 u i \boldsymbol u_i ui,我们的目标是 v i \boldsymbol v_i vi 是特殊的标准正交向量,映射到 u i \boldsymbol u_i ui 也是标准正交。
(向量角度) u i \boldsymbol u_i ui 和 v j \boldsymbol v_j vj 给出了 A A A 的四个基本子空间的基:
u 1 , u 2 , ⋯ , u r 是 列空间 的标准正交基 u r + 1 , u r + 2 , ⋯ , u m 是 左零空间 N ( A T ) 的标准正交基 v 1 , v 2 , ⋯ , v r 是 行空间 的标准正交基 v r + 1 , v r + 2 , ⋯ , v n 是 零空间 N ( A ) 的标准正交基 \begin{array}{ll}\boldsymbol u_1,\boldsymbol u_2,\cdots,\boldsymbol u_r&是\pmb{列空间}的标准正交基\\\boldsymbol u_{r+1},\boldsymbol u_{r+2},\cdots,\boldsymbol u_m&是\pmb{左零空间\,N(A^T)\,}的标准正交基\\\boldsymbol v_1,\boldsymbol v_2,\cdots,\boldsymbol v_r&是\pmb{行空间}的标准正交基\\\boldsymbol v_{r+1},\boldsymbol v_{r+2},\cdots,\boldsymbol v_n&是\pmb{零空间}\,N(A)\,的标准正交基\end{array} u1,u2,⋯,urur+1,ur+2,⋯,umv1,v2,⋯,vrvr+1,vr+2,⋯,vn是列空间的标准正交基是左零空间N(AT)的标准正交基是行空间的标准正交基是零空间N(A)的标准正交基
这些基向量不仅正交,而且可以对角化矩阵 A A A:
“对角化 A \pmb A A” \kern 20pt A v 1 = σ 1 u 1 , A v 2 = σ 2 u 2 , ⋯ , A v r = σ r u r ( 7.2.1 ) {\color{blue}A\boldsymbol v_1=\sigma_1\boldsymbol u_1,\kern 5ptA\boldsymbol v_2=\sigma_2\boldsymbol u_2,\kern 5pt\cdots,\kern 5ptA\boldsymbol v_r=\sigma_r\boldsymbol u_r}\kern 20pt(7.2.1) Av1=σ1u1,Av2=σ2u2,⋯,Avr=σrur(7.2.1)
这些奇异值 σ 1 , σ 2 , ⋯ , σ r \pmb{\sigma_1,\sigma_2,\cdots,\sigma_r} σ1,σ2,⋯,σr 都是正数, σ i \sigma_i σi 是 A v i A\boldsymbol v_i Avi 的长度。对角矩阵 Σ \Sigma Σ 的对角元素除了奇异值 σ i \sigma_i σi 外都是零。
(矩阵角度)由于 u i \boldsymbol u_i ui 是标准正交的,所以由 r r r 个列向量组成的矩阵 U r U_r Ur 有 U r T U r = I U_r^TU_r=I UrTUr=I,而 v i \boldsymbol v_i vi 也是标准正交的,所以矩阵 V r V_r Vr 有 V r T V r = I V_r^TV_r=I VrTVr=I。则由方程 A v i = σ i u i A\boldsymbol v_i=\sigma_i\boldsymbol u_i Avi=σiui 推出 A V r = U r Σ r \pmb{AV_r=U_r\Sigma_r} AVr=UrΣr 的各列成立: ( m × n ) ( n × r ) A V r = U r Σ r ( m × r ) ( r × r ) A [ v 1 v 2 ⋯ v r ] = [ u 1 u 2 ⋯ u r ] [ σ 1 σ 2 ⋱ σ r ] ( 7.2.2 ) \begin{array}{l}(m\times n)(n\times r)\\\pmb{AV_r=U_r\Sigma_r}\\(m\times r)(r\times r)\end{array}\kern 10ptA\begin{bmatrix}\boldsymbol v_1&\boldsymbol v_2&\cdots&\boldsymbol v_r\end{bmatrix}=\begin{bmatrix}\boldsymbol u_1&\boldsymbol u_2&\cdots&\boldsymbol u_r\end{bmatrix}\begin{bmatrix}\sigma_1\\&\sigma_2\\&&\ddots\\&&&\sigma_r\end{bmatrix}\kern 15pt(7.2.2) (m×n)(n×r)AVr=UrΣr(m×r)(r×r)A[v1v2⋯vr]=[u1u2⋯ur] σ1σ2⋱σr (7.2.2)这个是 SVD 的核心,但是 SVD 并不是只有这些内容。这些 v i \boldsymbol v_i vi 和 u i \boldsymbol u_i ui 可以生成 A A A 的行空间和列空间,还可以从零空间 N ( A ) \pmb N(A) N(A) 和左零空间 N ( A T ) \pmb N(A^T) N(AT) 得到 n − r n-r n−r 个 v j \boldsymbol v_j vj 和 m − r m-r m−r 个 u i \boldsymbol u_i ui,它们也和前面的 v i \boldsymbol v_i vi 和 u i \boldsymbol u_i ui 正交(这是因为四个基本子空间配对正交)。我们现在在 V V V 和 U U U 中包含所有的 v j \boldsymbol v_j vj 和 u i \boldsymbol u_i ui,这两个矩阵就变成了方阵,仍然有 A V = U Σ \pmb{AV=U\Sigma} AV=UΣ。 ( m × n ) ( n × n ) A V = U Σ ( m × m ) ( m × n ) A [ v 1 ⋯ v r ⋯ v n ] = [ u 1 ⋯ u r ⋯ u m ] [ σ 1 σ 2 ⋱ σ r ] ( 7.2.3 ) \begin{array}{l}(m\times n)(n\times n)\\\pmb{AV=U\Sigma}\\(m\times m)(m\times n)\end{array}\kern 10ptA\begin{bmatrix}\boldsymbol v_1&\cdots&\boldsymbol v_r&\cdots&\boldsymbol v_n\end{bmatrix}=\begin{bmatrix}\boldsymbol u_1&\cdots&\boldsymbol u_r&\cdots&\boldsymbol u_m\end{bmatrix}\begin{bmatrix}\sigma_1\\&\sigma_2\\&&\ddots\\&&&\sigma_r\\&\end{bmatrix}\kern 15pt(7.2.3) (m×n)(n×n)AV=UΣ(m×m)(m×n)A[v1⋯vr⋯vn]=[u1⋯ur⋯um] σ1σ2⋱σr (7.2.3)新的 Σ \Sigma Σ 是 m × n m\times n m×n 的矩阵,它是(7.3.2)中的 r × r r\times r r×r 矩阵下面添加 m − r m-r m−r 个零行,右侧添加 n − r n-r n−r 个零列。真正的变化是 U U U 和 V V V 的形状,它们变成了方阵,并且有 V − 1 = V T V^{-1}=V^T V−1=VT,所以 A V = U Σ AV=U\Sigma AV=UΣ 就变成了 A = U Σ V T \pmb{A=U\Sigma V^T} A=UΣVT,这个就是奇异值分解(Singular Value Decompositon),可以用 U Σ U\Sigma UΣ 中的列 u i σ i \boldsymbol u_i\sigma_i uiσi 乘上 V T V^T VT 的行:
SVD A = U Σ V T = u 1 σ 1 v 1 T + u 2 σ 2 v 2 T + ⋯ + u r σ r v r T ( 7.2.4 ) \kern 30pt{\color{blue}A=U\Sigma V^T=\boldsymbol u_1\sigma_1\boldsymbol v_1^T+\boldsymbol u_2\sigma_2\boldsymbol v_2^T+\cdots+\boldsymbol u_r\sigma_r\boldsymbol v_r^T}\kern 20pt(7.2.4) A=UΣVT=u1σ1v1T+u2σ2v2T+⋯+urσrvrT(7.2.4)
式(7.3.2)是 “缩略版的 SVD(reduced SVD)”,它只包含行空间和列空间的基,式(7.3.3)是完整版的 SVD,它将零空间的基也包含了进去。这两个式子都是将 A A A 分解成同样的 r r r 个秩一矩阵 u i σ r v i T \boldsymbol u_i\sigma_r\boldsymbol v_i^T uiσrviT 的和。列乘行是矩阵乘法的第四种方式。
我们后面能够看到每个 σ i 2 \sigma_i^2 σi2 既是 A T A A^TA ATA 的特征值,也是 A A T AA^T AAT 的特征值。我们将奇异值按照降序排列: σ 1 ≥ σ 2 ≥ ⋯ ≥ σ r > 0 \sigma_1\geq\sigma_2\geq\cdots\geq\sigma_r>0 σ1≥σ2≥⋯≥σr>0,式(7.2.4)中的分解就是按照重要性顺序得到的 A A A 的 r r r 个秩一项,这一点非常重要。
【例1】什么时候 A = U Σ V T A=U\Sigma V^T A=UΣVT(奇异值)和 X Λ X − 1 X\Lambda X^{-1} XΛX−1 相同(特征值)?
解: A A A 的特征向量需要标准正交,才有 X = U = V X=U=V X=U=V,如果 A = Σ A=\Sigma A=Σ,也需要特征值 λ ≥ 0 \lambda\geq0 λ≥0,所以 A A A 必须是一个半正定(或正定)的对称矩阵。只有这样,才会有 A = X Λ X − 1 A=X\Lambda X^{-1} A=XΛX−1,就是 Q Λ Q T Q\Lambda Q^{T} QΛQT 和 A = U Σ V T A=U\Sigma V^{T} A=UΣVT 一致。
【例2】如果 A = x y T A=\boldsymbol x \boldsymbol y^T A=xyT(秩一),其中 x \boldsymbol x x 和 y \boldsymbol y y 都是单位向量,那么 A A A 的 SVD 是什么?
解: 式(7.2.2)中缩略版的 SVD 就是 x y T \boldsymbol x\boldsymbol y^T xyT,秩为 r = 1 r=1 r=1,其中 u 1 = x \boldsymbol u_1=\boldsymbol x u1=x, v 1 = y \boldsymbol v_1=\boldsymbol y v1=y 且 σ 1 = 1 \sigma_1=1 σ1=1。完全版的 SVD,要将 u 1 = x \boldsymbol u_1=\boldsymbol x u1=x 扩充为标准正交基 u i \boldsymbol u_i ui,然后将 v 1 = y \boldsymbol v_1=\boldsymbol y v1=y 扩充为标准正交基 v j \boldsymbol v_j vj,没有新的 σ \sigma σ,只有一个 σ 1 = 1 \sigma_1=1 σ1=1。
二、SVD 的证明
我们需要知道这令人惊叹的 u i \boldsymbol u_i ui 和 v j \boldsymbol v_j vj 是如何构造出来的。 v j \boldsymbol v_j vj 是 A T A \pmb{A^TA} ATA 的特征向量,这个一定是正确的,因为我们的目标是: A T A = ( U Σ V T ) T ( U Σ V T ) = V Σ T U T U Σ V T = V Σ T Σ V T ( 7.2.5 ) \pmb{A^TA}=(U\Sigma V^T)^T(U\Sigma V^T)=V\Sigma^TU^TU\Sigma V^T=\pmb{V\Sigma^T\Sigma V^T}\kern 20pt(7.2.5) ATA=(UΣVT)T(UΣVT)=VΣTUTUΣVT=VΣTΣVT(7.2.5)右侧包含了对称(半)正定矩阵 A T A A^TA ATA 的特征向量矩阵 V V V,并且 ( Σ T Σ ) (\Sigma^T\Sigma) (ΣTΣ) 是 ( A T A ) (A^TA) (ATA) 的特征值矩阵:每个 σ 2 \sigma^2 σ2 就是 ( A T A ) (A^TA) (ATA) 特征值 λ ( A T A ) \lambda(A^TA) λ(ATA)!
现在由 A v i = σ i u i A\boldsymbol v_i=\sigma_i\boldsymbol u_i Avi=σiui 可以得到单位向量 u 1 , u 2 , ⋯ , u r \boldsymbol u_1,\boldsymbol u_2,\cdots,\boldsymbol u_r u1,u2,⋯,ur,这就是关键的式(7.2.1),核心点,也就是 SVD 成功的全部原因,是这些单位向量 u 1 , u 2 , ⋯ , u r \boldsymbol u_1,\boldsymbol u_2,\cdots,\boldsymbol u_r u1,u2,⋯,ur 一定是两两正交(因为 v i \boldsymbol v_i vi 是正交的): 关键步骤 i ≠ j u i T u j = ( A v i σ i ) T ( A v j σ j ) = v i T A T A v j σ i σ j = σ j 2 σ i σ j v i T v j = 0 ( 7.2.6 ) \begin{array}{}\pmb{关键步骤}\\\pmb{i\neq j}\end{array}\kern 20pt\boldsymbol u_i^T\boldsymbol u_j=(\frac{A\boldsymbol v_i}{\sigma_i})^T(\frac{A\boldsymbol v_j}{\sigma_j})=\frac{\boldsymbol v_i^TA^TA\boldsymbol v_j}{\sigma_i\sigma_j}=\frac{\sigma_j^2}{\sigma_i\sigma_j}\boldsymbol v_i^T\boldsymbol v_j=0\kern 20pt(7.2.6) 关键步骤i=juiTuj=(σiAvi)T(σjAvj)=σiσjviTATAvj=σiσjσj2viTvj=0(7.2.6) v i \boldsymbol v_i vi 是 A T A A^TA ATA(对称)的特征向量,它们是正交的并且得到 u i \boldsymbol u_i ui 也是正交的。实际上 u i \boldsymbol u_i ui 是 A A T AA^T AAT 的特征向量。
最终,在 v j \boldsymbol v_j vj 和 u i \boldsymbol u_i ui 的基础上分别构造出了零空间 N ( A ) \pmb N(A) N(A) 和 左零空间 N ( A T ) \pmb N(A^T) N(AT) 的标准正交基,得到 n n n 个 v j \boldsymbol v_j vj 和 m m m 个 u i \boldsymbol u_i ui,得到 A = U Σ V T A=U\Sigma V^T A=UΣVT 中的 V , Σ V,\Sigma V,Σ 和 U U U。
三、SVD 的一个例子
下例演示了 A = U Σ V T A=U\Sigma V^T A=UΣVT 中全部三个矩阵的计算过程。
【例3】矩阵 A = [ 3 0 4 5 ] A=\begin{bmatrix}3&0\\4&5\end{bmatrix} A=[3405],秩为 r = 2 r=2 r=2,求出对应的矩阵 U , Σ , V U,\Sigma,V U,Σ,V。
解: 由于秩 r = 2 r=2 r=2,所以 A A A 有两个正的奇异值 σ 1 \sigma_1 σ1 和 σ 2 \sigma_2 σ2,下面会看到 σ 1 \sigma_1 σ1 比特征值 λ m a x = 5 \lambda_{max}=5 λmax=5 更大, σ 2 \sigma_2 σ2 比特征值 λ m i n = 3 \lambda_{min}=3 λmin=3 要更小,先从 A T A A^TA ATA 和 A A T AA^T AAT 开始: A T A = [ 25 20 20 25 ] A A T = [ 9 12 12 41 ] A^TA=\begin{bmatrix}25&20\\20&25\end{bmatrix}\kern 20ptAA^T=\begin{bmatrix}\kern 4pt9&12\\12&41\end{bmatrix} ATA=[25202025]AAT=[9121241]它们有相同的迹 ( 50 ) (50) (50) 和相同的特征值 σ 1 2 = 45 \sigma_1^2=45 σ12=45 和 σ 2 2 = 5 \sigma_2^2=5 σ22=5,取算术平方根得 σ 1 = 45 \sigma_1=\pmb{\sqrt{45}} σ1=45 和 σ 2 = 5 \sigma_2=\pmb{\sqrt5} σ2=5,则 σ 1 σ 2 = 15 \sigma_1\sigma_2=15 σ1σ2=15,也就是 A A A 的行列式。
关键步骤是求 A T A A^TA ATA 的特征向量(分别对应特征值 45 45 45 和 5 5 5): [ 25 20 20 25 ] [ 1 1 ] = 45 [ 1 1 ] [ 25 20 20 25 ] [ − 1 1 ] = 5 [ − 1 1 ] \begin{bmatrix}25&20\\20&25\end{bmatrix}\begin{bmatrix}1\\1\end{bmatrix}=\pmb{45}\begin{bmatrix}1\\1\end{bmatrix}\kern 20pt\begin{bmatrix}25&20\\20&25\end{bmatrix}\begin{bmatrix}-1\\\kern 7pt1\end{bmatrix}=\pmb5\begin{bmatrix}-1\\\kern 7pt1\end{bmatrix} [25202025][11]=45[11][25202025][−11]=5[−11]然后将这些正交特征向量单位化,都除以 2 \sqrt2 2,即得到 v 1 \boldsymbol v_1 v1 和 v 2 \boldsymbol v_2 v2。 右奇异向量 v 1 = 1 2 [ 1 1 ] v 2 = 1 2 [ − 1 1 ] 左奇异向量 u i = A v i σ i \pmb{右奇异向量}\kern 10pt\boldsymbol v_1=\frac{1}{\sqrt2}\begin{bmatrix}1\\1\end{bmatrix}\kern 5pt\boldsymbol v_2=\frac{1}{\sqrt2}\begin{bmatrix}-1\\\kern 7pt1\end{bmatrix}\kern 10pt\pmb{左奇异向量}\kern 5pt\boldsymbol u_i=\frac{A\boldsymbol v_i}{\sigma_i} 右奇异向量v1=21[11]v2=21[−11]左奇异向量ui=σiAvi现在计算 A v 1 A\boldsymbol v_1 Av1 和 A v 2 A\boldsymbol v_2 Av2,它们分别是 σ 1 u 1 = 45 u 1 \sigma_1\boldsymbol u_1=\sqrt{45}\boldsymbol u_1 σ1u1=45u1 和 σ 2 u 2 = 5 u 2 \sigma_2\boldsymbol u_2=\sqrt5\boldsymbol u_2 σ2u2=5u2: A v 1 = 3 2 [ 1 3 ] = 45 1 10 [ 1 3 ] = σ 1 u 1 A v 2 = 1 2 [ − 3 1 ] = 5 1 10 [ − 3 1 ] = σ 2 u 2 \begin{array}{l}A\boldsymbol v_1=\displaystyle\frac{3}{\sqrt2}\begin{bmatrix}1\\3\end{bmatrix}=\sqrt{45}\pmb{\frac{1}{\sqrt{10}}\begin{bmatrix}1\\3\end{bmatrix}}=\sigma_1\boldsymbol u_1\\\\A\boldsymbol v_2=\displaystyle\frac{1}{\sqrt2}\begin{bmatrix}-3\\\kern 7pt1\end{bmatrix}=\sqrt5\pmb{\frac{1}{\sqrt{10}}\begin{bmatrix}-3\\\kern 7pt1\end{bmatrix}}=\sigma_2\boldsymbol u_2\end{array} Av1=23[13]=45101[13]=σ1u1Av2=21[−31]=5101[−31]=σ2u2除以 10 \sqrt{10} 10 使得 u 1 \boldsymbol u_1 u1 和 u 2 \boldsymbol u_2 u2 标准正交,然后可以得到预期的 σ 1 = 45 \sigma_1=\sqrt{45} σ1=45 和 σ 2 = 5 \sigma_2=\sqrt5 σ2=5。 A A A 的奇异值分解就是 U Σ V T U\Sigma V^T UΣVT。
U = 1 10 [ 1 − 3 3 1 ] Σ = [ 45 5 ] V = 1 2 [ 1 − 1 1 1 ] ( 7.2.7 ) \pmb U=\frac{1}{\sqrt{10}}\begin{bmatrix}1&-3\\3&\kern 7pt1\end{bmatrix}\kern 15pt\pmb\Sigma=\begin{bmatrix}\sqrt{45}\\&\sqrt5\end{bmatrix}\kern 15pt\pmb V=\frac{1}{\sqrt2}\begin{bmatrix}1&-1\\1&\kern 7pt1\end{bmatrix}\kern 20pt(7.2.7) U=101[13−31]Σ=[455]V=21[11−11](7.2.7)
U U U 和 V V V 包含列空间和行空间(两个空间都是 R 2 \pmb{\textrm R}^2 R2)的标准正交基。真正要做的是使用两组基对角化 A A A: A V = U Σ AV=U\Sigma AV=UΣ。矩阵 A A A 分解成了两个秩一矩阵(列乘行)的组合: σ 1 u 1 v 1 T + σ 2 u 2 v 2 T = 45 20 [ 1 1 3 3 ] + 5 20 [ 3 − 3 − 1 1 ] = [ 3 0 4 5 ] = A \sigma_1\boldsymbol u_1\boldsymbol v_1^T+\sigma_2\boldsymbol u_2\boldsymbol v_2^T=\pmb{\frac{\sqrt{45}}{\sqrt{20}}\begin{bmatrix}1&1\\3&3\end{bmatrix}+\frac{\sqrt5}{\sqrt{20}}\begin{bmatrix}\kern 7pt3&-3\\-1&\kern 7pt1\end{bmatrix}}=\begin{bmatrix}3&0\\4&5\end{bmatrix}=A σ1u1v1T+σ2u2v2T=2045[1313]+205[3−1−31]=[3405]=A
四、一个极端的矩阵
下面是一个阶数更大的矩阵的例子,它的 u i \boldsymbol u_i ui 和 v i \boldsymbol v_i vi 都是单位矩阵的列,所以计算很简单,但是要注意列的顺序。矩阵 A A A 非常的不平衡(它是一个严格的三角形矩阵),它所有的特征值都为零, A A T AA^T AAT 和 A T A A^TA ATA 并不接近,矩阵 U U U 和 V V V 是置换矩阵可以弥补这些问题。 A = [ 0 1 0 0 0 0 2 0 0 0 0 3 0 0 0 0 ] 特征值 λ = 0 , 0 , 0 , 0 全是零! 只有一个特征向量 ( 1 , 0 , 0 , 0 ) 奇异值 σ = 3 , 2 , 1 奇异向量是 I 的列 A=\begin{bmatrix}0&\pmb1&0&0\\0&0&\pmb2&0\\0&0&0&\pmb3\\0&0&0&0\end{bmatrix}\kern 20pt\begin{array}{l}特征值\,\lambda=0,0,0,0\,全是零!\\只有一个特征向量\,(1,0,0,0)\\奇异值\,\sigma=\pmb3,\pmb2,\pmb1\\奇异向量是\,I\,的列\end{array} A= 0000100002000030 特征值λ=0,0,0,0全是零!只有一个特征向量(1,0,0,0)奇异值σ=3,2,1奇异向量是I的列 A T A A^TA ATA 和 A A T AA^T AAT 都是对角矩阵(有简单的特征向量,但是顺序不同): A T A = [ 0 0 0 0 0 1 0 0 0 0 4 0 0 0 0 9 ] A A T = [ 1 0 0 0 0 4 0 0 0 0 9 0 0 0 0 0 ] A^TA=\begin{bmatrix}\pmb0&0&0&0\\0&\pmb1&0&0\\0&0&\pmb4&0\\0&0&0&\pmb9\end{bmatrix}\kern 20ptAA^T=\begin{bmatrix}\pmb1&0&0&0\\0&\pmb4&0&0\\0&0&\pmb9&0\\0&0&0&\pmb0\end{bmatrix} ATA= 0000010000400009 AAT= 1000040000900000 它们的特征向量( u i \boldsymbol u_i ui 对应 A A T AA^T AAT, v i \boldsymbol v_i vi 对应 A T A A^TA ATA)按照特征值减小的顺序 σ 1 2 > σ 2 2 > σ 3 2 \sigma_1^2>\sigma_2^2>\sigma_3^2 σ12>σ22>σ32 排列,这些特征值是 9 , 4 , 1 9,4,1 9,4,1。 U = [ 0 0 1 0 0 1 0 0 1 0 0 0 0 0 0 1 ] Σ = [ 3 2 1 0 ] V = [ 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 ] \pmb U=\begin{bmatrix}0&0&\pmb1&0\\0&\pmb1&0&0\\\pmb1&0&0&0\\0&0&0&\pmb1\end{bmatrix}\kern 15pt\Sigma=\begin{bmatrix}\pmb3\\&\pmb2\\&&\pmb1\\&&&0\end{bmatrix}\kern 15pt\pmb V=\begin{bmatrix}0&0&0&\pmb1\\0&0&\pmb1&0\\0&\pmb1&0&0\\\pmb1&0&0&0\end{bmatrix} U= 0010010010000001 Σ= 3210 V= 0001001001001000 U \pmb U U 和 V \pmb V V 的第一列 u 1 \boldsymbol u_1 u1 和 v 1 \boldsymbol v_1 v1 的分量 1 1 1 在第 3 3 3 位和第 4 4 4 位,则 u 1 σ 1 v 1 T \boldsymbol u_1\sigma_1\boldsymbol v_1^T u1σ1v1T 就表示矩阵 A A A 中最大的数 A 34 A_{34} A34,对于这个极端的例子,SVD 的三个秩一矩阵恰好来自于 A A A 中的数字 3 , 2 , 1 3,2,1 3,2,1。
A = U Σ V T = 3 u 1 v 1 T + 2 u 2 v 2 T + 1 u 3 v 3 T \pmb{A=U\Sigma V^T=3\boldsymbol u_1\boldsymbol v_1^T+2\boldsymbol u_2\boldsymbol v_2^T+1\boldsymbol u_3\boldsymbol v_3^T} A=UΣVT=3u1v1T+2u2v2T+1u3v3T
注:假设将 A A A 的最后一行(全零行)去掉,则 A A A 是一个 3 × 4 3\times4 3×4 的矩阵, A A T AA^T AAT 是 3 × 3 3\times3 3×3 的矩阵 —— 它的第四行和第四列都会消失, A T A A^TA ATA 和 A A T AA^T AAT 的特征值仍然是 λ = 1 , 4 , 9 \lambda=1,4,9 λ=1,4,9,也会在 Σ \Sigma Σ 中得到相同的奇异值 σ = 3 , 2 , 1 \sigma=3,2,1 σ=3,2,1。
A A A 的最后一行的全零行移除后,现在变成了 3 × 4 3\times4 3×4 的矩阵,也会移除 Σ \Sigma Σ 的最后一行和 U U U 的最后一列。则 ( 3 × 4 ) = U Σ V T = ( 3 × 3 ) ( 3 × 4 ) ( 4 × 4 ) (3\times4)=U\Sigma V^T=(3\times3)(3\times4)(4\times4) (3×4)=UΣVT=(3×3)(3×4)(4×4),SVD 完全适用于长方形矩阵。
一件好的事情是,由于矩阵 A A A 的行和列经常有完全不同的含义(如电子表格),如果要统计所有课程的成绩,那么可以用各列表示每个学生的情况,而各行表示每个课程的情况:则元素 a i j a_{ij} aij 就表示成绩。那么 σ 1 u 1 v 1 T \sigma_1\boldsymbol u_1\boldsymbol v_1^T σ1u1v1T 中, u 1 = \boldsymbol u_1= u1= 课程组合, v 1 = \boldsymbol v_1= v1= 学生组合,而 σ 1 \sigma_1 σ1 就是这些组合的成绩:最高成绩。
矩阵 A A A 也可以对一本杂志中关键词的出现频率计数: A A A 的列是不同的文章,每一行代表不同的词,那么 A A A 就是整个杂志的索引,其中最重要的信息就是 σ 1 u 1 v 1 T \sigma_1\boldsymbol u_1\boldsymbol v_1^T σ1u1v1T, σ 1 \sigma_1 σ1 就是高频词 u 1 \boldsymbol u_1 u1 在高频文章 v 1 \boldsymbol v_1 v1 出现的最高的频率。
五、奇异值的稳定性对比特征值的不稳定性
通过 4 × 4 4\times4 4×4 的矩阵 A A A 这个例子(一个极端情况)我们可以构造出一个特征值不稳定的例子。假设 ( 4 , 1 ) (4,1) (4,1) 元素从零变为 1 / 60000 1/60000 1/60000,这个几乎没有变化,秩变成了 4 4 4。 A = [ 0 1 0 0 0 0 2 0 0 0 0 3 1 60000 0 0 0 ] 仅仅是 1 / 60000 的微小改变, A 的特征值就发生了很大的变化: λ = 0 , 0 , 0 , 0 变为了 λ = 1 10 , i 10 , − 1 10 , − i 10 A=\begin{bmatrix}0&1&0&0\\0&0&2&0\\0&0&0&3\\\displaystyle\frac{1}{60000}&0&0&0\end{bmatrix}\kern 20pt\begin{array}{l}仅仅是\,1/60000\,的微小改变,A\\的特征值就发生了很大的变化:\\\lambda=0,0,0,0\,变为了\,\pmb{\lambda=\displaystyle\frac{1}{10},\frac{i}{10},\frac{-1}{10},\frac{-i}{10}}\end{array} A= 000600001100002000030 仅仅是1/60000的微小改变,A的特征值就发生了很大的变化:λ=0,0,0,0变为了λ=101,10i,10−1,10−i新元素仅仅变化了 1 / 60000 1/60000 1/60000,四个特征值就从零变化到了在复平面上以原点为圆心,半径为 1 10 \displaystyle\frac{1}{10} 101 的圆上,这表明当 A T A A^TA ATA 远离 A A T AA^T AAT 时特征值严重的不稳定性,在另外的极端情况下,如果 A T A = A A T A^TA=AA^T ATA=AAT(“正规矩阵”),那么 A A A 的特征向量正交且 A A A 的特征值完全稳定。
对比之下,任意矩阵的奇异值都是稳定的,它们不会超过 A A A 的变化。在这个例子中,新的奇异值是 3 , 2 , 1 \pmb{3,2,1} 3,2,1 和 1 / 60000 \pmb{1/60000} 1/60000,矩阵 U U U 和 V V V 保持不变, A A A 的 SVD 中的第四项是 σ 4 u 4 v 4 T \sigma_4\boldsymbol u_4\boldsymbol v_4^T σ4u4v4T,它有十五个零元素和一个小的元素 σ 4 = 1 / 60000 \sigma_4=1/60000 σ4=1/60000。
六、A 的奇异向量和 S = A T A S=A^TA S=ATA 的特征向量
式(7.2.5-7.2.6)同时证明了 SVD,奇异向量 v i \boldsymbol v_i vi 是 S = A T A S=A^TA S=ATA 的特征向量 q i \boldsymbol q_i qi。 S S S 的特征值 λ i \lambda_i λi 和 A A A 相应的奇异值的平方 σ i 2 \sigma_i^2 σi2 相等, S S S 的秩 r r r 等于 A A A 的秩。特征向量和奇异向量的展开式是完美对应的。
对称矩阵 S S = Q Λ Q T = λ 1 q 1 q 1 T + λ 2 q 2 q 2 T + ⋯ + λ r q r q r T 任意矩阵 A A = U Σ V T = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + ⋯ + σ r u r v r T \begin{array}{l}\pmb{对称矩阵\,S}\kern 25pt\color{blue}S=Q\Lambda Q^T=\lambda_1\boldsymbol q_1\boldsymbol q_1^T+\lambda_2\boldsymbol q_2\boldsymbol q_2^T+\cdots+\lambda_r\boldsymbol q_r\boldsymbol q_r^T\\\pmb{任意矩阵\,A}\kern 23pt\color{blue}A=U\Sigma V^T=\sigma_1\boldsymbol u_1\boldsymbol v_1^T+\sigma_2\boldsymbol u_2\boldsymbol v_2^T+\cdots+\sigma_r\boldsymbol u_r\boldsymbol v_r^T\end{array} 对称矩阵SS=QΛQT=λ1q1q1T+λ2q2q2T+⋯+λrqrqrT任意矩阵AA=UΣVT=σ1u1v1T+σ2u2v2T+⋯+σrurvrT
各个 q i \boldsymbol q_i qi 是正交的,各个 u i \boldsymbol u_i ui 是正交的,各个 v i \boldsymbol v_i vi 也是正交的,非常漂亮!
但是还要更深入理解,有以下两个原因:其一是要弥补特征值部分的短板, 如果 λ \lambda λ 是 S S S 的二重特征值,我们能够且一定可以找出两个标准正交的向量。另一个原因是要明白 SVD 是如何选出在 σ 2 u 2 v 2 T \sigma_2\boldsymbol u_2\boldsymbol v_2^T σ2u2v2T 之前的最大项 σ 1 u 1 v 1 T \sigma_1\boldsymbol u_1\boldsymbol v_1^T σ1u1v1T。需要理解的是 S S S 的特征值 λ \lambda λ 和 A A A 的奇异值 σ \sigma σ,而不只是求出它们。
从 S S S 最大的特征值 λ 1 \lambda_1 λ1 开始,它解决了下面的这个问题:
λ 1 = max x T S x x T x \pmb{\lambda_1=\textrm{max}\,\displaystyle\frac{\boldsymbol x^TS\boldsymbol x}{\boldsymbol x^T\boldsymbol x}} λ1=maxxTxxTSx,这个向量是 x = q 1 \boldsymbol x=\boldsymbol q_1 x=q1,且 S q 1 = λ 1 q 1 S\boldsymbol q_1=\lambda_1\boldsymbol q_1\kern 20pt Sq1=λ1q1(7.2.8)
\,
对比 A A A 最大的奇异值 σ 1 \sigma_1 σ1,它解决的这个问题是:
σ 1 = max ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ \pmb{\sigma_1=\max\displaystyle\frac{||A\boldsymbol x||}{||\boldsymbol x||}} σ1=max∣∣x∣∣∣∣Ax∣∣,这个向量是 x = v 1 \boldsymbol x=\boldsymbol v_1 x=v1 且 A v 1 = σ 1 u 1 A\boldsymbol v_1=\sigma_1\boldsymbol u_1\kern 20pt Av1=σ1u1(7.2.9)
从式(7.2.8)可以推出(7.2.9),由于 S = A T A S=A^TA S=ATA,所以 x T S x x T x = x T A T A x x T x = ( A x ) T ( A x ) x T x = ∣ ∣ A x ∣ ∣ 2 ∣ ∣ x ∣ ∣ 2 = σ 2 \displaystyle\frac{\boldsymbol x^TS\boldsymbol x}{\boldsymbol x^T\boldsymbol x}=\frac{\boldsymbol x^TA^TA\boldsymbol x}{\boldsymbol x^T\boldsymbol x}=\frac{(A\boldsymbol x)^T(A\boldsymbol x)}{\boldsymbol x^T\boldsymbol x}=\frac{||A\boldsymbol x||^2}{||\boldsymbol x||^2}=\sigma^2 xTxxTSx=xTxxTATAx=xTx(Ax)T(Ax)=∣∣x∣∣2∣∣Ax∣∣2=σ2。
这个一次找到一个值的方法也可以适用于 λ 2 \lambda_2 λ2 和 σ 2 \sigma_2 σ2,但是并不是任意的 x \boldsymbol x x 都可以:
λ 2 = max x T S x x T x \pmb{\lambda_2=\max\displaystyle\frac{\boldsymbol x^TS\boldsymbol x}{\boldsymbol x^T\boldsymbol x}} λ2=maxxTxxTSx,其中 x \boldsymbol x x 满足 q 1 T x = 0 \boldsymbol q_1^T\boldsymbol x=0 q1Tx=0,最大的是 x = q 2 \boldsymbol x=\boldsymbol q_2\kern 20pt x=q2(7.2.10)
\,
σ 2 = max ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ \pmb{\sigma_2=\max\displaystyle\frac{||A\boldsymbol x||}{||\boldsymbol x||}} σ2=max∣∣x∣∣∣∣Ax∣∣,其中 x \boldsymbol x x 满足 v 1 T x = 0 \boldsymbol v_1^T\boldsymbol x=0 v1Tx=0,最大的是 x = v 2 \boldsymbol x=\boldsymbol v_2\kern 20pt x=v2(7.2.11)
当 S = A T A S=A^TA S=ATA 时,可以得到 λ 1 = σ 1 2 \lambda_1=\sigma_1^2 λ1=σ12 和 λ 2 = σ 2 2 \lambda_2=\sigma_2^2 λ2=σ22,为什么这个方法会成功呢?
从比值 r ( x ) = x T S x x T x r(\boldsymbol x)=\displaystyle\frac{\boldsymbol x^TS\boldsymbol x}{\boldsymbol x^T\boldsymbol x} r(x)=xTxxTSx 开始,这个称为瑞利商(Rayleigh quotient),要求 r ( x ) r(\boldsymbol x) r(x) 的最大值,要令其偏导数为零: ∂ r ∂ x i = 0 , i = 1 , 2 , ⋯ , n \displaystyle\frac{\partial r}{\partial x_i}=0,i=1,2,\cdots,n ∂xi∂r=0,i=1,2,⋯,n。这些导数的求解比较困难,下面是结果:瑞利商最大时的向量 x \boldsymbol x x: 当 S x = r ( x ) x 时, r ( x ) = x T S x x T x 的偏导数全为零 ( 7.2.12 ) 当\,S\boldsymbol x=r(\boldsymbol x)\boldsymbol x\,时,\pmb{r(\boldsymbol x)=\frac{\boldsymbol x^TS\boldsymbol x}{\boldsymbol x^T\boldsymbol x}\,的偏导数全为零}\kern 20pt(7.2.12) 当Sx=r(x)x时,r(x)=xTxxTSx的偏导数全为零(7.2.12)所以向量 x \boldsymbol x x 是 S S S 的特征向量,最大的比值 r ( x ) r(\boldsymbol x) r(x) 就是 S S S 最大的特征值 λ 1 \lambda_1 λ1。下面转而讨论 A A A —— 注意它和 S = A T A S=A^TA S=ATA 的联系! 最大化 ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ ,也会最大化 ( ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ ) 2 = x T A T A x x T x = x T S x x x 最大化\,\frac{||A\boldsymbol x||}{||\boldsymbol x||},也会最大化\,\Big(\frac{||A\boldsymbol x||}{||\boldsymbol x||}\Big)^2=\frac{\boldsymbol x^TA^TA\boldsymbol x}{\boldsymbol x^T\boldsymbol x}=\frac{\boldsymbol x^TS\boldsymbol x}{\boldsymbol x\boldsymbol x} 最大化∣∣x∣∣∣∣Ax∣∣,也会最大化(∣∣x∣∣∣∣Ax∣∣)2=xTxxTATAx=xxxTSx所以式(7.2.9)中 x = v 1 \boldsymbol x=\boldsymbol v_1 x=v1 与式(7.2.8)中 S = A T A S=A^TA S=ATA 最前面的特征向量 q 1 \boldsymbol q_1 q1 相同。
下面解释为什么式(7.2.10)和(7.2.11)中的向量为什么是 q 2 \boldsymbol q_2 q2 和 v 2 \boldsymbol v_2 v2。它们分别与 q 1 \boldsymbol q_1 q1 和 v 1 \boldsymbol v_1 v1 正交,因此是在考虑范围内。
任意的正交向量 Q 1 Q_1 Q1 的首列是 q 1 \boldsymbol q_1 q1,剩余的 n − 1 n-1 n−1 个标准正交列都与 q 1 \boldsymbol q_1 q1 正交,使用 S q 1 = λ 1 q 1 S\boldsymbol q_1=\lambda_1\boldsymbol q_1 Sq1=λ1q1: S Q 1 = S [ q 1 q 2 ⋯ q n ] = [ q 1 q 2 ⋯ q n ] [ λ 1 w T 0 S n − 1 ] = Q 1 [ λ 1 w T 0 S n − 1 ] ( 7.2.13 ) SQ_1=S\begin{bmatrix}\boldsymbol q_1&\boldsymbol q_2&\cdots&\boldsymbol q_n\end{bmatrix}=\begin{bmatrix}\boldsymbol q_1&\boldsymbol q_2&\cdots&\boldsymbol q_n\end{bmatrix}\begin{bmatrix}\lambda_1&\boldsymbol w^T\\\boldsymbol 0&S_{n-1}\end{bmatrix}=Q_1\begin{bmatrix}\lambda_1&\boldsymbol w^T\\\boldsymbol 0&S_{n-1}\end{bmatrix}\kern 15pt(7.2.13) SQ1=S[q1q2⋯qn]=[q1q2⋯qn][λ10wTSn−1]=Q1[λ10wTSn−1](7.2.13)其中 w T \boldsymbol w^T wT 表示的是 S S S 作用于 q 1 \boldsymbol q_1 q1, S n − 1 S_{n-1} Sn−1 是降维后的矩阵,利用矩阵的乘法,将它们乘开,第一列即 λ 1 q 1 \lambda_1\boldsymbol q_1 λ1q1,后面的即为 w T q 1 + S n − 1 [ q 2 ⋯ q n ] \boldsymbol w^T\boldsymbol q_1+S_{n-1}\begin{bmatrix}\boldsymbol q_2&\cdots&\boldsymbol q_n\end{bmatrix} wTq1+Sn−1[q2⋯qn]。再用 Q 1 T Q_1^T Q1T 左乘上式,注意到 Q 1 T Q 1 = I Q_1^TQ_1=I Q1TQ1=I,且 Q 1 T S Q 1 Q_1^TSQ_1 Q1TSQ1 是像 S S S 一样的对称矩阵: 对称矩阵 Q 1 T S Q 1 = [ λ 1 w T 0 S n − 1 ] 将强制 w = 0 且 S n − 1 T = S n − 1 对称矩阵\,Q_1^TSQ_1=\begin{bmatrix}\lambda_1&\boldsymbol w^T\\\boldsymbol 0&S_{n-1}\end{bmatrix}将强制\,\boldsymbol w=\boldsymbol 0\,且\,S^T_{n-1}=S_{n-1} 对称矩阵Q1TSQ1=[λ10wTSn−1]将强制w=0且Sn−1T=Sn−1根据条件 q 1 T x = 0 \boldsymbol q_1^T\boldsymbol x=0 q1Tx=0 将问题(7.2.10)的最大值问题简化成了 n − 1 n-1 n−1 阶的情况, S n − 1 S_{n-1} Sn−1 最大的特征值将是 S S S 的第二大特征值,就是 λ 2 \lambda_2 λ2,式(7.2.10)中的向量是特征向量 q 2 \boldsymbol q_2 q2 且 S q 2 = λ 2 q 2 S\boldsymbol q_2=\lambda_2\boldsymbol q_2 Sq2=λ2q2。
继续下去,或者使用数学归纳法,就可以得到所有的特征向量 q 1 , q 2 , ⋯ , q 2 \boldsymbol q_1,\boldsymbol q_2,\cdots,\boldsymbol q_2 q1,q2,⋯,q2 和它们对应的特征值 λ 1 , λ 2 , ⋯ λ n \lambda_1,\lambda_2,\cdots\,\lambda_n λ1,λ2,⋯λn,即使存在重复的特征值,谱定理 S = Q Λ Q T S=Q\Lambda Q^T S=QΛQT 也可以被证明。所有的对称矩阵都可被对角化。
类似的,SVD 可以从式(7.2.9)和(7.2.11)中一步一步的得到。下面有一个很重要的问题:实际情况中如何计算 λ \lambda λ 和 σ \sigma σ 呢?
七、计算 S 的特征值和 A 的奇异值
A A A 的奇异值 σ i \sigma_i σi 是 S = A T A S=A^TA S=ATA 特征值 λ i \lambda_i λi 的算术平方根,这个将 SVD 和对称矩阵的特征值问题联系了起来,这个很好;但是我们不想使用 A T A A^TA ATA 乘 A A A,因为这个运算非常耗时,这个很不好。
首先想到的是尽可能将 A A A 和 S S S 的元素都变成零,而不改变任何的 σ \sigma σ 和 λ \lambda λ。奇异向量和特征向量会改变 —— 这个没有问题。相似矩阵 Q − 1 S Q Q^{-1}SQ Q−1SQ 和 S S S 的特征值 λ \lambda λ 相同,如果 S S S 正交,那么这个矩阵就是 Q T S Q Q^TSQ QTSQ 也是对称的。
对于二阶的对称矩阵可以构造出 2 × 2 2\times2 2×2 的旋转矩阵 Q Q Q,使得 Q T S Q Q^TSQ QTSQ 是对称的三对角矩阵(symmetric and tridiagonal matrix),它含有大量的零元素,但是旋转无法保证总能得到对角矩阵,所以要想求得 S S S 所有的特征值,需要新的方法。
对于 SVD,和 Q T S Q Q^TSQ QTSQ 相对应的是什么?我们不想改变 A A A 任何的奇异值,那么就是:在 A A A 的两边分别乘上不同的正交矩阵 Q 1 Q_1 Q1 和 Q 2 Q_2 Q2,利用这两个在矩阵 Q 1 T A Q 2 Q_1^TAQ_2 Q1TAQ2 中生成零元素,而 σ \sigma σ 不会改变: ( Q 1 T A Q 2 ) T ( Q 1 T A Q 2 ) = Q 2 T A T A Q 2 = Q 2 T S Q 2 得到相同的 σ ( A ) 和 λ ( S ) (Q_1^TAQ_2)^T(Q_1^TAQ_2)=Q_2^TA^TAQ_2=Q_2^TSQ_2\kern 10pt得到相同的\,\sigma(A)\,和\,\lambda(S) (Q1TAQ2)T(Q1TAQ2)=Q2TATAQ2=Q2TSQ2得到相同的σ(A)和λ(S)两个自由选取的 Q Q Q 将可以使得 Q 1 T A Q 2 Q_1^TAQ_2 Q1TAQ2 为两对角矩阵(bidiagonal matrix),这个完美对应了 Q T S Q Q^TSQ QTSQ 是三对角矩阵,它们之间的联系是: ( 两对角矩阵 ) T ( 两对角矩阵 ) = 三对角矩阵 (两对角矩阵)^T(两对角矩阵)=三对角矩阵 (两对角矩阵)T(两对角矩阵)=三对角矩阵。
最后要算出对角矩阵 Λ \Lambda Λ 和对角矩阵 Σ \Sigma Σ 的步骤需要更多的新思路,这个也不简单,因为有些要解的 det ( S − λ I ) = 0 \det(S-\lambda I)=0 det(S−λI)=0 是 n = 100 n=100 n=100 或 1000 1000 1000 甚至是更多次数的多项式,而我们不可能去求解这些多项式!
LAPACK 中求解 λ \lambda λ 和 σ \sigma σ 是使用简单的正交矩阵来逼近 Q T S Q = Λ Q^TSQ=\Lambda QTSQ=Λ 和 U T A V = Σ U^TAV=\Sigma UTAV=Σ,当很接近 Λ \Lambda Λ 和 Σ \Sigma Σ 时就停止。
这两步(先是零元素)方法在指令 eig(S) 和 svd(A) 中内置了。
八、主要内容总结
- SVD 将 A A A 分解成 U Σ V T U\Sigma V^T UΣVT,共有 r r r 个奇异值 σ 1 ≥ σ 2 ≥ ⋯ ≥ σ r > 0 \sigma_1\geq\sigma_2\geq\cdots\geq\sigma_r>0 σ1≥σ2≥⋯≥σr>0.
- 数值 σ 1 2 , σ 2 2 , ⋯ , σ r 2 \sigma_1^2,\sigma_2^2,\cdots,\sigma_r^2 σ12,σ22,⋯,σr2 是 A A T AA^T AAT 和 A T A A^TA ATA 非零的特征值。
- U U U 和 V V V 的标准正交列是 A A T AA^T AAT 和 A T A A^TA ATA 的特征向量。
- 这些列包含了矩阵 A A A 四个基本子空间的标准正交基。
- 这些基对角化矩阵 A A A: A v i = σ i u i , i ≤ r A\boldsymbol v_i=\sigma_i\boldsymbol u_i,\,i\leq r Avi=σiui,i≤r,即是 A V = U Σ \pmb{AV=U\Sigma} AV=UΣ.
- A = σ 1 u 1 v 1 T + σ 2 u 2 v 2 T + ⋯ + σ r u r v r T A=\sigma_1\boldsymbol u_1\boldsymbol v_1^T+\sigma_2\boldsymbol u_2\boldsymbol v_2^T+\cdots+\sigma_r\boldsymbol u_r\boldsymbol v_r^T A=σ1u1v1T+σ2u2v2T+⋯+σrurvrT,其中 σ 1 \sigma_1 σ1 是比值 ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ \displaystyle\frac{||A\boldsymbol x||}{||\boldsymbol x||} ∣∣x∣∣∣∣Ax∣∣ 的最大值。
九、例题
【例4】识别出下列将 A A A 分解成列乘行的和的分解方式的类型: 1. 正交列 u 1 σ 1 , u 2 σ 2 , ⋯ , u r σ r 乘 标准正交行 v 1 T , v 2 T , ⋯ , v r T 2. 标准正交列 q 1 , q 2 , ⋯ , q r 乘 三角形矩阵的行 r 1 T , r 2 T , ⋯ , r r T 3. 三角形矩阵的列 l 1 , l 2 , ⋯ , l r 乘 三角形矩阵的行 u 1 T , u 2 T ⋯ , u r T \begin{array}{llll}1.\,正交列&\boldsymbol u_1\sigma_1,\boldsymbol u_2\sigma_2,\cdots,\boldsymbol u_r\sigma_r&乘&标准正交行&\boldsymbol v_1^T,\boldsymbol v_2^T,\cdots,\boldsymbol v_r^T\\2.\,标准正交列&\boldsymbol q_1,\boldsymbol q_2,\cdots,\boldsymbol q_r&乘&三角形矩阵的行&\boldsymbol r_1^T,\boldsymbol r_2^T,\cdots,\boldsymbol r_r^T\\3.\,三角形矩阵的列&\boldsymbol l_1,\boldsymbol l_2,\cdots,\boldsymbol l_r&乘&三角形矩阵的行&\boldsymbol u_1^T,\boldsymbol u_2^T\cdots,\boldsymbol u_r^T\end{array} 1.正交列2.标准正交列3.三角形矩阵的列u1σ1,u2σ2,⋯,urσrq1,q2,⋯,qrl1,l2,⋯,lr乘乘乘标准正交行三角形矩阵的行三角形矩阵的行v1T,v2T,⋯,vrTr1T,r2T,⋯,rrTu1T,u2T⋯,urT A A A 的秩、主元和奇异值在上述分解中的哪里出现?
解: 这三种分解不管是对理论数学还是应用数学中的线性代数都是基础:
- 奇异值分解 Singular Value Decompositon: A = U Σ V T \pmb{A=U\Sigma V^T} A=UΣVT
- 格拉姆-施密特正交化 Gram-Schmidt Orthogonalization: A = Q R \pmb{A=QR} A=QR
- 高斯消元法 Gaussian Elimination: A = L U \pmb{A=LU} A=LU
可以将奇异值 σ i \pmb{\sigma_i} σi、高度 h i \pmb{h_i} hi 和主元 d i \pmb{d_i} di 单独表示:
- A = U Σ V T A=U\Sigma V^T A=UΣVT,其中 U U U 和 V V V 的列都是单位向量, r r r 个奇异值 σ i \sigma_i σi 在 Σ \Sigma Σ 中.
- A = Q H R A=QHR A=QHR,其中 Q Q Q 的列是单位向量, R R R 中的对角元素都是 1 1 1, r r r 个高度 h i h_i hi 在 H H H 中.
- A = L D U A=LDU A=LDU,其中 L L L 和 U U U 的对角元素都是 1 1 1, r r r 个主元在 D D D 中.
每个 h i h_i hi 表示第 i i i 列到由第 1 , 2 , ⋯ , i − 1 1,2,\cdots,i-1 1,2,⋯,i−1 列所形成平面的高度,当 r = m = n r=m=n r=m=n 时, n n n 维的 “平行多面体”(以 A A A 各列为同一顶点处的棱)的体积可以由 A = U Σ V T = L D U = Q H R A=U\Sigma V^T=LDU=QHR A=UΣVT=LDU=QHR 求得: ∣ det A ∣ = ∣ σ i 的乘积 ∣ = ∣ d i 的乘积 ∣ = ∣ h i 的乘积 ∣ \pmb{|\det A|=|\sigma_i 的乘积|=|d_i\,的乘积|=|h_i\,的乘积|} ∣detA∣=∣σi的乘积∣=∣di的乘积∣=∣hi的乘积∣【例5】证明 σ 1 ≥ ∣ λ ∣ max \pmb{\sigma_1\ge|\lambda|_{\textrm{max}}} σ1≥∣λ∣max,最大的奇异值大于或等于所有的特征值。
证明: 由 A = U Σ V T A=U\Sigma V^T A=UΣVT,注意到左乘一个正交矩阵并不改变这个向量的长度: ∣ ∣ Q x ∣ ∣ = ∣ ∣ x ∣ ∣ ||Q\boldsymbol x||=||\boldsymbol x|| ∣∣Qx∣∣=∣∣x∣∣,这是因为 ∣ ∣ Q x ∣ ∣ 2 = x T Q T Q x = x T x = ∣ ∣ x ∣ ∣ 2 ||Q\boldsymbol x||^2=\boldsymbol x^TQ^TQ\boldsymbol x=\boldsymbol x^T\boldsymbol x=||\boldsymbol x||^2 ∣∣Qx∣∣2=xTQTQx=xTx=∣∣x∣∣2,这个也适用于 Q = U Q=U Q=U 和 Q = V T Q=V^T Q=VT,这两个矩阵的中间是对角矩阵 Σ \Sigma Σ: ∣ ∣ A x ∣ ∣ = ∣ ∣ U Σ V T x ∣ ∣ = ∣ ∣ Σ V T x ∣ ∣ ≤ σ 1 ∣ ∣ V T x ∣ ∣ = σ 1 ∣ ∣ x ∣ ∣ ( 7.2.14 ) ||A\boldsymbol x||=||U\Sigma V^T\boldsymbol x||=||\Sigma V^T\boldsymbol x||\le\sigma_1||V^T\boldsymbol x||=\sigma_1||\boldsymbol x||\kern 20pt(7.2.14) ∣∣Ax∣∣=∣∣UΣVTx∣∣=∣∣ΣVTx∣∣≤σ1∣∣VTx∣∣=σ1∣∣x∣∣(7.2.14)特征向量满足 ∣ ∣ A x ∣ ∣ = ∣ λ ∣ ∣ ∣ x ∣ ∣ ||A\boldsymbol x||=|\lambda|||\boldsymbol x|| ∣∣Ax∣∣=∣λ∣∣∣x∣∣,所以式(7.2.14)表明 ∣ λ ∣ ∣ ∣ x ∣ ∣ ≤ σ 1 ∣ ∣ x ∣ ∣ |\lambda|||\boldsymbol x||\le\sigma_1||\boldsymbol x|| ∣λ∣∣∣x∣∣≤σ1∣∣x∣∣,所以 ∣ λ ∣ ≤ σ 1 \pmb{|\lambda|\le\sigma_1} ∣λ∣≤σ1.
取 x = ( 1 , 0 , ⋯ , 0 ) \boldsymbol x=(1,0,\cdots,0) x=(1,0,⋯,0) 为单位向量,则 A x A\boldsymbol x Ax 就是 A A A 的第一列,然后由不等式(7.2.14)可得,这列的长度小于或等于 σ 1 \sigma_1 σ1。所以 A A A 的每个元素都有 ∣ a i j ∣ ≤ σ 1 |a_{ij}|\le\sigma_1 ∣aij∣≤σ1.
式(7.2.14)再次证明了 ∣ ∣ A x ∣ ∣ ∣ ∣ x ∣ ∣ \displaystyle\frac{||A\boldsymbol x||}{||\boldsymbol x||} ∣∣x∣∣∣∣Ax∣∣ 的最大值等于 σ 1 \sigma_1 σ1.
在求解 A x = b A\boldsymbol x=\boldsymbol b Ax=b 时,条件数(condition number) σ max σ min \displaystyle\frac{\sigma_{\textrm{max}}}{\sigma_{\textrm{min}}} σminσmax 控制舍入的误差,如果条件数太大,那么 MATLAB 会警告此时的 x \boldsymbol x x 不可靠。
相关文章:
7.2 奇异值分解的基与矩阵
一、奇异值分解 奇异值分解(SVD)是线性代数的高光时刻。 A A A 是一个 m n m\times n mn 的矩阵,可以是方阵或者长方形矩阵,秩为 r r r。我们要对角化 A A A,但并不是把它化成 X − 1 A X X^{-1}A X X−1AX 的形…...
3.3.2 用仿真图实现点灯效果
文章目录 文章介绍Keil生成.hex代码Proteus仿真图中导入.hex代码文件开始仿真 文章介绍 点灯之前需要准备好仿真图keil代码 仿真图参考前文:3.3.2 Proteus第一个仿真图 keil安装参考前文:3.1.2 Keil4安装教程 keil新建第一个项目参考前文:3.1…...
Docker 学习笔记:从入门到部署,实战演练全流程!
📌 开篇:为什么要学 Docker? 还在为环境不一致、部署麻烦、依赖冲突头疼吗?Docker 让一切变得简单!作为现代开发和运维的神器,Docker 让我们可以用 一句命令 解决 “在我电脑上能跑” 的问题。今天&#x…...
本地搭建DeepSeek R1模型 + 前端
本地搭建DeepSeek R1模型 前端 配置: 操作系统:windows11 CPU:i5 13600KF GPU:英伟达4070 12GB 内存:16G DDR5 硬盘:1TB 模型安装 本文采用Ollama进行安装。Ollama安装比较简单。 官网࿱…...
MyBatis增删改查:静态与动态SQL语句拼接及SQL注入问题解析
MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的工作。本文将深入探讨 MyBatis 中的增删改查操作,重点讲解静态与动态 SQL 语句的拼接,并分析 S…...
Unity入门学习笔记(Day01)
一.认识unity工作面板 1.1.project window(项目面板) 显示当前项目中的所有文件和目录,包含了项目里面所有的资源文件 1.2.console window(输出面板) 显示当前游戏开发中生成的警告错误 1.3.hierarchy window&…...
教务考试管理系统-Sprintboot vue
一、前言 1.1 实践目的和要求 本次实践的目的是为了帮助学生强化对实践涉及专业技术知识的理解,掌握专业领域中软件知识的应用方法,并了解软件工程在具体行业领域的发展趋势。通过培养学生利用软件工程方法分析、设计并完成具体行业软件开发的能力&…...
GHCTF2025--Web
upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…...
文件上传漏洞(upload-labs)
目录 Pass-01(前端绕过) (1)JavaScript (2)Burpsuite(改后缀) Pass-02(IMME类型 ) burpsuite(改文件类型) Pass-03(黑名单绕过) …...
图片的拖拽+缩放
效果图: <script setup lang"ts"> import { onMounted, ref } from vue; import ImgBg from /assets/img/bg.jpg import Img1 from /assets/img/1.jpgconst innerStyle ref({left: 0,top: 0,width: 100,height: 0 }) const wrapStyle ref({width:…...
Windows软件插件-音视频文件读取器
下载本插件 本插件读取音频和视频文件,输出音频样本和视频样本,音频样本为16位PCM,采样率48000;视频样本为RGB32。大部分音频和视频文件格式都可以读取。本插件类型为DLL。 本插件是通过创建媒体基础“源读取器”对象实现读取音视…...
考研数一复习之拉格朗日中值定理求解函数极限
最近在复习考研数学,只是简单做题过于乏味,因此便总结了一些笔记,后续若有空,也会将自己的复习笔记分享出来。本篇,我们将重点讲解拉格朗日中值定理在求解函数极限中的应用。同时,作者本人作为python领域创作者,还将在本文分享使用sympy求解高数中函数极…...
聊天服务器分布式改造
目前的聊天室是单节点的,无论是http接口还是socket接口都在同一个进程,无法承受太多人同时在线,容灾性也非常差。因此,一个成熟的IM产品一定是做成分布式的,根据功能分模块,每个模块也使用多个节点并行部署…...
C++11的一些特性
目录 一、C11简介 二、统一的列表初始化 2.1 {}初始化 2.2 std::initializer_list 三、声明 3.1 auto 3.2 decltype 3.3 nullptr 四、范围for循环 五、智能指针 5.1 RAII 5.2 智能指针的原理 5.3 std::auto_ptr…...
【打卡day3】字符串类
例如统计字符个数,字符大小写转换 题目描述:输入一行字符串,计算A-Z大写字母出现的次数 思路: 1 定义一个整型数组,初始化为0,存储每个字母出现的次数,下标0对应字母A, 2,定义字…...
图像滑块对比功能的开发记录
背景介绍 最近,公司需要开发一款在线图像压缩工具,其中的一个关键功能是让用户直观地比较压缩前后的图像效果。因此,我们设计了一个对比组件,它允许用户通过拖动滑块,动态调整两张图像的显示区域,从而清晰…...
【音视频】ffplay常用命令
一、 ffplay常用命令 -x width:强制显示宽度-y height:强制显示高度 强制以 640*360的宽高显示 ffplay 2.mp4 -x 640 -y 360 效果如下 -fs 全屏显示 ffplay -fs 2.mp4效果如下: -an 禁用音频(不播放声音)-vn 禁…...
初识Linux
文章目录 初识Linux:从开源哲学到技术生态的全面解析一、Linux的背景与发展简史:从代码实验到数字基础设施1.1 起源与开源基因1.2 技术哲学之争1.3 GNU/Linux的融合 二、开源:Linux的核心竞争力与生态力量2.1 法律保障与四大自由2.2 社区协作…...
基于遗传算法的IEEE33节点配电网重构程序
一、配电网重构原理 配电网重构(Distribution Network Reconfiguration, DNR)是一项优化操作,旨在通过改变配电网中的开关状态,优化电力系统的运行状态,以达到降低网损、均衡负载、改善电压质量等目标。配电网重构的核…...
manus对比ChatGPT-Deep reaserch进行研究类学术相关数据分析!谁更胜一筹?
没有账号,只能挑选一个案例 一夜之间被这个用全英文介绍全华班出品的新爆款国产AI产品的小胖刷频。白天还没有切换语言的选项,晚上就加上了。简单看了看团队够成,使用很长实践的Monica创始人也在其中。逐渐可以理解,重心放在海外产…...
线程通信---java
线程 我们知道,线程是进程的最小执行单位,一个进程可以拥有多个线程,那么就会引入两个问题: 多个线程之间如何进行通信多个线程对同一个数据进行操作,如何保证程序正确执行,也就是线程安全问题 线程的常…...
python面试常见题目
1、python 有几种数据类型 数字:整形 (int),浮点型 (float)布尔 ( bool):false true字符串 (string)列表 (list)元组 (tuple)字典 &…...
Python中与字符串操作相关的30个常用函数及其示例
以下是Python中与字符串操作相关的30个常用函数及其示例: 1. str.capitalize() 将字符串的第一个字符大写,其余字符小写。 s "hello world" print(s.capitalize()) # 输出: Hello world2. str.lower() 将字符串中的所有字符转换为小写。…...
2025年渗透测试面试题总结-小某鹏汽车-安全工程师(题目+回答)
网络安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 小鹏汽车-安全工程师 一、XXE漏洞与SSRF漏洞 1. XXE(XML External Entity)漏洞…...
kafka + flink +mysql 案例
假设你有两个Kafka主题:user_activities_topic 和 product_views_topic,并且你希望将user_activities_topic中的数据写入到user_activities表,而将product_views_topic中的数据写入到product_views表。 maven <dependencies><!-- …...
Windows下配置Flutter移动开发环境以及AndroidStudio安装和模拟机配置
截止 2025/3/9 ,版本更新到了 3.29.1 ,但是为了防止出现一些奇怪的bug,我安装的还是老一点的,3.19,其他版本的安装同理。AndroidStudio用的是 2024/3/1 版本。 — 1 环境变量(Windows) PUB_H…...
【工具类】Springboot 项目日志打印项目版本和构建时间
博主介绍:✌全网粉丝22W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
p5.js:模拟 n个彩色小球在一个3D大球体内部弹跳
向 豆包 提问:编写一个 p5.js 脚本,模拟 42 个彩色小球在一个3D大球体内部弹跳。每个小球都应留下一条逐渐消失的轨迹。大球体应缓慢旋转,并显示透明的轮廓线。请确保实现适当的碰撞检测,使小球保持在球体内部。 cd p5-demo copy…...
RISC-V医疗芯片工程师复合型转型的路径与策略
从RISC-V到医疗芯片:工程师复合型转型的路径与策略 一、引言 1.1 研究背景 在科技快速发展的当下,芯片技术已然成为推动各行业进步的核心驱动力之一。其中,RISC-V 架构作为芯片领域的新兴力量,正以其独特的优势迅速崛起,对整个芯片产业的格局产生着深远影响。RISC-V 架…...
HTML 文本格式化
HTML 文本格式化 在构建网页的过程中,文本的格式化是一个至关重要的环节。HTML(HyperText Markup Language)提供了丰富的标签和属性来帮助我们实现各种文本格式化的需求。本文将详细介绍HTML中常见的文本格式化方法,包括字体、颜…...
基于RNN+微信小程序+Flask的古诗词生成应用
项目介绍 平台采用B/S结构,后端采用主流的Flask框架进行开发,古诗词生成采用RNN模型进行生成,客户端基于微信小程序开发。是集成了Web后台开发、微信小程序开发、人工智能(RNN)等多个领域的综合性应用,是课…...
【算法】图论 —— Dijkstra算法 python
引入 求非负权边的单源最短路 时间复杂度 O( m l o g n mlogn mlogn) 模板 https://www.luogu.com.cn/problem/P4779 import heapq as hq def dijkstra(s): # dis表示从s到i的最短路 dis [float(inf)] * (n 1) # vis表示i是否出队列 vis [0] * (n 1) q [] dis[s…...
Java:LocalDatTime(代替Calendar)、ZoneDateTime(时区时间)
文章目录 Local(代替Calendar)方法:获取当前代码 LocalDate(年月日星期)LocalTime(时分秒纳秒)LocalDateTime(最常用:年月日时分秒纳秒)ZoneId 时区表示方法 ZoneDateTime(时区时间)方法世界标准时间&#…...
HOW - React 如何在在浏览器绘制之前同步执行 - useLayoutEffect
目录 useEffect vs useLayoutEffectuseEffectuseLayoutEffect主要区别总结选择建议注意事项 useLayoutEffect 使用示例测量 DOM 元素的尺寸和位置示例:自适应弹出框定位 同步更新样式以避免闪烁示例:根据内容动态调整容器高度 图像或 Canvas 绘制前的准备…...
PyTorch系列教程:编写高效模型训练流程
当使用PyTorch开发机器学习模型时,建立一个有效的训练循环是至关重要的。这个过程包括组织和执行对数据、参数和计算资源的操作序列。让我们深入了解关键组件,并演示如何构建一个精细的训练循环流程,有效地处理数据处理,向前和向后…...
VS2019,VCPKG - 为VS2019添加VCPKG
文章目录 VS2019,VCPKG - 为VS2019添加VCPKG概述笔记前置条件迁出vcpkg到本地验证库安装更新已经安装的库删除指定的包安装VS2019能用的boostvcpkg 2025.02.14 版本可以给VS2019用用VCPKG的好处备注END VS2019,VCPKG - 为VS2019添加VCPKG 概述 开源工程用到了VCPKG管理的包。…...
linux下 jq 截取json文件信息
背景:通过‘登录名‘ 获取该对象的其他个人信息如名字。 环境准备:麒麟操作系统V10 jq安装包 jq安装包获取方式:yum install jq 或 使用附件中的rpm 或 git自行下载 https://github.com/stedolan/jq/releases/download/ 实现过程介绍&am…...
测试大语言模型在嵌入式设备部署的可能性-ollama本地部署测试
前言 当今各种大语言模型百花齐放,为了方便使用者更加自由的使用大模型,将大模型变成如同棒球棍一样每个人都能用,并且顺手方便的工具,本地私有化具有重要意义。 本次测试使用ollama完成模型下载,过程简单快捷。 1、进…...
C语言基础系列【21】memcpy、memset
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
云曦春季开学考复现(2025)
Crypto 划水的dp和dq 下载附件后是简单的RSA算法题,之所以说简单是因为给了公钥e 趁热打铁,昨天刚学的RSA,既然有p有q,也有e,而np*q,可以算出欧拉函数值phi(p-1)*(q-1&…...
探秘 Netty 通信中的 SslHandler 类:保障网络通信安全的基石
引言 在当今数字化时代,网络安全是每一个应用程序都必须重视的关键因素。尤其是在数据传输过程中,防止数据被窃取、篡改至关重要。Netty 作为一个高性能的网络编程框架,为开发者提供了强大的功能来构建可靠的网络应用。其中,SslH…...
Llama factory微调后的模型怎么通过ollama发布
接上一篇博客:用Llama Factory单机多卡微调Qwen2.5时报torch.OutOfMemoryError: CUDA out of memory的解决办法_llama-factory cuda out of memory-CSDN博客 把Lora模块和其基模型merge到一起之后,就可以通过ollama之类的框架提供服务了。不过还是有些格式转换的工作要做: …...
ubuntu 20.04下ZEDmini安装使用
提前安装好显卡驱动和cuda,如果没有安装可以参考我的这两篇文章进行安装: ubuntu20.04配置YOLOV5(非虚拟机)_ubuntu20.04安装yolov5-CSDN博客 ubuntu20.04安装显卡驱动及问题总结_乌班图里怎么备份显卡驱动-CSDN博客 还需要提前…...
CmBacktrace的学习跟移植思路
学习移植CmBacktrace需要从理解其核心功能、适用场景及移植步骤入手,结合理论学习和实践操作。以下是具体的学习思路与移植思路: 一、学习思路 理解CmBacktrace的核心功能 CmBacktrace是针对ARM Cortex-M系列MCU的错误追踪库,支持自动诊断Har…...
Android Glide 缓存模块源码深度解析
一、引言 在 Android 开发领域,图片加载是一个极为常见且关键的功能。Glide 作为一款被广泛使用的图片加载库,其缓存模块是提升图片加载效率和性能的核心组件。合理的缓存机制能够显著减少网络请求,降低流量消耗,同时加快图片显示…...
蓝桥杯备赛:炮弹
题目解析 这道题目是一道模拟加调和级数,难的就是调和级数,模拟过程比较简单。 做法 这道题目的难点在于我们在玩这个跳的过程,可能出现来回跳的情况,那么为了解决这种情况,我们采取的方法是设定其的上限步数。那么…...
死锁问题分析工具
使用 gdb 调试 gdb ./your_program (gdb) run (gdb) thread apply all bt还可以分析pthread_mutex内部,查看owen字段分析哪个线程占用的锁,一个可能的 pthread_mutex 内部结构可以大致表示为: typedef struct pthread_mutex_t {int state; …...
装饰器模式--RequestWrapper、请求流request无法被重复读取
目录 前言一、场景二、原因分析三、解决四、更多 前言 曾经遇见这么一段代码,能看出来是把request又重新包装了一下,核心信息都不会改变 后面了解到这叫 装饰器模式(Decorator Pattern) :也称为包装模式(Wrapper Pat…...
MTK Android12 桌面上显示文件管理器图标
文章目录 需求解决 需求 在MTK平台上,Android12的文件管理器图标未显示在桌面,但在设置里面可以看到,文件管理器是安装的。根据客户要求,需要将文件管理器的图标显示在桌面上。解决 路径:packages/apps/DocumentsUI/…...
SpringBoot实现文件上传
1. 配置文件上传限制 application.yml spring:servlet:multipart:max-file-size: 10MBmax-request-size: 10MB2. 创建文件上传控制器 import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import…...