- 特征值,特征向量分解
- 特征值,特征向量
- 特征值分解
- 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∗Σ∗P−1 当A是对称方阵时, P − 1 = P T P^{-1}=P^T P−1=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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)