一、特征值与特征向量基本概念及小示例
''' 特征值与特征向量---针对矩阵而言的,主要记载矩阵信息 对于n阶方阵A,如果存在数a和非零n维列向量x,使得Ax = ax,则称a是矩阵A的一个特征值,x是矩阵A数据特征值a的特征向量 ---已知方阵A,求特征值和特征向量的numpy实现:eigvals,eigvecs = np.linalg.eig(A) ---已知特征值和特征向量,求方正A的numpy实现:A = eigvecs * np.diag(eigvals) * eigvecs.I ----是由Ax = ax推导出来的 ''' import numpy as np A = np.mat('4 8 9;3 5 8;1 9 3') print(A) # 提取特征信息 eigvals, eigvecs = np.linalg.eig(A) print(eigvals, type(eigvals)) print(eigvecs, type(eigvecs)) # 对eigvals进行对角化处理,数据类型为数组 print(np.diag(eigvals)) # 逆向推导方阵 A2 = eigvecs * np.diag(eigvals) * eigvecs.I print(A2) # 如果只保留一部分特征值,则: # 应用:图片处理保留主要特征 eigvals[2:] = -4 A3 = eigvecs * np.diag(eigvals) * eigvecs.I print(A3) 输出结果: [[4 8 9] [3 5 8] [1 9 3]] [15.5686571 0.58730164 -4.15595874] <class 'numpy.ndarray'> [[-0.71687407 -0.93836182 -0.2784087 ] [-0.53860537 0.01165284 -0.57860785] [-0.44271415 0.34545812 0.76661696]] <class 'numpy.matrix'> [[15.5686571 0. 0. ] [ 0. 0.58730164 0. ] [ 0. 0. -4.15595874]] [[4. 8. 9.] [3. 5. 8.] [1. 9. 3.]] [[3.98919756 8.03959409 8.96932196] [2.97754964 5.08228713 7.93624281] [1.02974524 8.89097501 3.08447404]]
二、提取图片特征值:----仅限于图片像素矩阵为方阵
''' 提取图像特征值,保留部分特征,生成新图片 ''' import numpy as np import scipy.misc as sm # 提供读取图片的方法 import matplotlib.pyplot as mp import imageio image1 = sm.imread('./da_data/lily.jpg', True) # 第二个参数为布尔值,表示是否对图片进行亮度处理,若true则起到降维作用 print(image1, image1.shape, type(image1)) # 提取image特征 eigvals, eigvecs = np.linalg.eig(image1) print(eigvals, type(eigvals), eigvals.size) print(eigvecs, type(eigvecs), eigvals.size) # 逆向生成图片 # 只保留50个特征值 eigvals[50:] = 0 image2 = np.mat(eigvecs) * np.diag(eigvals) * np.matrix(eigvecs).I mp.figure('EIG Image', facecolor='lightgray') mp.subplot(121, title='IMAGE1') mp.imshow(image1, cmap='rainbow') mp.xticks([]) mp.yticks([]) mp.subplot(122, title='IMAGE2') mp.imshow(image2.real, cmap='rainbow') mp.xticks([]) mp.yticks([]) mp.show()
三、奇异值分解基本概念及小示例
''' 奇异值分解----不仅可以处理方阵,还可以处理非方阵 概念:有一个矩阵M,可以分解为3个矩阵U、S、V,是的U*S*V=M,U与V都是正交矩阵(乘以自身的转置矩阵的结果为单位矩阵),那么S矩阵 主对角线上的值称为M的奇异值,其他元素都是0 numpy中实现奇异值求解: U,sv,V = np.linalg.svd(M) ---sv为分解所得的奇异值数组,U,V为正交矩阵 numpy中通过U,sv,V求解M:M = U * np.diag(sv) * V ''' import numpy as np A = np.mat('4 8 9;3 5 8') print(A) # 提取奇异值 U, sv, V = np.linalg.svd(A, full_matrices=False) # full_matrices可以保证逆向生成原方阵,针对的是V print(sv) print(U * np.diag(sv) * V)
输出结果:
[[4 8 9]
[3 5 8]]
[16.04488896 1.24961523]
[[4. 8. 9.]
[3. 5. 8.]]
四、奇异值在图片处理中的应用---提取图片中的奇异值
-----奇异值在图片处理中优于特征值在图片处理中的应用,主要有两点:
1.特征值只能处理方阵,即像素阵必须为方阵,而奇异值可以使非方阵
2.对奇异值数组和特征值数组抹去同样个数的值,再去生成新的图片时,奇异值所生成的图片效果要好于特征值
''' 奇异值分解----不仅可以处理方阵,还可以处理非方阵 概念:有一个矩阵M,可以分解为3个矩阵U、S、V,是的U*S*V=M,U与V都是正交矩阵(乘以自身的转置矩阵的结果为单位矩阵),那么S矩阵 主对角线上的值称为M的奇异值,其他元素都是0 numpy中实现奇异值求解: U,sv,V = np.linalg.svd(M) ---sv为分解所得的奇异值数组,U,V为正交矩阵 numpy中通过U,sv,V求解M:M = U * np.diag(sv) * V ''' import numpy as np import scipy.misc as sm # 提供读取图片的方法 import matplotlib.pyplot as mp import imageio image1 = sm.imread('./da_data/lily.jpg', True) # 第二个参数为布尔值,表示是否对图片进行亮度处理,若true则起到降维作用 print(image1, image1.shape, type(image1)) image = sm.imread('./da_data/1.jpg', True) # 提取image特征值 eigvals, eigvecs = np.linalg.eig(image1) print(eigvals, type(eigvals), eigvals.size) print(eigvecs, type(eigvecs), eigvals.size) # 逆向生成图片 # 只保留50个特征值 eigvals[50:] = 0 image2 = np.mat(eigvecs) * np.diag(eigvals) * np.matrix(eigvecs).I # 奇异值分解--方阵情况 U, sv, V = np.linalg.svd(image1) # 抹掉部分奇异值,生成新图片---只保留50个奇异值 sv[50:] = 0 image3 = np.mat(U) * np.mat(np.diag(sv)) * np.mat(V) # 奇异值分解--非方阵情况,在处理非方阵是full_matrices主要针对V(因为V为方正,其维度无法与U*sv的结果相乘) U, sv, V = np.linalg.svd(image, full_matrices=False) # 抹去部分奇异值 sv[50:] = 0 image4 = np.mat(U) * np.mat(np.diag(sv)) * np.mat(V) mp.figure('EIG Image', facecolor='lightgray') mp.subplot(321, title='IMAGE1') mp.imshow(image1, cmap='gray') mp.xticks([]) mp.yticks([]) mp.subplot(322, title='IMAGE2') mp.imshow(image2.real, cmap='gray') mp.xticks([]) mp.yticks([]) mp.subplot(323, title='IMAGE3') mp.imshow(image3.real, cmap='gray') mp.xticks([]) mp.yticks([]) mp.subplot(324, title='IMAGE') mp.imshow(image.real, cmap='gray') mp.xticks([]) mp.yticks([]) mp.subplot(325, title='IMAGE4') mp.imshow(image4.real, cmap='gray') mp.xticks([]) mp.yticks([]) mp.show()