PCA算法可以使得高维数据(mxn)降到低维,而在整个降维的过程中会丢失一定的信息,也会因此而实现降噪除噪的效果,另外,它通过降维可以计算出原本数据集的主成分分量Wk矩阵(kxn),如果将其作为数据样本,则可以将其作为原来数据集特征的主特征分量,如果用在人脸识别领域则可以作为人脸数据集的特征脸 具体实现降噪效果和人脸特征脸的代码如下所示: #1-1利用手写字体数据集MNIST对PCA算法进行使用和效果对比,体现PCA算法的降噪功能 from sklearn import datasets digits=datasets.load_digits() x=digits.data y=digits.target noisy_digits=x+np.random.normal(0,2,size=x.shape) ex=noisy_digits[y==0,][:10] for num in range(1,10): x_num=noisy_digits[y==num,:][:10] ex=np.vstack([ex,x_num]) print(ex.shape) #定义绘图10x10的图像函数,可以看出PCA算法的降噪效果 def plot_digits(data): fig,axes=plt.subplots(10,10,figsize=(10,10),subplot_kw={"xticks":[],"yticks":[]}, gridspec_kw=dict(hspace=0.1,wspace=0.1)) for i ,ax in enumerate(axes.flat): ax.imshow(data[i].reshape(8,8), cmap="binary",interpolation="nearest", clim=(0,16)) plt.show() plot_digits(ex) pca=PCA(0.8) pca.fit(noisy_digits) a=pca.transform(ex) b=pca.inverse_transform(a) plot_digits(b) #1-2PCA算法在人脸识别与特征脸的应用 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import fetch_lfw_people faces=fetch_lfw_people() print(faces.keys()) print(faces.data.shape) def plot_faces(face): fig,axes=plt.subplots(6,6,figsize=(10,10),subplot_kw={"xticks":[],"yticks":[]}, gridspec_kw=dict(hspace=0.1,wspace=0.1)) for i ,ax in enumerate(axes.flat): ax.imshow(face[i].reshape(62,47),cmap="bone") plt.show() random_indexes=np.random.permutation(len(faces.data)) x=faces.data[random_indexes] face1=x[:36,:] plot_faces(face1) from sklearn.decomposition import PCA pca4=PCA(svd_solver="randomized") #利用随机方式进行降维,提高计算的效率 pca4.fit(x) print(pca4.components_.shape) #输出人脸数据集的主要成分的数据集形状组成(mxn),m代表的是降低到的维度,n是指数据的总体原维度 print(plot_faces(pca4.components_[:36,:])) face3=fetch_lfw_people(min_faces_per_person=60) #输出训练图片最少有60个的人脸数据样本 print(face3.data.shape) print(len(face3.target_names)) 运行结果如下所示: