十七.降维之谱分解和奇异值分解

1.谱分解

谱分解又称为特征值分解,只有方阵才能进行谱分解。

(1)特征值和特征向量

方阵 A \mathbf{A} A,如果存在非零向量 x \mathbf{x} x和实数 λ \lambda λ,满足:
A x = λ x \mathbf{Ax}=\lambda \textbf{x} Ax=λx
则称 λ \lambda λ A \mathbf{A} A的特征值, x \mathbf{x} x λ \lambda λ对应 A \mathbf{A} A的特征向量。

(2)特征值分解

方阵 A \mathbf{A} A可以分解为:
A = W Σ W − 1 \mathbf{A}=\mathbf{W}\Sigma \mathbf{W}^{-1} A=WΣW1
其中, W \mathbf{W} W为特征值对应的特征向量组成的矩阵, Σ \Sigma Σ为特征值组成的对角矩阵。
当特征向量为单位正交向量,即:
w i T w i = 1 , w i T w j = 0 \mathbf{w}_{i}^{T}\mathbf{w}_{i}=1,\mathbf{w}_{i}^{T}\mathbf{w}_{j}=0 wiTwi=1,wiTwj=0
则特征向量组成的矩阵 W \mathbf{W} W满足:
W T W = E , W T = W − 1 \mathbf{W}^{T}\mathbf{W}=E,\mathbf{W}^{T}=\mathbf{W}^{-1} WTW=E,WT=W1
此时,方阵 A \mathbf{A} A的特征值分解可以写为:
A = W Σ W T \mathbf{A}=\mathbf{W}\Sigma \mathbf{W}^{T} A=WΣWT

(3)numpy实现特征值分解

生成3*3矩阵

import numpy as np
a = np.random.randn(3,3)
print(a)

输出:

[[-0.55834527 -0.43532198 -1.7491549 ]
 [-0.77599428  0.31747145 -0.14348623]
 [ 0.82501312 -0.42363183 -0.24466913]]

求出特征值和特征向量

e_vals,e_vecs = np.linalg.eig(a)
print('特征值:')
print(e_vals)
print('特征向量矩阵:')
print(e_vecs)

输出:

特征值:
[-0.29093722+0.94740018j -0.29093722-0.94740018j  0.09633149+0.j        ]
特征向量矩阵:
[[-0.71600646+0.j         -0.71600646-0.j          0.31525619+0.j        ]
 [-0.30514196-0.3624265j  -0.30514196+0.3624265j   0.88653391+0.j        ]
 [ 0.18540433+0.47801191j  0.18540433-0.47801191j -0.3386313 +0.j        ]]

特征值组成对角矩阵

e_vals_matrix = np.diag(e_vals)
print(e_vals_matrix )

输出:

[[-0.29093722+0.94740018j  0.        +0.j          0.        +0.j        ]
 [ 0.        +0.j         -0.29093722-0.94740018j  0.        +0.j        ]
 [ 0.        +0.j          0.        +0.j          0.09633149+0.j        ]]

求特征向量组成的矩阵的逆矩阵

e_vecs_inv = np.linalg.inv(e_vecs)
print(e_vecs_inv)

输出:

[[-0.78910799-1.59991045e-01j  0.39500959-4.82338840e-01j
   0.29949451-1.41170619e+00j]
 [-0.78910799+1.59991045e-01j  0.39500959+4.82338840e-01j
   0.29949451+1.41170619e+00j]
 [-0.41240378+0.00000000e+00j  1.79428304+0.00000000e+00j
   1.36041741-6.46882927e-17j]]

验证矩阵分解是否成功

np.allclose( a, np.dot(e_vecs, np.dot(e_vals_matrix, np.linalg.inv(e_vecs))))

输出:

True

2.奇异值分解(SVD)

(1)简介

奇异值分解可以对任意形状的矩阵进行。
对矩阵 A ∈ R m × n \textbf{A}\in R^{m\times n} ARm×n进行奇异值分解:
A = U Σ V − 1 \textbf{A}=\mathbf{U\Sigma V^{-1}} A=UΣV1
其中, U ∈ R m × m \mathbf{U}\in R^{m\times m} URm×m为左奇异矩阵,是由 A A T \mathbf{AA^{T}} AAT m m m个特征向量组成的矩阵; V ∈ R n × n \mathbf{V}\in R^{n\times n} VRn×n为右奇异矩阵,是由 A T A \mathbf{A^{T}A} ATA n n n个特征向量组成的矩阵; Σ ∈ R m × n \mathbf{\Sigma }\in R^{m\times n} ΣRm×n是由奇异值 σ \sigma σ组成的对角矩阵,奇异值和特征值的关系为 σ = λ \sigma=\sqrt{\lambda } σ=λ

(2)SVD和PCA

PCA需要求协方差矩阵 X T X \mathbf{X^{T}X} XTX,计算量大。而有些求SVD的方法可以不通过协方差矩阵直接求出左奇异矩阵和右奇异矩阵。
左奇异矩阵可以对矩阵进行行压缩,右奇异矩阵可以进行列压缩。

(3)numpy实现SVD

生成3*4矩阵

import numpy as np
a = np.random.randn(3,4)
print(a)

输出:

[[ 0.62792926 -0.37274349  0.07758746  0.48700254]
 [-0.42410401  1.77721975  2.52468661  1.41474801]
 [ 1.91585643 -0.6565746   0.7721693  -0.54750592]]

奇异值分解

u,s,v = np.linalg.svd(a)
print('左奇异矩阵')
print(u)
print('奇异值向量')
print(s)
print('右奇异矩阵')
print(v)

输出:

左奇异矩阵
[[-0.01748221 -0.26483323  0.96413574]
 [ 0.9925762  -0.12067706 -0.01515022]
 [-0.12036135 -0.95671334 -0.26497687]]
奇异值向量
[3.4368963  2.28903121 0.66033099]
右奇异矩阵
[[-0.19276933  0.53815084  0.70169359  0.42527611]
 [-0.85103353  0.22384967 -0.46480981  0.09790348]
 [ 0.15776433 -0.32154103 -0.25449617  0.89830589]
 [ 0.46226868  0.74625489 -0.47624536  0.0510065 ]]
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值