日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

SVD理论以及Python实现

發布時間:2025/4/16 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SVD理论以及Python实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SVD

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

A[m?n]=U[m?r]?∑[r?r]?(V[n?r])TA_{[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?∑?VTAT=V?∑?UTAAT=U?∑?VT?V?∑?UTA = U * \sum * V^T \\ A^T = V * \sum * U ^T \\ AA^T = U * \sum * V^T * V * \sum * U^TA=U??VTAT=V??UTAAT=U??VT?V??UT

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

AAT=U∑2UTAATU=U∑2AA^T = U {\sum}^2U^T \\ AA^T U = U {\sum}^2AAT=U2UTAATU=U2
因此,U為AATAA^TAAT特征向量構成的矩陣,然后∑2{\sum}^22的對角元為特征值。

同理,可知,ATAA^TAATA對應于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
  • 非常的小了。

總結

以上是生活随笔為你收集整理的SVD理论以及Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。