特征值和特征向量

对于n阶方阵A,如果存在数a和非零n维列向量x,使得Ax=ax,则称a是矩阵A的一个特征值,x是矩阵A属于特征值a的特征向量

#已知n阶方阵A, 求特征值与特征数组
# eigvals: 特征值数组
# eigvecs: 特征向量数组 
eigvals, eigvecs = np.linalg.eig(A)
#已知特征值与特征向量,求方阵
S = np.mat(eigvecs) * np.mat(np.diag(eigvals)) * np.mat(eigvecs逆) 

案例:

"""
 特征值提取
"""
import numpy as np

A = np.mat('1 3 6; 2 8 4; 7 9 2')
print(A)
"""
[[1 3 6]
 [2 8 4]
 [7 9 2]]
"""
# 提取特征值与特征向量
eigvals, eigvecs = np.linalg.eig(A)
print(eigvals)#[14.21001548 -5.47304086  2.26302539]
print(eigvecs)
"""
[[ 0.44215443  0.6411674   0.72030524]
 [ 0.58199892  0.12939322 -0.54780134]
 [ 0.68247836 -0.75641375  0.42552797]]
"""
# 逆向推导原矩阵
M = eigvecs * np.diag(eigvals) * eigvecs.I
print(M)
"""
[[1. 3. 6.]
 [2. 8. 4.]
 [7. 9. 2.]]
"""
# 抹掉部分特征值,生成原矩阵
eigvals[2:] = 0
M = eigvecs * np.diag(eigvals) * eigvecs.I
print(M)
"""
[[0.08157038 4.34154338 5.45098762]
 [2.69847746 6.97973912 4.41753093]
 [6.45742795 9.792531   1.67566511]]
"""

 

import numpy as np
A = np.mat('3 -2; 1 0')
print(A)
"""
[[ 3 -2]
 [ 1  0]]
"""
eigvals, eigvecs = np.linalg.eig(A)
print(eigvals)#[2. 1.]
print(eigvecs)
"""
[[0.89442719 0.70710678]
 [0.4472136  0.70710678]]
"""
print(A * eigvecs[:, 0])    # 方阵*特征向量
"""
[[1.78885438]
 [0.89442719]]
"""
print(eigvals[0] * eigvecs[:, 0])    #特征值*特征向量
"""
[[1.78885438]
 [0.89442719]]
"""
S = np.mat(eigvecs) * np.mat(np.diag(eigvals)) * np.mat(eigvecs.I)
print(S)
"""
[[ 3.00000000e+00 -2.00000000e+00]
 [ 1.00000000e+00 -4.05861454e-17]]
"""

案例:读取图片的亮度矩阵,提取特征值与特征向量,保留部分特征值,重新生成新的亮度矩阵,绘制图片。

# 图片特征提取
import numpy as np
import scipy.misc as sm
import matplotlib.pyplot as mp

# 读取图片数据,True提取项目矩阵
img = sm.imread('lily.jpg', True)
print(img, img.shape)
"""
[[36.742 35.97  34.97  ... 54.102 54.33  51.042]
 [37.742 37.742 37.97  ... 54.102 53.33  51.042]
 [40.34  41.112 40.34  ... 51.732 51.846 50.857]
 ...
 [ 5.228  6.228  5.929 ... 71.666 68.954 68.242]
 [ 6.228  6.228  4.929 ... 73.182 72.182 71.242]
 [ 6.228  6.228  4.929 ... 69.709 71.709 74.242]] (512, 512)
"""
# 提取特征值
eigvals, eigvecs = np.linalg.eig(np.mat(img))
#逆向推到原矩阵
eigvals[50:] = 0
img2 = eigvecs*np.diag(eigvals)*eigvecs.I
# 绘制图片
mp.figure('Lily', facecolor='lightgray')
mp.subplot(121)
mp.imshow(img,cmap='gray')
mp.xticks([])
mp.yticks([])
mp.subplot(122)
mp.imshow(img2.real,cmap='gray')
mp.xticks([])
mp.yticks([])
mp.tight_layout()
mp.show()

 

posted @ 2019-09-09 09:46  maplethefox  阅读(862)  评论(0编辑  收藏  举报