一、特征值與特征向量基本概念及小示例
''' 特征值與特征向量---針對矩陣而言的,主要記載矩陣信息 對於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()

