主成分分析(PCA)是什么

主成分分析(简称PCA)是一种常用的数据降维技术。它的基本思路是通过线性变换,将原始高维数据转换到一个新的坐标系中。在这个新坐标系里,数据的主要变化方向被凸显出来,我们可以选取其中最重要的几个方向(即“主成分”)来重新表示数据,从而在保留大部分关键信息的同时,实现数据的简化。

核心原理:抓住主要变化

PCA的核心在于寻找数据中方差最大的方向。方差大的方向,意味着数据在这个方向上散布得最广、包含的信息量最多。PCA会依次找出这些主方向(主成分),每个后续主成分都与前面的主成分正交,且承载的方差依次递减。

通俗理解

我们可以把PCA想象成给数据“换一个观察角度”。比如一组三维空间中的点,如果它们大致分布在一个倾斜的平面上,那么PCA就能帮我们找到这个平面,并将数据投影到其上,用两个主成分就能较好地描述数据的整体结构,从而实现从三维到二维的降维,同时尽可能不丢失重要信息。

 

PCA的步骤分解

第一步:数据标准化
先把原始数据做一下“标准化”,也就是让每个特征的均值变成0、标准差变成1,这样不同特征之间就具备可比性,避免单位或数值范围差异带来的干扰。

第二步:计算协方差矩阵
标准化的数据可以用来计算协方差矩阵。这个矩阵反映了不同特征两两之间的相关性程度,是后续分析的基础。

第三步:特征值分解
对协方差矩阵进行特征值分解,得到一组特征值和对应的特征向量。其中:

  • 特征向量代表了数据新的主要方向,也叫做主成分;

  • 特征值则反映了该方向上的数据方差大小,值越大表示这个方向越重要。

第四步:选取主成分
将特征值从大到小排序,根据需要保留的信息量选择前 k 个最大的特征值所对应的特征向量,作为最终的主成分(k 就是我们降维后想要的维度数)。

第五步:数据投影
最后,用选取出来的主成分构建投影矩阵,将原始数据乘上该矩阵,就得到了降维后的新数据。


PCA的目标

简单来说,PCA 就是通过寻找数据中“变化最大”的方向(即方差最大的主成分),把原始高维数据映射到少数几个重要的维度上。这样做既保留了数据中的主要信息,又实现了降维,便于后续的数据可视化、特征提取或噪声滤除等处理。


PCA背后的数学原理

1. 方差:衡量数据的分散程度
如果数据已经做过中心化(均值为 0),方差就表示数据点与原点之间的平均距离,反映了该方向上的信息量大小。PCA 就是要找一个投影方向,让数据在这个方向上的方差尽可能大。

2. 协方差矩阵:描述特征之间的相关性
对于标准化后的数据矩阵 X,协方差矩阵的计算公式为:

Σ=1nXTXΣ=n1​XTX

矩阵中的每个元素 Σᵢⱼ 表示第 i 个特征与第 j 个特征之间的协方差。

3. 特征值与特征向量:决定主成分
协方差矩阵的特征值 λ 和对应的特征向量 v 满足关系:Σv = λv。

  • 特征值 λ 越大,表明该方向上的数据方差越大,信息越重要;

  • 特征向量 v 则给出了该方向的具体指向。

通过求解特征方程 det(Σ − λI) = 0,就能得到所有特征值和特征向量。


PCA在实际中的用途

  • 数据降维:减少特征数量、提升计算效率、缓解“维度灾难”问题。

  • 去除噪声:通过保留方差大的主成分,自然过滤掉噪声对应的小方差成分。

  • 数据可视化:将高维数据降到 2 维或 3 维后,可以直观地观察分布和结构。

  • 示例:人脸识别
    在 ORL Faces 数据集中,PCA 常被用来提取人脸图像的主要特征(“特征脸”),从而实现高效的人脸表示与识别。

5.人脸识别实例

该人脸识别使用ORL_Faces数据集进行处理

代码实现:import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report
from sklearn.preprocessing import StandardScaler
 
 
# 加载人脸数据集
def imgarray():
    path = r"C:\Users\Brenty\Desktop\Face\ORL_Faces"
    ImgList = []
    for i in range(1, 41):
        for j in range(1, 11):
            imgPath = os.path.join(path, f"s{i}", f"{j}.pgm")
            img = cv2.imread(imgPath)
            if img is not None:
                img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
                ImgList.append(img)
            else:
                print(f"无法读取图像:{imgPath}")
 
    if not ImgList:
        print("未成功读取任何图像,请检查文件路径和格式。")
    else:
        print(f"成功读取 {len(ImgList)} 张图像。")
 
    ImgList = np.array(ImgList)
    return ImgList
 
# 划分数据集
faces = imgarray()
labels = np.array([i for i in range(1, 41) for _ in range(10)])
 
X_train, X_test, y_train, y_test = train_test_split(
    faces.reshape((faces.shape[0], -1)), labels, random_state=42)
 
 
# 数据标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
 
 
# 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)
 
# 使用KNN分类器
knn_classifier = KNeighborsClassifier(n_neighbors=5)
knn_classifier.fit(X_train_pca, y_train)
 
# 在测试集上进行预测
y_pred = knn_classifier.predict(X_test_pca)
 
# 打印分类报告
print("Classification Report:\n", classification_report(y_test, y_pred))
 
# 显示一些原始图像和降维后的图像
def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
    plt.figure(figsize=(1.8 * n_col, 2.4 * n_row))
    plt.subplots_adjust(bottom=0, left=.01, right=.99, top=.90, hspace=.35)
    for i in range(n_row * n_col):
        plt.subplot(n_row, n_col, i + 1)
        plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)
        plt.title(titles[i], size=12)
        plt.xticks(())
        plt.yticks(())
 
eigenfaces = pca.components_.reshape((n_components, faces.shape[1], faces.shape[2]))
eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, faces.shape[1], faces.shape[2])
 
plt.show()

运行结果:

6.总结
优点:

降维: PCA通过投影数据到新的坐标系,实现了数据的降维,保留了大部分原始数据的信息。

去相关性: PCA通过变换数据,去除了数据在新坐标轴上的相关性,有助于消除冗余信息。

简化模型: 通过减少特征数量,PCA可以简化模型,提高模型的泛化能力,避免过拟合。

特征提取: PCA不仅降维,还能提取数据中的关键特征,帮助理解数据的结构和模式。

缺点:

线性假设: PCA对数据的线性可分性有假设,对于非线性数据的处理效果可能较差。

信息损失: 降维会导致信息损失,需要谨慎选择保留的主成分数量。

敏感性: 对数据缩放较为敏感,通常需要在应用前进行标准化处理。

计算复杂度: 处理大规模数据集时,计算复杂度可能较高,可考虑使用近似方法。

解释性差: 主成分是原始特征的线性组合,可能难以解释与实际问题的关系。

主成分分析(Principal Component Analysis,PCA)是一种广泛应用的降维技术,具有一系列优点和缺点。在实际应用中,选择使用PCA需要根据具体问题的特点和数据的性质,综合考虑其优缺点。正确使用PCA能够有效提高数据处理的效率和模型

更多推荐