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...