〖矩阵论笔记一〗奇异值分解(SVD)

奇异值分解(singular value decomposition, SVD)是一种矩阵因子分解方法,是线性代数的概念,它在优化问题、最小二乘问题、广义逆矩阵及统计学习中被广泛使用,成为其重要工具。

1 定义与性质

  1. 奇异值分解是指任意一个mxn矩阵,都可以表示为三个矩阵的乘积(因子分解)形式,分别是m阶正交矩阵、由降序排列的非负的对角线元素组成的mxn矩形对角矩阵和n阶正交矩阵。
  2. 奇异值:设A∈ C r m ∗ n C^{m*n}_r Crmn(r>0),求出 A A T AA^T AAT A T A A^TA ATA的特征值, λ 1 ≥ λ 2 ≥ λ 3 ≥ . . . ≥ λ r > 0 , λ r + 1 = λ r + 2 = . . . λ n = 0 λ_1≥λ_2≥λ_3≥...≥λ_r>0,λ_{r+1}=λ_{r+2}=...λ_n=0 λ1λ2λ3...λr>0,λr+1=λr+2=...λn=0,则称σ= λ i \sqrtλ_i λ i(i=1,2,3…n)为A的奇异值,σ= λ i \sqrtλ_i λ i(i=1,2,3…r)为A的非零奇异值。
    注: A A T AA^T AAT A T A A^TA ATA有相同的非零奇异值。
  3. 矩阵奇异值分解将矩阵分解为三个矩阵的乘积: A = U Σ V T A=UΣV^T A=UΣVT
    其中:
    U和V是正交单位矩阵(酉矩阵),Σ为对角矩阵(不一定是方阵)。
    矩阵U称为左奇异矩阵,U的列向量称为左奇异向量,V为右奇异矩阵,V的列向量称为右奇异向量。
    Σ=diag( σ 1 , σ 2 , . . . σ n σ_1,σ_2,...σ_n σ1,σ2,...σn),只有其主对角线有奇异值,其余均为0。
    将上诉公式 A = U Σ V T A=UΣV^T A=UΣVT改为A=U ( Σ 1 O O O ) V T \begin{pmatrix} Σ_1&O\\O&O\end{pmatrix}V^T (Σ1OOO)VT,其中 Σ 1 Σ_1 Σ1=diag( σ 1 , σ 2 , . . . σ r σ_1,σ_2,...σ_r σ1,σ2,...σr)

2 奇异值分解算法

例题:求矩阵A= ( 1 2 0 0 0 0 ) \begin{pmatrix} 1&2\\0&0\\0&0\end{pmatrix} 100200的奇异值分解。

2.1 算法一

(1)求正交矩阵V
可求得矩阵 A T A = A^TA= ATA= ( 1 0 0 2 0 0 ) \begin{pmatrix}1&0&0\\2&0&0\end{pmatrix} (120000) ( 1 2 0 0 0 0 ) \begin{pmatrix}1&2\\0&0\\0&0\end{pmatrix} 100200= ( 1 2 2 4 ) \begin{pmatrix}1&2\\2&4\end{pmatrix} (1224)的特征值为 λ 1 = 5 , λ 2 = 0 λ_1=5,λ_2=0 λ1=5,λ2=0,
对应特征向量为 a 1 = ( 1 , 2 ) T a_1=(1,2)^T a1=(1,2)T a 2 = ( 2 , − 1 ) T a_2=(2,-1)^T a2=(2,1)T
非零奇异值为 σ = 5 σ=\sqrt5 σ=5 ,所以 Σ 1 Σ_1 Σ1=( 5 \sqrt5 5
使得 V T ( A T A ) V V^T(A^TA)V VT(ATA)V= ( 5 0 0 0 ) \begin{pmatrix}5&0\\0&0\end{pmatrix} (5000)成立的正交矩阵 V = ( V 1 , V 2 V=(V_1,V_2 V=(V1,V2)= ( 1 5 2 5 2 5 − 1 5 ) \begin{pmatrix}\frac{1}{\sqrt5}&\frac{2}{\sqrt5}\\\frac{2}{\sqrt5}&-\frac{1}{\sqrt5}\end{pmatrix} (5 15 25 25 1)
(2)求正交矩阵U
U 1 = A V 1 Σ 1 − 1 U_1=AV_1Σ_1^{-1} U1=AV1Σ11= ( 1 2 0 0 0 0 ) \begin{pmatrix}1&2\\0&0\\0&0\end{pmatrix} 100200 ( 1 5 2 5 ) \begin{pmatrix}\frac{1}{\sqrt5}\\\frac{2}{\sqrt5}\end{pmatrix} (5 15 2) ( 1 5 ) \begin{pmatrix}\frac{1}{\sqrt5}\end{pmatrix} (5 1)= ( 1 0 0 ) \begin{pmatrix}1\\0\\0\end{pmatrix} 100
U 2 = ( 0 0 1 0 0 1 ) U_2=\begin{pmatrix}0&0\\1&0\\0&1\end{pmatrix} U2=010001 ,将 U 1 U_1 U1扩张成 R 3 R^3 R3的标准正交基 U = ( U 1 , U 2 ) U=(U_1,U_2) U=(U1,U2)= ( 1 0 0 0 1 0 0 0 1 ) \begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix} 100010001
(3)分解
则A的奇异值分解为A=U ( Σ 1 O O O ) V T \begin{pmatrix} Σ_1&O\\O&O\end{pmatrix}V^T (Σ1OOO)VT= ( 1 0 0 0 1 0 0 0 1 ) \begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix} 100010001 ( 5 0 0 0 0 0 ) \begin{pmatrix}\sqrt5&0\\0&0\\0&0\end{pmatrix} 5 00000 ( 1 5 2 5 2 5 − 1 5 ) \begin{pmatrix}\frac{1}{\sqrt5}&\frac{2}{\sqrt5}\\\frac{2}{\sqrt5}&-\frac{1}{\sqrt5}\end{pmatrix} (5 15 25 25 1)

2.2 算法二

(1)求正交矩阵U
可求得矩阵 A A T = AA^T= AAT= ( 1 2 0 0 0 0 ) \begin{pmatrix}1&2\\0&0\\0&0\end{pmatrix} 100200 ( 1 0 0 2 0 0 ) \begin{pmatrix}1&0&0\\2&0&0\end{pmatrix} (120000)= ( 5 0 0 0 0 0 0 0 0 ) \begin{pmatrix}5&0&0\\0&0&0\\0&0&0\end{pmatrix} 500000000的特征值为 λ 1 = 5 , λ 2 = λ 3 = 0 λ_1=5,λ_2=λ_3=0 λ1=5,λ2=λ3=0,非零奇异值为 σ = 5 σ=\sqrt5 σ=5 ,所以 Σ 1 = ( 5 Σ_1=(\sqrt5 Σ1=5
求得特征向量 a 1 = ( 1 , 0 , 0 ) T a_1=(1,0,0)^T a1=(1,0,0)T a 2 = ( 0 , 1 , 0 ) T a_2=(0,1,0)^T a2=(0,1,0)T a 3 = ( 0 , 0 , 1 ) T a_3=(0,0,1)^T a3=(0,0,1)T
U = ( 1 0 0 0 1 0 0 0 1 ) U=\begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix} U=100010001
(2)求正交矩阵V
可求得矩阵 A T A = A^TA= ATA= ( 1 0 0 2 0 0 ) \begin{pmatrix}1&0&0\\2&0&0\end{pmatrix} (120000) ( 1 2 0 0 0 0 ) \begin{pmatrix}1&2\\0&0\\0&0\end{pmatrix} 100200= ( 1 2 2 4 ) \begin{pmatrix}1&2\\2&4\end{pmatrix} (1224)的特征值为 λ 1 = 5 , λ 2 = 0 λ_1=5,λ_2=0 λ1=5,λ2=0,
对应特征向量为 a 1 = ( 1 , 2 ) T a_1=(1,2)^T a1=(1,2)T a 2 = ( 2 , − 1 ) T a_2=(2,-1)^T a2=(2,1)T
使得 V T ( A T A ) V V^T(A^TA)V VT(ATA)V= ( 5 0 0 0 ) \begin{pmatrix}5&0\\0&0\end{pmatrix} (5000)成立的正交矩阵 V = ( V 1 , V 2 V=(V_1,V_2 V=(V1,V2)= ( 1 5 2 5 2 5 − 1 5 ) \begin{pmatrix}\frac{1}{\sqrt5}&\frac{2}{\sqrt5}\\\frac{2}{\sqrt5}&-\frac{1}{\sqrt5}\end{pmatrix} (5 15 25 25 1)
(3)分解
则A的奇异值分解为A=U ( Σ 1 O O O ) V T \begin{pmatrix} Σ_1&O\\O&O\end{pmatrix}V^T (Σ1OOO)VT= ( 1 0 0 0 1 0 0 0 1 ) \begin{pmatrix}1&0&0\\0&1&0\\0&0&1\end{pmatrix} 100010001 ( 5 0 0 0 0 0 ) \begin{pmatrix}\sqrt5&0\\0&0\\0&0\end{pmatrix} 5 00000 ( 1 5 2 5 2 5 − 1 5 ) \begin{pmatrix}\frac{1}{\sqrt5}&\frac{2}{\sqrt5}\\\frac{2}{\sqrt5}&-\frac{1}{\sqrt5}\end{pmatrix} (5 15 25 25 1)
我觉得算法二套路简单,没有算法一那么花里胡哨,但所得结果需要检验。

3 奇异值分解代码

python代码:直接调用numpy的svd()

import numpy as np
A = np.array([[1,2],[0,0],[0,0]])
U,S,VT = np.linalg.svd(A)
print("返回结果:",np.linalg.svd(A))
print("U=",U)
print("S=",S)
print("V^T=",VT)

输出
在这里插入图片描述

这时我们发现矩阵S只显示对角元素的值,而矩阵中其它元素因为是0而被省略了。所以返回的时候,作为一维矩阵返回。如果我们想让矩阵S完整显示出来,可以添加以下代码进行处理

S2 = np.zeros(A.shape,S.dtype)
np.fill_diagonal(S2,S)
print("处理后的S=")
print(S2)

输出:
在这里插入图片描述
说明:
np.fill_diagonal(S2, S)的作用是将矩阵S2的对角元素设置为S的元素
np.zeros(A.shape,S.dtype)的作用是返回来一个和矩阵A形状相同的、和矩阵S数据类型相同的、用0填充的数组。

猜你喜欢

转载自blog.csdn.net/weixin_43760844/article/details/112487930