PCA人脸识别降维+PCA实现噪音过滤--from 菜菜机器学习

        PCA与特征选择的区别在于特征选择后的特征矩阵是可读的,而PCA降维之后的新特征向量是不可读的,PCA是将已存在的特征进行压缩,降维完毕后的特征不是原本特征矩阵中的任何一个特征,而是通过某些方式组合起来的新特征。我们无法判断新特征向量的特征是从原数据中的什么特征组合而来,新特征虽然带有原始数据的信息,却已经不是原数据上代表着的含义。

        在矩阵分解时,PCA在原有特征的基础上,找出能够让信息尽量聚集的新特征向量。在sklearn使用的PCA和SVD联合的降维方法中,这些新特征向量组成的新特征空间其实就是V(k,n),当V(k,n)是数字时,我们无法判断V(k,n)和原有的特征有着怎样的联系。但如果原有特征矩阵是图像,V(k,n)这个空间矩阵也可以被可视化,我们就可以通过比较两张图得到新特征空间是从原始数据里提取了什么重要的信息。

1.PCA人脸识别

1.1 原特征

from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
faces=fetch_lfw_people(min_faces_per_person=60) #实例化
faces.data.shape  #(1348, 2914) #行是样本,列是样本相关的所有特征
faces.images.shape    #(1348, 62, 47)
#1277 是矩阵中图像的个数,62 是每个图像的特征矩阵的行,47 是每个图像的特征矩阵的列
x=faces.data
fig,axes=plt.subplots(3,8
                     ,figsize=(8,4)
                     ,subplot_kw={"xticks":[],"yticks":[]} #不显示坐标轴
                     )
for i,ax in enumerate(axes.flat):
    ax.imshow(faces.images[i,:,:],cmap="gray")

PCA人脸识别降维+PCA实现噪音过滤--from 菜菜机器学习_第1张图片

1.2 PCA降维后的特征

pca=PCA(150).fit(x)
x_dr=pca.transform(x)
x_dr.shape  #(1348, 150)
v=pca.components_
v.shape    #(150, 2914)  (k,n)结构
fig,axes=plt.subplots(3,8
                     ,figsize=(8,4)
                     ,subplot_kw={"xticks":[],"yticks":[]} #不显示坐标轴
                     )
for i,ax in enumerate(axes.flat):
    ax.imshow(v[i,:].reshape(62,47),cmap="gray")

PCA人脸识别降维+PCA实现噪音过滤--from 菜菜机器学习_第2张图片

         对比两张图可以看出,比起降维前的数据,新特征空间可视化后的人脸非常模糊,这是因为原始数据还没有被映射到特征空间中。但是可以看出,整体比较亮的图片,获取的信息较多,在比较亮的图片中,眼睛,鼻子,嘴巴都相对清晰,脸部的轮廓,头发比较模糊。这也证明了PCA能够将原始数据集中重要的数据进行聚集。 

1.3 inverse_transform查看降维后信息保存量

我们将x(m,n)通过PCA降维后的新特征向量x_dr,之后再使用inverse_transform(x_dr)返回一个x_inverse(m,n),并对x_inverse(m,n)的人脸图像也进行绘制。如果PCA的降维是可逆的,那么x(m,n)x_inverse(m,n)应该返回一模一样的图像,即携带一模一样的信息。

x_inverse=pca.inverse_transform(x_dr)
x_inverse.shape   #(1348, 2914)
fig,ax=plt.subplots(2,10
                     ,figsize=(10,2.5)
                     ,subplot_kw={"xticks":[],"yticks":[]} #不显示坐标轴
                     )
for i in range(10):
    ax[0,i].imshow(faces.images[i,:,:],cmap="binary_r")
    ax[1,i].imshow(x_inverse[i].reshape(62,47),cmap="binary_r")

PCA人脸识别降维+PCA实现噪音过滤--from 菜菜机器学习_第3张图片

        可以明显看出,这两组数据可视化后,由降维后再通过inverse_transform转换回原维度的数据画出的图像大致相似,但原始图像明显更加清晰。这说明,inverse_transform并没有实现数据的完全逆转。这是因为在降维的时候部分信息已经被舍弃,即便维度升高,原数据中已经被舍弃的信息也不可能再回来,所以,降维是不可逆的

        inverse_transform的功能,是基于x_dr中的数据进行升维,将数据重新映射到原数据所在的特征空间中,并非恢复所有原有的数据。同时我们也可以看出,降维到150以后的数据,的确保留了原数据的大部分信息,所以图像看起来与原数据高度相似。

2.PCA实现手写数字的噪音过滤 

        降维的目的之一就是希望抛弃掉对模型带来负面影响的特征,而通常来说,带有有效信息的特征的方差是远远大于噪音的,所以相比噪音,有效特征所带的信息不会在PCA过程中被大量抛弃。inverse_transform能够在不恢复原始数据的情况下,将降维后的数据返回到原本高维的空间中,也就是说能够实现“保证维度但去掉方差很小特征所带的信息”,因此利用inverse_transform的这个性质能够实现噪音过滤。

2.1 手写数字原数据

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
import numpy as np
digits=load_digits()
digits.images.shape    #(1797, 8, 8)
def plot_digits(data):
    #data的结构必须是(m,n),并且n要能够被分成(8,8)这样的结构
    fig,axes=plt.subplots(4,10
                        ,figsize=(10,4)
                        ,subplot_kw={"xticks":[],"yticks":[]}
                        )
    for i,ax in enumerate(axes.flat):
        ax.imshow(data[i].reshape(8,8),cmap="binary")
plot_digits(digits.data)

PCA人脸识别降维+PCA实现噪音过滤--from 菜菜机器学习_第4张图片

 2.2 人为数据加入噪音

import numpy as np
rng=np.random.RandomState(42)
#在指定的数据集中,随机抽取服从正态分布的数据
#两个参数,分别是指定的数据集,和抽取出来的正态分布的方差
noisy=rng.normal(digits.data,2)
plot_digits(noisy)

PCA人脸识别降维+PCA实现噪音过滤--from 菜菜机器学习_第5张图片

2.3 PCA对有噪音的数据降维

noisy.shape  #(1797, 64)
pca=PCA(0.5,svd_solver="full").fit(noisy)
x_dr=pca.transform(noisy)
x_dr.shape  #(1797, 6)

 2.4 inverse_transform逆转降维过程,实现降噪

without_noise=pca.inverse_transform(x_dr)
without_noise.shape  #(1797, 64)
plot_digits(without_noise)

PCA人脸识别降维+PCA实现噪音过滤--from 菜菜机器学习_第6张图片

你可能感兴趣的:(机器学习,python,机器学习,sklearn)