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

文章目录

    • 特征值,特征向量分解
      • 特征值,特征向量
      • 特征值分解
    • 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

你可能感兴趣的:(程序员的数学,机器学习,线性代数,机器学习,python)