欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据分析之特征值与奇异值

程序员文章站 2022-07-15 10:56:16
...

特征值和特征向量

对于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.I) 
import numpy as np
import scipy.misc as sm
import matplotlib.pyplot as mp

# 读取图片文件,获取数组,imread方法在scipy的1.2.0后已经不在支持,可以采用imageio来获取数据
img_array = sm.imread("图片文件路径", True)
print(img_array)

# 得到特征值与特征向量
eigvals, eigvecs = np.linalg.eig(img_array)
print(eigvals.dtype)
print(eigvecs)

#  抹掉特征值与特征向量
eigvals[200:] = 0
print(eigvals)

img = np.mat(eigvecs) * np.mat(np.diag(eigvals)) * np.mat(eigvecs).I
mp.subplot(121)
mp.imshow(img_array)

mp.subplot(122)
mp.imshow(img.real, cmap="gray")
mp.tight_layout()
mp.show()

奇异值分解(SVD)

有一个矩阵M,可以分解为3个矩阵U、S、V,使得U x S x V等于M。U与V都是正交矩阵(乘以自身的转置矩阵结果为单位矩阵)。那么S矩阵主对角线上的元素称为矩阵M的奇异值,其它元素均为0。

import numpy as np
import scipy.misc as sm
import matplotlib.pyplot as mp


original = sm.imread('图片文件路径', True)
#提取奇异值  sv 	
U, sv, V = np.linalg.svd(original)
print(U.shape, sv.shape, V.shape)
sv[50:] = 0
original2 = np.mat(U) * np.mat(np.diag(sv)) * np.mat(V)
mp.figure("Picture")
mp.subplot(121)
mp.xticks([])
mp.yticks([])
mp.imshow(original, cmap='gray')

mp.subplot(122)
mp.xticks([])
mp.yticks([])
mp.imshow(original2, cmap='gray')
mp.tight_layout()
相关标签: 特征值与奇异值