日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

SVD理論以及Python實現

系統 2011 0

SVD

將一個矩陣分解為U,V(U,V均為列正交矩陣,即列向量直接內積為0),中間的矩陣為對角陣,元素為奇異值。

A [ m ? n ] = U [ m ? r ] ? ∑ [ r ? r ] ? ( V [ n ? r ] ) T A_{[m*n]} = U_{[m*r]} * \sum_{[r*r]} *(V_{[n*r]})^T A [ m ? n ] ? = U [ m ? r ] ? ? [ r ? r ] ? ? ( V [ n ? r ] ? ) T

SVD計算方式

A = U ? ∑ ? V T A T = V ? ∑ ? U T A A T = U ? ∑ ? V T ? V ? ∑ ? U T A = U * \sum * V^T \\ A^T = V * \sum * U ^T \\ AA^T = U * \sum * V^T * V * \sum * U^T A = U ? ? V T A T = V ? ? U T A A T = U ? ? V T ? V ? ? U T

  • 由于其為列正交向量,所以矩陣在非對角位置都為0, 因此當V的列向量是單位向量時,對角位為1,則為單位陣。

A A T = U ∑ 2 U T A A T U = U ∑ 2 AA^T = U {\sum}^2U^T \\ AA^T U = U {\sum}^2 A A T = U 2 U T A A T U = U 2
因此,U為 A A T AA^T A A T 特征向量構成的矩陣,然后 ∑ 2 {\sum}^2 2 的對角元為特征值。

同理,可知, A T A A^TA A T A 對應于V的計算。

Python實現

  • 導入包
            
              
                import
              
               numpy 
              
                as
              
               np

            
          
  • 創建數據
            
              A 
              
                =
              
               np
              
                .
              
              linspace
              
                (
              
              
                0
              
              
                ,
              
              
                14
              
              
                ,
              
              
                15
              
              
                )
              
              
                .
              
              reshape
              
                (
              
              
                (
              
              
                3
              
              
                ,
              
              
                -
              
              
                1
              
              
                )
              
              
                )
              
              
A

            
          
            
              array
              
                (
              
              
                [
              
              
                [
              
              
                0
              
              
                .
              
              
                ,
              
              
                1
              
              
                .
              
              
                ,
              
              
                2
              
              
                .
              
              
                ,
              
              
                3
              
              
                .
              
              
                ,
              
              
                4
              
              
                .
              
              
                ]
              
              
                ,
              
              
                [
              
              
                5
              
              
                .
              
              
                ,
              
              
                6
              
              
                .
              
              
                ,
              
              
                7
              
              
                .
              
              
                ,
              
              
                8
              
              
                .
              
              
                ,
              
              
                9
              
              
                .
              
              
                ]
              
              
                ,
              
              
                [
              
              
                10
              
              
                .
              
              
                ,
              
              
                11
              
              
                .
              
              
                ,
              
              
                12
              
              
                .
              
              
                ,
              
              
                13
              
              
                .
              
              
                ,
              
              
                14
              
              
                .
              
              
                ]
              
              
                ]
              
              
                )
              
            
          
  • 實現
            
              
                def
              
              
                SVD
              
              
                (
              
              A
              
                ,
              
               n
              
                )
              
              
                :
              
              
    M 
              
                =
              
               np
              
                .
              
              dot
              
                (
              
              A
              
                ,
              
               A
              
                .
              
              T
              
                )
              
              
    eigval
              
                ,
              
               eigvec 
              
                =
              
               np
              
                .
              
              linalg
              
                .
              
              eig
              
                (
              
              M
              
                )
              
              
    indexes 
              
                =
              
               np
              
                .
              
              argsort
              
                (
              
              
                -
              
              eigval
              
                )
              
              
                [
              
              
                :
              
              n
              
                ]
              
              
    U 
              
                =
              
               eigvec
              
                [
              
              
                :
              
              
                ,
              
               indexes
              
                ]
              
              
    sigma_sq 
              
                =
              
               eigval
              
                [
              
              indexes
              
                ]
              
              
    M 
              
                =
              
               np
              
                .
              
              dot
              
                (
              
              A
              
                .
              
              T
              
                ,
              
               A
              
                )
              
              
    eigval
              
                ,
              
               eigvec 
              
                =
              
               np
              
                .
              
              linalg
              
                .
              
              eig
              
                (
              
              M
              
                )
              
              
    indexes 
              
                =
              
               np
              
                .
              
              argsort
              
                (
              
              
                -
              
              eigval
              
                )
              
              
                [
              
              
                :
              
              n
              
                ]
              
              
    V 
              
                =
              
               eigvec
              
                [
              
              
                :
              
              
                ,
              
               indexes
              
                ]
              
              
    sigma 
              
                =
              
               np
              
                .
              
              diag
              
                (
              
              np
              
                .
              
              sqrt
              
                (
              
              sigma_sq
              
                )
              
              
                )
              
              
                #     print(sigma)
              
              
                return
              
               np
              
                .
              
              dot
              
                (
              
              np
              
                .
              
              dot
              
                (
              
              U
              
                ,
              
               sigma
              
                )
              
              
                ,
              
               V
              
                .
              
              T
              
                )
              
            
          
  • 調用
            
              A_ 
              
                =
              
               SVD
              
                (
              
              A
              
                ,
              
              
                2
              
              
                )
              
              
A_

            
          
            
              array
              
                (
              
              
                [
              
              
                [
              
              
                2.01625019e-16
              
              
                ,
              
              
                1.00000000e+00
              
              
                ,
              
              
                2.00000000e+00
              
              
                ,
              
              
                3.00000000e+00
              
              
                ,
              
              
                4.00000000e+00
              
              
                ]
              
              
                ,
              
              
                [
              
              
                5.00000000e+00
              
              
                ,
              
              
                6.00000000e+00
              
              
                ,
              
              
                7.00000000e+00
              
              
                ,
              
              
                8.00000000e+00
              
              
                ,
              
              
                9.00000000e+00
              
              
                ]
              
              
                ,
              
              
                [
              
              
                1.00000000e+01
              
              
                ,
              
              
                1.10000000e+01
              
              
                ,
              
              
                1.20000000e+01
              
              
                ,
              
              
                1.30000000e+01
              
              
                ,
              
              
                1.40000000e+01
              
              
                ]
              
              
                ]
              
              
                )
              
            
          

非常近了,然后量化判斷下,用二范數來測量下:

            
              np
              
                .
              
              linalg
              
                .
              
              norm
              
                (
              
              A_ 
              
                -
              
               A
              
                )
              
            
          
  • 總共的誤差: 1.8697717541841314e-14
  • 非常的小了。

更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 青阳县| 西乌珠穆沁旗| 平乐县| 南陵县| 顺平县| 温州市| 安丘市| 阿坝县| 栾川县| 新巴尔虎左旗| 荣昌县| 高要市| 嘉黎县| 双桥区| 普定县| 临沂市| 四子王旗| 呼图壁县| 海口市| 鱼台县| 哈巴河县| 固始县| 闸北区| 黄平县| 城固县| 满洲里市| 达日县| 虎林市| 柳江县| 麻栗坡县| 兴城市| 上蔡县| 通河县| 龙州县| 紫金县| 鞍山市| 肇东市| 肃北| 华容县| 新丰县| 永新县|