用python代码验证特征值、特征向量分解和奇异值分解

用python代码验证特征值、特征向量分解和奇异值分解,第1张

文章目录
    • 特征值,特征向量分解
      • 特征值,特征向量
      • 特征值分解
    • SVD奇异值分解

特征值,特征向量分解 特征值,特征向量

A ⃗ ∗ v ⃗ = λ ∗ v ⃗ \vec A*\vec v=\lambda * \vec v A v =λv

只有方阵,才能进行特征值,特征向量分解。


协方差矩阵是对称方阵,其每个维度的数据量就是特征数。


这也是为什么协方差矩阵可以进行特征值、特征向量分解的原因。


PCA降维的原理就是对协方差进行特征值,特征向量分解,找到重要的特征方向。


import numpy as np
np.random.seed(0)
a=np.random.randint(1,10,size=(3,3)) # 构建方阵
a
array([[6, 1, 4],
       [4, 8, 4],
       [6, 3, 5]])
eigen,ev=np.linalg.eig(a)
display(eigen,ev)
array([13.28906266,  0.3964637 ,  5.31447364])

array([[ 0.40460105,  0.55943531,  0.44858832],
       [ 0.72627145,  0.13584764, -0.88211861],
       [ 0.55572275, -0.81766592,  0.14364987]])
  • 取出第一个特征值和特征向量,验证公式
a.dot(ev[:,0])
array([5.37676876, 9.65146679, 7.3850344 ])
eigen[0]*ev[:,0]
array([5.37676876, 9.65146679, 7.3850344 ])
特征值分解

A = P ∗ Σ ∗ P − 1 A=P*\Sigma*P^{-1} A=PΣP1 当A是对称方阵时, P − 1 = P T P^{-1}=P^T P1=PT

验证公式

eigen
array([13.28906266,  0.3964637 ,  5.31447364])
# 构造对角矩阵
sigma=np.diag(eigen)
ev.dot(sigma).dot(np.linalg.inv(ev))
array([[6., 1., 4.],
       [4., 8., 4.],
       [6., 3., 5.]])

和原来结果对比

a
array([[6, 1, 4],
       [4, 8, 4],
       [6, 3, 5]])
SVD奇异值分解

并不是所有的矩阵都可以进行特征值,特征向量分解。


奇异值分解是对原矩阵的一种近似分解。


B = U ∗ Σ ∗ V T B=U*\Sigma*V^T B=UΣVT U和V都是酉矩阵

b=np.random.randint(1,10,size=(5,3))
u,sigma,vh=np.linalg.svd(b)
display(u.shape,sigma.shape,vh.shape)
(5, 5)
(3,)
(3, 3)
# 构造对角矩阵
sigma_matrix=np.zeros((5,3))
sigma_matrix[:3,:3]=np.diag(sigma)
sigma_matrix
array([[19.59246337,  0.        ,  0.        ],
       [ 0.        ,  7.52382243,  0.        ],
       [ 0.        ,  0.        ,  2.12778643],
       [ 0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ]])
# 验证公式
np.allclose(b,u.dot(sigma_matrix).dot(vh))
True

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/579750.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-11
下一篇 2022-04-11

发表评论

登录后才能评论

评论列表(0条)

保存