主成分分析(PCA)

目录

一.简介

1.1实现背景

1.2PCA的降维介绍

二.极大投影方差法

三.𝑃𝐶𝐴 的算法步骤:

3.1实现的步骤

3.2构建协方差矩阵

3.3特征值和特征向量

3.4基向量的变换

四.代码实现

4.1代码

4.2代码分析

五、总结

5.1PCA的性质

5.2 零均值化的注意使用


一.简介

1.1实现背景

在许多领域的数据的分析和处理中,往往会有许多复杂的变量,变量与变量之间通常还存在着相关性,要从大量的变量中提取出能反映事物特征的信息是极其困难的,对单个的变量分析不全面,并且会损失信息,造成错误的结论。主成分分析(PCA)便是通过数学降维,找出最能决定数据特性的主元成分的数据分析方法,用较少的综合指标,揭示隐藏在多维复杂数据变量背后的简单结构,得到更为科学有效的数据信息。

PCA 的实现背景可以追溯到19世纪的协方差矩阵理论。然而,PCA 的现代形式最早由卡尔·皮尔逊(Karl Pearson)在1901年提出,并在20世纪上半叶得到了进一步的发展。

PCA 的核心思想是通过线性变换将原始数据投影到新的坐标系中,使得投影后的数据具有最大的方差。这意味着在新坐标系中的第一个主成分(Principal Component,PC)所包含的信息量最大。然后,通过寻找与第一个主成分正交的方向上的第二个主成分,以及后续的主成分,可以逐步捕捉数据中的剩余方差。

1.2PCA的降维介绍


PCA(Principal Component Analysis)是一种常用的数据降维技术,通过线性变换将原始数据映射到新的低维空间中,保留原始数据中的大部分信息。PCA 的基本思想是,寻找一个正交基使得在这个基上的方差最大,从而达到降维的目的。

在平时的数学建模中,需要用到降维操作:

比如在图像处理中,如果要识别人脸,需要将每张图像表示为一个向量,每个元素代表图像中某个像素点的灰度值。由于每张图像的像素数量很大,可能成百上千万甚至更多,这会导致计算和存储成本非常高。

在这种情况下,可以使用PCA对这些向量进行降维,将每张图像表示为一个包含较少元素的向量,从而使得计算和存储成本大大降低。同时,PCA还能够从这些低维向量中提取出最具代表性的信息,以便于后续s的人脸识别任务。

主成分分析 (PCA) 是一种分析、简化数据集的技术,主成分分析经常用于降低数据集的维数,同时保持数据集中的对方差贡献最大的特征,然后它是一种有损压缩算法。

𝑃𝐶𝐴 问题的优化目标:将一组 𝑛 维向量降为 𝑘 维 (0<𝑘≤𝑛) ,其目标是选择 𝑘 个单位正交基,使得原始数据变换到该组基上后,各特征两两之间的协方差为 0 ,而特征的方差则尽可能大,当在正交的约束下取最大的 𝑘 个方差。

假设我们有 𝑚 个 𝑛 维数据记录,将其按列排成 𝑛×𝑚 的矩阵 𝑋 ,令 𝐶=1𝑚𝑋𝑋𝑇,则 𝐶 是一个半正定对称矩阵 (𝜉𝐶𝜉𝑇≥0),其对角线分别为各个特征的方差,而 𝐶𝑖,𝑗=𝐶𝑗,𝑖 ,分别表示 、𝑖、𝑗 两个特征的协方差。 𝑃 是一组基按行组成的矩阵 , 𝑌 为 𝑃 对 𝑋 做基变换后的数据即降维后的数据,有 𝑌=𝑃𝑋 。

D=\frac{1}{m}YY^{T} =P(\frac{1}{m}XX^{T})P^{T} =PCP^{T}

因此原优化目标转化成寻找一个矩阵 𝑃 ,满足 𝑃𝐶𝑃𝑇是一个对角矩阵,并且对角元素按从大到小依次排列,那么 𝑃 的前 𝑘 行就是要寻找的基,用 𝑃 的前 𝑘 行组成的矩阵乘以 𝑋 就使得 𝑋 从 𝑛 维降到了 𝑘 维并满足原始优化条件,又因为 𝐶 是实对称矩阵故可相似对角化。

二.极大投影方差法

极大投影方差法的思想是使得在投影后的空间中数据的方差最大,选择数据方差最大的方向进行投影,才能最大化数据的差异性,因此可以保留更多的原始数据信息。假设输入空间 𝑋∈𝑅𝑛 为 𝑛 ​维向量的集合,特征向量 𝑥(𝑖)∈𝑋 ,投影向量为 𝑢∈𝑅𝑑 且限制​ 𝑢 的模长为​ 1 即 𝑢𝑇𝑢=1 ,对原始特征向量 𝑥(𝑖) 进行去中心化处理,使得去中心化后的特征向量​ 𝑧(𝑖) 各特征分量的均值为 0 ​。

令 𝑥¯=(𝑥1¯,𝑥2¯,⋯,𝑥𝑛¯) , 𝑥𝑖¯ 为第​ 𝑖 个特征的均值,故有
0_{n}^{T}=\frac{1}{m}\sum_{i=1}^{m}z^{(i)}=\frac{1}{m}\sum_{i=1}^{m}(z^{(i)}-\widehat{x})=\widehat{x}-\widehat{x}

为什么限制 𝑢 ​的模长为 1 ​?
(𝑧(𝑖))𝑇𝑢=|(𝑧(𝑖))𝑇|⋅|𝑢|⋅cos⁡𝜃
这样特征向量 𝑧(𝑖) ​在 𝑢 ​上的投影可以表示为内积的形式。

样本投影后的方差为

\sigma (X,\mu )=\frac{1}{m}\sum_{i=1}^{m}[(z^{z(i)})^{T}\mu -0]^{2}

=\frac{1}{m}\sum_{i=1}^{m}[(z^{z(i)})^{T}\mu ][(z^{z(i)})^{T}\mu ]

=\mu ^{T}S\mu

因此优化函数为

arg⁡max𝑢⁡ 𝑢𝑇𝑆𝑢𝑠.𝑡.   𝑢𝑇𝑢=1

通过拉格朗日方法转换为无约束问题,其中​ 𝜆 为拉格朗日乘子

arg⁡max𝑢⁡ 𝑢𝑇𝑆𝑢+𝜆(1−𝑢𝑇𝑢)

对上式求导可得

𝑆𝑢=𝜆𝑢

从上式可知,​ 𝑢 是协方差矩阵 𝑆 ​的特征向量,​ 𝜆 为特征值。同时有

𝜎(𝑋,𝑢)=𝑢𝑇𝑆𝑢=𝑢𝑇𝜆𝑢=𝜆

𝜆 也是投影后样本的方差。因此,主成分分析可以转换成一个矩阵特征值分解问题,投影向量​ 𝑢 为矩阵​的最大特征 𝜆 对应的特征向量。

三.𝑃𝐶𝐴 的算法步骤:

3.1实现的步骤

假设有 𝑚 条 𝑛 维数据:

  1. 将原始数据按列组成 𝑛 行 𝑚 列矩阵 𝑋 ;
  2. 将 𝑋 的每一行进行零均值化,即减去这一行的均值;
  3. 求出协方差矩阵 𝐶=1𝑚𝑋𝑋𝑇;
  4. 求出协方差矩阵的特征值及对应的特征向量;
  5. 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 𝑘 行组成矩阵 𝑃 ;
  6. 𝑌=𝑃𝑋 即为降维到 𝑘 维后的数据。

    3.2构建协方差矩阵

对于我们得到的一组数据,可以求出其样本均值:

\widehat{x}=\frac{1}{n}\sum_{i=1}^{N}x_{i}

样本方差:

S^{2}=\frac{1}{n-1}\sum_{i=1}^{n}(x_{i}-\widehat{x})^{2}

两个样本之间的协方差:

Cov(X,Y)=\frac{1}{n-1}\sum_{i=1}^{n}(x_{i}-\widehat{x})(y_{i}-\widehat{y})

当协方差为0时,说明X和Y变量之间是线性无关的。        
可以得到两两数据之间的协方差矩阵

由矩阵知识可知,协方差矩阵为对称矩阵,对角线上为样本的方差,其他为两两变量之间的协方差。我们便可以利用对称矩阵的对角化将协方差化为0,实现变量间的线性无关,并且此时对角线上选取最大的K个方差即可。

3.3特征值和特征向量


根据协方差矩阵计算其特征值与特征向量,由线性代数我们知道,如果一个向量v是矩阵A的特征向量,将一定可以表示成下面的形式:

从而利用 |λE - A| = 0可解出矩阵的特征值,一个特征值便对应一组特征向量,特征向量之间是相互正交的。将所得到的特征向量对应其特征值从大到小排列,选出最大的k个向量单位化,便可作为PCA变换所需要的k个基向量,且方差最大。
通过数学方法可以证明,特征值λ即为降维后数据的方差,具体证明可以参照拉格朗日乘数法的最优化,在此不赘述。
 

3.4基向量的变换


X是一个mxn 的矩阵,它的每一个列向量都表示一个采样点上的数据 。Y 表示转换以后的新的数据集表示。 P是他们之间的线性转换,即计算向量内积。可表示为:

Y=PX
P便是由基向量组成的变换矩阵,经过线性转换,X的坐标便转换到新的基向量所决定的空间中的坐标Y,从几何上看,Y是X在新的空间中的投影。

经过基向量变换,即完成了数据的降维。

四.代码实现

4.1代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
 
# 加载手写数字数据集
digits = load_digits()
X = digits.data
y = digits.target
 
# 绘制降维前的图像
fig, ax = plt.subplots(nrows=2, ncols=5, sharex=True, sharey=True, figsize=(10, 5))
ax = ax.flatten()
for i in range(10):
    img = X[y == i][0].reshape(8, 8)
    ax[i].imshow(img, cmap='Greys')
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()
 
# PCA 的实现过程
mean_vec = np.mean(X, axis=0)
cov_mat = np.cov(X.T)
eig_vals, eig_vecs = np.linalg.eig(cov_mat)
sorted_idx = np.argsort(eig_vals)[::-1]
sorted_eig_vals = eig_vals[sorted_idx]
sorted_eig_vecs = eig_vecs[:, sorted_idx]
k = 2
projection_mat = sorted_eig_vecs[:, :k]
X_pca = X.dot(projection_mat)
 
# 绘制降维后的图像
colors = ['red', 'blue', 'green', 'purple', 'yellow', 'orange', 'pink', 'cyan', 'gray', 'brown']
plt.figure(figsize=(10, 8))
for i in range(len(colors)):
    plt.scatter(X_pca[y == i, 0], X_pca[y == i, 1], c=colors[i], label=str(i), edgecolor='k')
plt.xlabel('Principal Component 1')
plt.ylabel('Principal Component 2')
plt.legend(title='Digit')
plt.title('PCA on MNIST Dataset')
plt.show()
plt.show()

4.2代码分析


首先我们使用 load_digits 函数加载手写数字数据集,将特征存储在变量 X 中,将标签存储在变量 y 中。

然后,我绘制降维前的图像。具体地,我们选取每个数字类别中的第一个样本,将其转换成 8x8 的图像并展示出来。

接着,我按照 PCA 的实现过程对数据进行降维操作。具体地,我首先计算样本的均值向量和协方差矩阵,然后对协方差矩阵进行特征值分解,得到特征值和特征向量。接着,我们将特征向量按照对应的特征值大小排序,并选取前两个特征向量组成投影矩阵。最后,我将原始数据点乘以投影矩阵,得到降维后的数据 X_pca。

最后,我们使用 matplotlib 绘制降维后的图像。我们根据每个样本的标签将其在降维空间中的坐标进行着色,并绘制出来。

五、总结


5.1PCA的性质


需要注意的是,PCA 是基于线性变换的降维方法,在某些情况下可能无法捕捉到非线性的数据结构。对于非线性数据,可以考虑使用核主成分分析(Kernel PCA)等非线性降维方法。

最大可分性:PCA 旨在通过选择投影方向来最大程度地保留原始数据的方差。这意味着第一个主成分将包含数据中的最大方差,第二个主成分将包含数据中的次大方差,以此类推。通过选择前k个主成分,可以保留数据中大部分的方差,从而最大程度地保留原始数据的信息。

无关性:PCA 通过选择正交的主成分来表示数据。这意味着每个主成分与其他主成分是不相关的。这种无关性使得 PCA 在降维过程中能够最大限度地减少特征之间的冗余。

数据恢复:在 PCA 中,我们可以使用选定的主成分将降维后的数据映射回原始高维空间。这意味着我们可以通过反向变换来恢复降维后的数据,尽可能地接近原始数据。

特征重要性排序:PCA 的特征值表示了对应特征向量所解释的方差大小。较大的特征值表示了对应主成分所包含的信息量更多。因此,我们可以根据特征值的大小来评估每个主成分的重要性。通过选择具有最大特征值的主成分,我们可以选择保留最多信息的投影方向。

数据可视化:PCA 可以帮助我们将高维数据投影到低维空间中,通常是二维或三维空间。这使得我们能够更容易地可视化高维数据,并在图形上观察数据之间的模式和关系。

5.2 零均值化的注意使用


当对训练集进行 PCA 降维时,也需要对验证集、测试集执行同样的降维。而对验证集、测试集执行零均值化操作时,均值必须从训练集计算而来,不能使用验证集或者测试集的中心向量。

其原因也很简单,因为我们的训练集时可观测到的数据,测试集不可观测所以不会知道其均值,而验证集再大部分情况下是在处理完数据后再从训练集中分离出来,一般不会单独处理。如果真的是单独处理了,不能独自求均值的原因是和测试集一样。

另外我们也需要保证一致性,我们拿训练集训练出来的模型用来预测测试集的前提假设就是两者是独立同分布的,如果不能保证一致性的话,会出现 Variance Shift 的问题。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值