宁乡县住房和城乡建设局网站,手机怎样制作网页,迅速网站,网站开发多少钱当AAA是方阵时#xff0c;可以很容易地进行特征分解#xff1a;AWΣW−1AW\Sigma W^{-1}AWΣW−1#xff0c;其中Σ\SigmaΣ是AAA的特征值组成的对角矩阵。如果WWW由标准正交基组成#xff0c;则W−1WTW^{-1}W^TW−1WT#xff0c;特征分解可进一步写成WTΣWW^T\Sigma WWTΣ…当AAA是方阵时可以很容易地进行特征分解AWΣW−1AW\Sigma W^{-1}AWΣW−1其中Σ\SigmaΣ是AAA的特征值组成的对角矩阵。如果WWW由标准正交基组成则W−1WTW^{-1}W^TW−1WT特征分解可进一步写成WTΣWW^T\Sigma WWTΣW。
然而当AAA不是方阵时情况大不一样了但仍然可以将AAA表示成AUΣVTAU\Sigma V^TAUΣVT的形式其中Σ\SigmaΣ也是对角矩阵对角线上的每个元素被称作奇异值。
奇异值的求解过程和特征值息息相关因为把AAA变成方阵很简单只要乘以转置就行。故令LAATLAA^TLAATRATARA^TARATA则L,RL, RL,R都可以求特征值λi\lambda_iλi和特征向量其中LLL的特征向量为AAA的左奇异向量RRR的特征向量为右奇异向量。对应的奇异值σiλi\sigma_i\sqrt{\lambda_i}σiλi。
numpy.linalg中提供了奇异值分解函数svd参数为
svd(a, full_matricesTrue, compute_uvTrue, hermitianFalse)其中
a 待分解矩阵维度为(M, N)full_matrices 若为True则U, Vh分别为(M, M)和(N, N)否则分别为(M, K), (K, N)K为M, N中较小的那个compute_uv 如果为False则不计算U, Vhhermitian 为True时表示处理的是实对称矩阵
scipy.linalg中也提供了奇异值分解函数svd其参数为
svd(a, full_matricesTrue, compute_uvTrue, overwrite_aFalse, check_finiteTrue, lapack_drivergesdd)其中与numpy.linalg相同的参数其意义也相同不相同的部分各参数含义如下
overwrite_a 如果为True则直接对a进行修改check_finite 如果为True则进行有限性检查lapack_driver SVD分解的方法有两个选择 gesdd 效率更高gesvd 此为Matlab和R中使用的方法
其返回值即U,Σ,VTU, \Sigma, V^TU,Σ,VT。
scipy.linalg还提供了两个和SVD相关的函数svdvals(a)用于求a的奇异值diagsvd(s, M, N)通过s, M, N创建一个Σ\SigmaΣ矩阵。
下面测试一下svd
import numpy as np
import scipy.linalg as sl
a np.random.rand(5,5)
u1, s1, vh1 sl.svd(a)
u2, s2, vh2 np.linalg.svd(a)
print(s1)
# [2.63698545 0.94063722 0.36159198 0.21052102 0.19014115]
print(s1-s2)
# [ 0.0 0.0 1.11022302e-16 -2.77555756e-17 0.0]numpy和scipy的结果是几乎相同的下面测试一下不同方法进行奇异值分解的时间
from timeit import timeit
a np.random.rand(1000,1000)
timeit(lambda:sl.svd(a), number10)
# 1.870287900000001
timeit(lambda:np.linalg.svd(a), number10)
# 13.355788999999998
timeit(lambda:sl.svd(a, lapack_drivergesvd), number10)
# 3.873418600000001