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))
運行結果如下所示: