如何用python實現SVD分解呢?

時間 2022-01-05 18:52:14

1樓:

#將陣列按第一行從大到小排序

order

=lambdaA:

A.T[

np.argsort(-

A.T[:,

0]),].T

#補齊列空間的單位正交基

add_null

=lambdaU:

np.row_stack((U

.T,scipy

.linalg

.null_space(U

.T).

T)).T

defsvd(A

):m,n

=A.shape

#判斷矩陣形狀ifm

>=n:

#Step 1:通過求解A.T @ A特徵值及特徵向量,得到V和sigmax=

np.linalg

.eig(A

.T@A

)X=order(np

.row_stack((x

[0].

real,x

[1].

real

)))# 將sigma 和V 按照特徵值從大到小排列sigma=np

.sqrt

(abs(X

[0,:]))

#由特徵值求得奇異值,用abs是因為某些情況有捨入誤差使得產生很小的負數,無法開根號V=

X[1:,:]

#Step 2:由 A = U @ sigma @ V.T 求出 UU=

A@V@

np.diag(1

/sigma)U

=add_null(U

)#將U補為m階正交矩陣

return(U

,sigma,V

.T)else:U

,S,V

=svd(A

.T)return(V

.T,S

,U.T

)改進了一下Anges大佬的答案。

2樓:滿天星

上面有人回答過了,

我來安利另外乙個答案,對SVD分解的理解

張磊:SVD-矩陣奇異值分解 —— 原理與幾何意義感覺還算有道理,希望當你看了會有自己的理解。祝好。

3樓:熱愛生活的xyz

你要是有功夫的話可以用特徵值分解的方法求解SVD,當然你必須得對SVD的原理理解的很透徹了才行,編出來了也就徹底明白了SVD了。

如何用python實現行列互換?

程式設計小白一枚,使用python 3.6 笨辦法 b fori inrange len a 0 row forj inrange len a row.a j i b.row print b 以上寫成一句 print row i for rowina fori inrange len a 0 用函式...

如何用Python程式設計,實現輸入多個單詞,按單詞長度排序輸出並計算每個字母出現的頻率

以下是其中一種方式供參考,最重要是找到合適的資料結構 usr bin python coding utf 8 input str input 請輸入多個單詞,以空格隔開 input list input str.split word list char dic for word in input l...

如何用python控制arduino?

FLAGYAN Arduino板子的韌體 下位機 在自帶的IDE裡面有,路徑Examples Firmata StandardFirmata,寫入這個韌體就可以在PC上寫python的程式直接控制,python直接執行在PC上,通過frimata協議給板子發命令執行相應的操作。 許俊彬 Arduin...