对于任意矩阵
A
m
×
n
A_{m\times n}
Am×n,根据奇异值分解理论,我们有等式
A
=
P
Σ
Q
T
A=P\Sigma Q^T
A=PΣQT
其中, P P P是对称矩阵 A A T AA^T AAT的特征向量组成的 m m m阶方阵, Q Q Q是对称矩阵 A T A A^TA ATA的特征向量组成的 n n n阶方阵, Σ \Sigma Σ是对角线上由 A A A的特征值组成的 m × n m\times n m×n对角矩阵。
现在,我们用scipy的svd来做计算实例。
# 导入第三方库
import numpy as np
from scipy.linalg import svd
# 随意生成一个3*5矩阵
A = np.random.randint(50, size=(3, 5))
array([[ 2, 35, 7, 38, 10],
[36, 48, 44, 29, 48],
[10, 9, 25, 41, 8]])
# 对矩阵A做svd分解并打印
p, s, q = svd(A)
print('P矩阵为\n', p)
print(' ')
print('A的特征值为\n', s)
print(' ')
print('Q的转置为\n', q)
P矩阵为
[[-0.41175322 0.6156175 -0.67191843]
[-0.8237077 -0.56682763 -0.01456235]
[-0.38982677 0.5474683 0.74048198]]
A的特征值为
[110.18800362 37.13295888 23.10296999]
Q的转置为
[[-0.31196909 -0.52145217 -0.44352451 -0.50383927 -0.42449372]
[-0.36894115 -0.01976408 -0.18701407 0.79179427 -0.44897593]
[ 0.23965483 -0.7597205 0.56996469 0.19064876 -0.06468091]
[ 0.25901284 -0.36448948 -0.62607977 0.28725845 0.57058432]
[-0.80127126 -0.13292553 0.22688349 -0.01853266 0.53709925]]
现在,我们可以将 P P P和 Q Q Q乘回去,看看能否得到原来的矩阵 A A A。
P P P和 Q T Q^T QT已经给出,我们只需要生成对角矩阵 Σ \Sigma Σ。
# 生成矩阵sigma
sigma = np.diag(s, 1)[:, 1:]
array([[110.18800362, 0, 0, 0, 0],
[0, 37.13295888, 0, 0, 0],
[0, 0, 23.10296999, 0, 0]])
# 计算p*sigma*q,复原矩阵A
p.dot(sigma).dot(q)
array([[ 2., 35., 7., 38., 10.],
[36., 48., 44., 29., 48.],
[10., 9., 25., 41., 8.]])