文章目录
- 一、什么是SVD分解
 - 二、SVD分解的步骤
 - 三、SVD分解的应用领域
 - 四、用SVD求解最小二乘表达式
 
一、什么是SVD分解
奇异值分解(Singular Value Decomposition,简称SVD)是一种重要的矩阵分解技术。它可以将一个矩阵分解为三个矩阵的乘积,即A = UΣVT,其中U和V是正交矩阵,Σ是一个对角矩阵,对角元素为从大到小排列的特征值。
 
二、SVD分解的步骤
这里以一个例子来讲解SVD分解的步骤,假设有矩阵A如下,我们对其进行进行SVD分解。
  
      
       
        
         
          
          
           
           
             A 
            
           
             = 
            
            
            
              [ 
             
             
              
               
                
                
                  0 
                 
                
               
               
                
                
                  1 
                 
                
               
              
              
               
                
                
                  1 
                 
                
               
               
                
                
                  1 
                 
                
               
              
              
               
                
                
                  1 
                 
                
               
               
                
                
                  0 
                 
                
               
              
             
            
              ] 
             
            
           
          
          
          
          
            (1) 
           
          
         
        
       
         A =\begin{bmatrix} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{bmatrix} \tag{1} 
        
       
     A= 
              011110 
              (1)
-  
对于给定的m×n矩阵A,计算ATA得到一个n×n的对称矩阵C。
C = A T A = [ 0 1 1 1 1 0 ] [ 0 1 1 1 1 0 ] = [ 2 1 1 2 ] (2) C = A^TA =\begin{bmatrix} 0 & 1 & 1\\ 1 & 1 & 0 \end{bmatrix} \begin{bmatrix} 0 & 1 \\ 1 & 1 \\ 1 & 0 \end{bmatrix} = \begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix} \tag{2} C=ATA=[011110] 011110 =[2112](2) -  
对C矩阵进行特征值分解,得到特征值向量V组成的矩阵和对应的特征值λ。
V = [ 1 2 1 2 1 2 1 2 ] (3) V = \begin{bmatrix} \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \\ \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{2}} \end{bmatrix} \tag{3} V=[21212121](3)
对应的特征值:λ1=3,λ2=1。具体如何求特征向量和特征值可以参考《线性代数》的课本。 -  
将特征值按从大到小的顺序排列,并对应生成对角矩阵Σ。
Σ = [ 3 0 0 1 0 0 ] (4) Σ = \begin{bmatrix} \sqrt{3} & 0 \\ 0 & 1 \\ 0 & 0 \end{bmatrix} \tag{4} Σ= 300010 (4) -  
计算AAT,并将结果进行特征值分解,得到特征值λ和对应的特征向量组成的矩阵U。
U = [ 1 6 1 2 1 3 2 6 0 − 1 3 1 6 − 1 2 1 3 ] (5) U = \begin{bmatrix} \frac{1}{\sqrt{6}} & \frac{1}{\sqrt{2}} & \frac{1}{\sqrt{3}} \\ \frac{2}{\sqrt{6}} & 0 & -\frac{1}{\sqrt{3}} \\ \frac{1}{\sqrt{6}} & -\frac{1}{\sqrt{2}} & \frac{1}{\sqrt{3}} \end{bmatrix} \tag{5} U= 616261210−2131−3131 (5)
对应的特征值:λ1=3,λ2=1,和C=ATA的特征值一致。 
三、SVD分解的应用领域
- 图像压缩
在图像处理中,SVD分解常被用于图像压缩。通过对图像矩阵进行SVD分解,可以得到较低秩的近似矩阵,从而减少存储空间和传输带宽。这种方法在JPEG2000等图像压缩算法中得到广泛应用。 - 推荐系统
SVD分解在推荐系统中也有重要的应用。通过对用户评分矩阵进行SVD分解,可以将用户和物品映射到一个隐空间中,并预测用户对未评分物品的喜好程度。基于SVD的协同过滤算法在Netflix Prize竞赛中取得了很大成功。 - 数据降维
SVD分解可以将高维数据降维到低维,保留数据的主要特征。这在机器学习和数据挖掘任务中非常有用,可以提高计算效率并减少存储需求。例如,在主成分分析(PCA)中,SVD分解被广泛用于实现数据降维。 
四、用SVD求解最小二乘表达式
一般情况下,线性方程的表达式为:
  
      
       
        
        
          A 
         
        
          x 
         
        
          = 
         
        
          b 
         
        
       
         Ax = b 
        
       
     Ax=b
 其中A为m×n的系数矩阵,x为n×1的未知向量,b为m×1的矩阵。线性方程可分为三种情况:
 1.m = n,方程组和未知数的个数相等,理论上存在唯一解;
 2. m < n,方程组数小于未知数的个数,理论上存在无数解;
 3. m > n, 方程组数大于于未知数的个数,即为超定方程,一般情况下无解,所以一般是求其最优解。这也是我数学建模过程中最常用到的线性模型。我们知道求最优解可通过常规最小二乘法来求解:
  
      
       
        
        
          x 
         
        
          = 
         
        
          ( 
         
         
         
           A 
          
         
           T 
          
         
        
          A 
         
         
         
           ) 
          
          
          
            − 
           
          
            1 
           
          
         
         
         
           A 
          
         
           T 
          
         
        
          b 
         
        
       
         x = (A^TA)^{-1}A^Tb 
        
       
     x=(ATA)−1ATb
 此方式确实常用,但需要注意到的是,求解过程需要对ATA求逆,在矩阵A不满秩的情况下,ATA是奇异矩阵,无法求逆。而通过SVD求解的优点是不需要复杂的求逆运算,且可处理ATA为奇异阵不可逆的情况。
 具体的,A = UΣVT,所以Ax=b可以表示为:
  
      
       
        
        
          U 
         
        
          Σ 
         
         
         
           V 
          
         
           T 
          
         
        
          x 
         
        
          = 
         
        
          b 
         
        
       
         UΣV^{T}x = b 
        
       
     UΣVTx=b
 两边同时左乘UT得:
  
      
       
        
        
          Σ 
         
         
         
           V 
          
         
           T 
          
         
        
          x 
         
        
          = 
         
         
         
           U 
          
         
           T 
          
         
        
          b 
         
        
       
         ΣV^{T}x = U^{T}b 
        
       
     ΣVTx=UTb
 现在令y=VT x, b’=UT b,则:
  
      
       
        
        
          Σ 
         
        
          y 
         
        
          = 
         
         
         
           b 
          
         
           ′ 
          
         
        
       
         Σy = b' 
        
       
     Σy=b′
 展开可以表示为:
 
 所以展开矩阵得:
  
      
       
        
         
         
           y 
          
         
           i 
          
         
        
          = 
         
         
          
          
            b 
           
          
            i 
           
          
            ′ 
           
          
          
          
            λ 
           
          
            i 
           
          
         
        
          , 
         
        
          i 
         
        
          = 
         
        
          1 
         
        
          , 
         
        
          2 
         
        
          , 
         
        
          . 
         
        
          . 
         
        
          . 
         
        
          , 
         
        
          n 
         
        
       
         y_i= \frac{b'_i}{λ_i},i=1,2,...,n 
        
       
     yi=λibi′,i=1,2,...,n
 根据y=VT x,可以反解得到x:
  
      
       
        
         
         
           x 
          
         
           i 
          
         
        
          = 
         
        
          Σ 
         
         
         
           y 
          
         
           i 
          
         
        
          , 
         
        
          i 
         
        
          = 
         
        
          1 
         
        
          , 
         
        
          2 
         
        
          , 
         
        
          . 
         
        
          . 
         
        
          . 
         
        
          , 
         
        
          n 
         
        
       
         x_i= Σy_i,i=1,2,...,n 
        
       
     xi=Σyi,i=1,2,...,n
 至此,解算完毕。
- 代码找时间补^_^ 。
 



















![[Unity][VR]透视开发系列4-解决只看得到Passthrough但看不到Unity对象的问题](https://img-blog.csdnimg.cn/89271c8215f043a980c7ec0416a88c6b.png)