奇异值分解
有一个矩阵M, 可以分解为3个矩阵U S V, 使得UxSxV等于M. U与V都是正交矩阵(乘以自身的转置矩阵结果为单位矩阵). 那么S矩阵主对角线上的元素称为矩阵M的奇异值, 其他元素都为0.
# 奇异值分解 U与V都是正交矩阵
# s: 奇异值数组
U, s, V = np.linalg.svd(M)
# 逆向推导原矩阵:
S = U * np.diag(s) * V
案例: 读取图片亮度矩阵,提取奇异值.保留部分奇异值,重新生成图片.
"""
奇异值分解
"""
import numpy as np
import scipy.misc as sm
import matplotlib.pyplot as mp
image = sm.imread('../da_data/lily.jpg', True)
print(type(image), image.shape)
# 提取image矩阵的特征值与特征向量
eigvals, eigvecs = np.linalg.eig(image)
# 抹掉一部分特征值 重新生成新的图片
print(eigvals.shape)
eigvals[100:] = 0
S = np.mat(eigvecs) * \
np.mat(np.diag(eigvals)) * \
np.mat(eigvecs).I
S = S.real
# 奇异值分解
U, s, V = np.linalg.svd(image)
S2 = np.mat(U)*np.mat(np.diag(s))*np.mat(V)
# 保留部分奇异值 生成图片
s[100:] = 0
S3 = np.mat(U)*np.mat(np.diag(s))*np.mat(V)
mp.figure('Lily Features',facecolor='lightgray')
mp.subplot(2,2,1)
mp.xticks([])
mp.yticks([])
mp.imshow(image, cmap='gray')
mp.subplot(2,2,2)
mp.xticks([])
mp.yticks([])
mp.imshow(S, cmap='gray')
mp.subplot(2,2,3)
mp.xticks([])
mp.yticks([])
mp.imshow(S2, cmap='gray')
mp.subplot(2,2,4)
mp.xticks([])
mp.yticks([])
mp.imshow(S3, cmap='gray')
mp.tight_layout()
mp.show()