主成分分析(PCA)基本原理以及代码详解

PCA概念

        主成分分析(Principal Component Analysis,PCA)是一种常用的数据预处理和降维方法。它的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征23。

        PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴2。

        通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理2。

         PCA的数学定义是:一个正交化线性变换,把数据变换到一个新的坐标系统中,使得这一数据的任何投影的第一大方差在第一个坐标(称为第一主成分)上,第二大方差在第二个坐标(第二主成分)上,依次类推4。 PCA是最简单的以特征量分析多元统计分布的方法。

PCA

        维度约减

        根据上部分所说,pca的主要作用就是降维,也就是特征维度约减,将高维特征向量映射到低维子空间中。人脸图像,基因数据,手写字等都是经典的高维数据,若是不进行降维处理,计算量会非常非常大。

        具体可见如下这两张图, 第一张是一个三维图像,但是数据都分布在该三维图像中的某一平面上,如果你用自然坐标系x,y,z这三个轴来表示这组数据的话,需要使用三个维度,而事实上,这些点的分布仅仅是在一个二维的平面上,那么,如果把x,y,z坐标系旋转一下,使数据所在平面与x,y平面重合。这就对了!如果把旋转后的坐标系记为x',y',z',那么这组数据的表示只用x'和y'两个维度表示即可。当然了,如果想恢复原来的表示方式,那就得把这两个坐标之间的变换矩阵存下来。这样就能把数据维度降下来了。但是,我们要看到这个过程的本质,如果把这些数据按行或者按列排成一个矩阵,那么这个矩阵的秩就是2。这些数据之间是有相关性的,这些数据构成的过原点的向量的最大线性无关组包含2个向量,这就是为什么一开始就假设平面过原点的原因。
 

         上一段文字中,认为把数据降维后并没有丢弃任何东西,因为这些数据在平面以外的第三个维度的分量都为0。现在,假设这些数据在z'轴有一个很小的抖动,那么我们仍然用上述的二维表示这些数据,理由是我们可以认为这两个轴的信息是数据的主成分,而这些信息对于我们的分析已经足够了,z'轴上的抖动很有可能是噪声,也就是说本来这组数据是有相关性的,噪声的引入,导致了数据不完全相关,但是,这些数据在z'轴上的分布与原点构成的夹角非常小,也就是说在z'轴上有很大的相关性,综合这些考虑,就可以认为数据在x',y' 轴上的投影构成了数据的主成分。

        常规维度约减方法
  1. 监督学习

    • 定义:监督学习模型拟合输入与输出之间的关系。在这种情况下,我们已知输入数据和对应的输出标签或回归值。
    • 应用:通常用于分类任务(将输入映射到输出标签)或回归任务(将输入映射到连续输出)。
    • 常见算法:逻辑回归、朴素贝叶斯、人工神经网络、支持向量机和随机森林。
  2. 半监督学习

    • 定义:半监督学习结合了有标签和无标签的数据来训练模型。它旨在使用少量标记的训练数据和大量未标记的数据。
    • 应用场景:适用于标记数据成本高昂或数据流不断涌入的情况。
    • 常见方法:直推式支持向量机、标签传播算法等。
  3. 无监督学习

    • 定义:无监督学习模型发现数据内在的结构,而不依赖于标签信息。
    • 任务:最常见的任务是聚类(将相似的数据分组)和密度估计(了解数据分布)。
    • 常见算法:k-means聚类、主成分分析和自动编码器。

总结一下:

  • 监督学习:有标签的输入和输出,用于分类和回归。
  • 半监督学习:少量标签数据和大量未标签数据,用于标记未标签数据。
  • 无监督学习:无标签数据,用于发现数据内在结构。
        基本思路
        1.通过协方差分析,建立 高维空间到低维空间的线性映射/矩阵(这些向量称为 主成分 (PCs), 具有无关性、正交的特点。重要的是这些向量的数量要远小于高维空间的维度。
        2.保留尽可能多的样本信息
        3.压缩后的数据对分类、聚类尽量不产生影响,甚至有所提升
        实例

        现在假设有一组数据如下:

        (这里有10个样本,每个样例两个特征。) 

        第一步,分别求x和y的平均值,然后对于所有的样例,都减去对应的均值。这里x的均值是1.81,y的均值是1.91,那么一个样例减去均值后即为(0.69,0.49),得到:

        第二步,求特征协方差矩阵,由于 样本只有两个维度,可根据协 方差矩阵计算公式求得

        如果数据是3维,那么协方差矩阵是 

         对角线上分别是x和y的方差,非对角线上是协方差。协方差是衡量两个变量同时变化的变化程度。协方差大于0表示x和y若一个增,另一个也增;小于0表示一个增,一个减。如果x和y是统计独立的,那么二者之间的协方差就是0;但是协方差是0,并不能说明x和y是独立的。协方差绝对值越大,两者对彼此的影响越大,反之越小。协方差是没有单位的量,因此,如果同样的两个变量所采用的量纲发生变化,它们的协方差也会产生树枝上的变化。

        第三步,求协方差的特征值和特征向量,得到

        上面是两个特征值,下面是对应的特征向量,特征值0.0490833989对应特征向量为,这里的特征向量都归一化为单位向量。

        第四步,将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。

    这里特征值只有两个,我们选择其中最大的那个,这里是1.28402771,对应的特征向量是(-0.677873399, -0.735178656)T。

         第五步,将样本点投影到选取的特征向量上。假设样例数为m,特征数为n,减去均值后的样本矩阵为DataAdjust(m*n),协方差矩阵是n*n,选取的k个特征向量组成的矩阵为EigenVectors(n*k)。那么投影后的数据FinalData为

        FinalData(1*10) = 特征向量(-0.677873399, - 0.735178656)×DataAdjust(2*10矩阵)

        得到结果:

人脸识别实现

以下是基于python和sklearn库实现的pca人脸识别代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_lfw_people
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.neural_network import MLPClassifier
#加载人脸数据集
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
#获取数据集信息
n_samples,h,w = lfw_people.images.shape
X = lfw_people.data
y = lfw_people.target
target_names = lfw_people.target_names
n_classes = target_names.shape[0]
#分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

#对数据进行 PCA 降维
n_components = 150
pca = PCA(n_components=n_components,whiten=True).fit(X_train)
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test )
# 训练神经网络分类器
mlp = MLPClassifier(hidden_layer_sizes=(1024,), batch_size=256, verbose=True, early_stopping=True).fit(X_train_pca, y_train)
#在测试集上进行预测
y_pred = mlp.predict(X_test_pca)
# 打印分类报告
print(classification_report(y_test, y_pred, target_names=target_names))

结果展示:
 

实验小结

         通过PCA降维算法对输入的人脸图像进行特征提取,然后使用分类算法进行分类,可以取得较好的分类和识别效果PCA人脸识别方法能有效地提取出图像的特征信息,并进行人脸识别。但同时,也需要注意其在处理大规模数据时的计算复杂度。

  • 16
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值