在网上看了很多,大概理解了,结合老师所讲解的一个例子,大概谈谈自己的理解
奇异值分解就是对一堆数据生成的矩阵,提取里面的特征
对这个m*n的矩阵T进行降维进行奇异值分解
取它前r个非零奇异值,可以还原原来的矩阵,即前r个非零奇异值所对应的奇异向量代表了矩阵T的主要特征
import cv2
import numpy as np
import matplotlib.pyplot as plt
def Img_PCA(img,a): #img为输入图像,a为保留主成分比例
U,S,V=np.linalg.svd(img) #将img进行奇异值分解,U为左酉矩阵大小M*M,S为奇异值,V为右酉矩阵N*N。
SS=np.zeros(img.shape)
for i in range(len(S)):
SS[i][i]=S[i] #将S转化为M*N对角矩阵
sval=np.sum(S)
for i in range(len(S)):
if np.sum(S[:i]) >= a*sval:
k=i+1
break
Uk=U[:,0:k]
Sk=SS[0:k,0:k]
Vk=V[0:k,:]
img_pca = np.uint8(np.dot(np.dot(Uk,Sk),Vk)) #计算降维处理后的矩阵
return img_pca