Gtihub仓库
姓名 | |
学号 | |
班号 | |
电子邮件 | |
手机号码 |
1 实验目的
实现一个PCA模型,能够对给定数据进行降维(即找到其中的主成分)
2 实验要求及实验环境
2.1 实验要求
测试:
-
首先人工生成一些数据(如三维数据),让它们主要分布在低维空间中,如首先让某个维度的方差远小于其它唯独,然后对这些数据旋转。生成这些数据后,用你的PCA方法进行主成分提取。
-
找一个人脸数据(小点样本量),用你实现PCA方法对该数据降维,找出一些主成分,然后用这些主成分对每一副人脸图像进行重建,比较一些它们与原图像有多大差别(用信噪比衡量)。
2.2 实验环境
Windows 10, Python 3.8.5, Jupyter notebook
3 实验原理
PCA(主成分分析,Principal Component Analysis)是最常用的一种降维方法。PCA的主要思想是将D维特征通过一组投影向量映射到K维上,这K维是全新的正交特征,称之为主成分,采用主成分作为数据的代表,有效地降低了数据维度,且保留了最多的信息。关于PCA的推导有两种方式:最大投影方差和最小投影距离。
- 最大投影方差:样本点在这个超平面上的投影尽可能分开
- 最小投影距离:样本点到这个超平面的距离都足够近
3.1 中心化
在开始PCA之前需要对数据进行预处理,即对数据中心化。设数据集 X = { x 1 , x 2 , . . . , x n } X=\{x_1, x_2, ..., x_n\} X={x1,x2,...,xn},其中 x i = { x i 1 , x i 2 , . . . , x i d } x_i = \{x_{i1}, x_{i2}, ..., x_{id}\} xi={xi1,xi2,...,xid},即 X X X 是一个 n × d n \times d n×d 的矩阵。则此数据集的中心向量(均值向量)为:
μ = 1 n ∑ i = 1 n x i \mu = \frac 1 n \sum_{i=1}^n x_i μ=n1i=1∑nxi
对数据集每个样本均进行操作: x i = x i − μ x_i = x_i - \mu xi=xi−μ,就得到了中心化后的数据,此时有 ∑ i = 1 n x i = 0 \displaystyle\sum_{i=1}^n x_i=0 i=1∑nxi=0。
中心化可以给后面的计算带来极大的便利,因为中心化之后的常规线性变换就是绕原点的旋转变化,也就是坐标变换。此时,协方差为 S = 1 n ∑ i = 1 n x i x i T = 1 n X T X S=\displaystyle\frac 1 n\sum_{i=1}^n x_i x_i^T=\frac 1 n X^T X S=n1i=1∑nxixiT=n1XTX
设使用的投影坐标系的一组标准正交基为 U k × d = { u 1 , u 2 , . . . , u k } , k < d , u i = { u i 1 , u i 2 , . . . , u i d } U_{k\times d}=\{u_1, u_2, ..., u_k\},\ k<d, u_i = \{u_{i1}, u_{i2}, ..., u_{id}\} Uk×d={u1,u2,...,uk}, k<d,ui={ui1,ui2,...,uid},故有 U U T = 1 UU^T=1 UUT=1,使用这组基变换中心化矩阵 X X X,得降维压缩后的矩阵 Y n × k = X U T Y_{n \times k}=XU^T Yn×k=XUT,重建得到 X ^ = Y U = X U T U \hat X=YU=XU^TU X^=YU=XUTU。
3.2 最大投影方差
对于任意一个样本 x i x_i xi,在新的坐标系中的投影为 y i = x i U T y_i=x_iU^T yi=xiUT,在新坐标系中的投影方差为 y i T y i = U x i T x i U T y_i^Ty_i=Ux_i^T x_iU^T yiTyi=UxiTxiUT。要使所有的样本的投影方差和最大,也就是求 arg max U ∑ i = 1 n U x i T x i U T \displaystyle\arg\max_U \sum^n_{i=1} Ux_i^T x_iU^T argUmaxi=1∑nUxiTxiUT,即
arg max U t r ( U X T X U T ) s . t . U U T = 1 \arg \max_U\ tr(UX^TXU^T)\qquad s.t.\ UU^T=1 argUmax tr(UXTXUT)s.t. UUT=1
求解:在 u 1 u_1 u1 方向投影后的方差
1 n ∑ i = 1 n { u 1 T x i − u 1 T μ } 2 = 1 n ( X u 1 T ) T ( X u 1 T ) = 1 n u 1 X T X u 1 T = u 1 S u 1 T \frac 1 n \sum_{i=1}^n\{u_1^Tx_i - u_1^T\mu\}^2 = \frac 1 n (Xu_1^T)^T(Xu_1^T)=\frac 1 n u_1X^TXu_1^T=u_1Su_1^T n1i=1∑n{u1Txi−u1Tμ}2=n1(Xu1T)T(Xu1T)=n1u1XTXu1T=u1Su1T
因为 u 1 u_1 u1 是投影方向,且已经假设它是单位向量,即 u 1 T u 1 = 1 u_1^Tu_1=1 u1Tu1=1,用拉格朗日乘子法最大化目标函数:
L ( u 1 ) = u 1 T S u 1 + λ 1 ( 1 − u 1 T u 1 ) L(u_1) = u_1^TSu_1 + \lambda_1(1-u_1^Tu_1) L(u1)=u1TSu1+λ1(1−u1Tu1)
对 u 1 u_1 u1 求导,令导数等于0,解得 S u 1 = λ 1 u 1 Su_1 = \lambda_1 u_1 Su1=λ1u1,显然, u 1 u_1 u1 和 λ 1 \lambda_1 λ1 是一组对应的 S S S 的特征向量和特征值,所以有 u 1 T S u 1 = λ 1 u_1^TSu_1 = \lambda_1 u1TSu1=λ1,结合在 u 1 u_1 u1 方向投影后的方差式,可得求得最大化方差,等价于求最大的特征值。
要将 d d d 维的数据降维到 k k k 维,只需计算前 k k k 个最大的特征值,将其对应的特征向量( d × 1 d\times 1 d×1 的)转为行向量( 1 × d 1\times d 1×d 的)组合成特征向量矩阵 U k × d U_{k\times d} Uk×d,则降维压缩后的矩阵为 Y = X U T Y=XU^T Y=XUT 。
3.3 最小投影距离
现在考虑整个样本集,希望所有的样本到这个超平面的距离足够近,也就是得到 Y Y Y 后,与 X X X 的距离最小。即求:
arg min U ∑ i = 1 n ∣ ∣ x ^ i − x i ∣ ∣ 2 2 = arg min U ∑ i = 1 n ∣ ∣ x i U T U − x i ∣ ∣ 2 2 = arg min U ∑ i = 1 n ( ( x i U T U ) ( x i U T U ) T − 2 ( x i U T U ) x i T + x i x i T ) = arg min U ∑ i = 1 n ( x i U T U U T U x i T − 2 x i U T U x i T + x i x i T ) = arg min U ∑ i = 1 n ( − x i U T U x i T + x i x i T ) = arg min U − ∑ i = 1 n x i U T U x i T + ∑ i = 1 n x i x i T ⇔ arg min U − ∑ i = 1 n x i U T U x i T ⇔ arg max U ∑ i = 1 n x i U T U x i T = arg max U t r ( U ( ∑ i = 1 n x i T x i ) U T ) = arg max U t r ( U X T X U T ) s . t . U U T = 1 \begin{aligned} \arg \min_U\sum^n_{i=1} || \hat x_i - x_i ||^2_2 &= \arg \min_U\sum\limits_{i=1}^n||x_iU^TU - x_i||_2^2\\ & =\arg \min_U\sum\limits_{i=1}^n ((x_iU^TU)(x_iU^TU)^T - 2(x_iU^TU)x_i^T + x_ix_i^T) \\ & =\arg \min_U\sum\limits_{i=1}^n (x_iU^TUU^TUx_i^T - 2x_iU^TUx_i^T + x_ix_i^T) \\ & =\arg \min_U \sum\limits_{i=1}^n (-x_iU^TUx_i^T + x_ix_i^T) \\ & =\arg \min_U -\sum\limits_{i=1}^n x_iU^TUx_i^T + \sum\limits_{i=1}^n x_ix_i^T \\ & \Leftrightarrow \arg \min_U -\sum\limits_{i=1}^n x_iU^TUx_i^T \\ & \Leftrightarrow \arg \max_U \sum\limits_{i=1}^n x_iU^TUx_i^T\\ & = \arg \max_U\ tr(U(\sum\limits_{i=1}^n x_i^Tx_i)U^T) \\ & =\arg \max_U\ tr(UX^TXU^T)\qquad s.t.\ UU^T=1 \end{aligned} argUmini=1∑n∣∣x^i−xi∣∣22=argUmini=1∑n∣∣xiUTU−xi∣∣22=argUmini=1∑n((xiUTU)(xiUTU)T−2(xiUTU)xiT+xixiT)=argUmini=1∑n(xiUTUUTUxiT−2xiUTUxiT+xixiT)=argUmini=1∑n(−xiUTUxiT+xixiT)=argUmin−i=1∑nxiUTUxiT+i=1∑nxixiT⇔argUmin−i=1∑nxiUTUxiT⇔argUmaxi=1∑nxiUTUxiT=argUmax tr(U(i=1∑nxiTxi)UT)=argUmax tr(UXTXUT)s.t. UUT=1
可以看到,这个式子与我们在最大投影方差中得到的式子是一致的,这就说明了这两种方式求得的结果是相同的。
PCA实现:
def pca(x, k):n = x.shape[0]mu = np.sum(x, axis=0) / nx_centralized = x - mucov = (x_centralized.T @ x_centralized) / nvalues, vectors = np.linalg.eig(cov)index = np.argsort(values) # 从小到大排序后的下标序列vectors = vectors[:, index[:-(k+1):-1]].T # 把序列逆向排列然后取前k个,转为行向量return x_centralized, mu, vectors
4 实验结果分析
4.1 生成数据测试
为了⽅便进⾏数据可视化,在这⾥只进⾏了2维数据和3维数据的在PCA前后的对⽐实验。
4.1.1 二维降到一维
生成高斯分布数据的参数:
μ = [ 2 , 2 ] , σ = [ 10 0 0 0.1 ] \mu = \left[ \begin{matrix} 2, 2 \end{matrix} \right], \; \sigma = \left[ \begin{matrix} 10 & 0\\ 0 & 0.1\\ \end{matrix} \right] μ=[2,2],σ=[10000.1]
可以看到第2维的⽅差远⼩于第1维的⽅差,因此直观感觉在第2维包含了更多的信息,所以直接进⾏PCA,得到的结果如下:
可以看到在PCA之后的数据分布在直线(1维)上,另外其在横轴上的⽅差更⼤,纵轴上的⽅差更⼩,所以在进⾏PCA之后得到的直线与横轴接近。
4.1.2 三维降到二维
生成高斯分布数据的参数:
μ = [ 1 , 2 , 3 ] , σ = [ 0.1 0 0 0 10 0 0 0 10 ] \mu =\left[ \begin{matrix} 1, 2, 3 \end{matrix} \right], \ \sigma = \left[ \begin{matrix} 0.1 & 0 & 0\\ 0 & 10 & 0 \\ 0 & 0 & 10 \end{matrix} \right] μ=[1,2,3], σ=⎣⎡0.10001000010⎦⎤
同样,可以看到第1维的⽅差是远⼩于其余两个维度的,所以在第1维相较于其他两维信息更少,如下是PCA得到的结果的不同方向:
4.2 人脸数据测试
信噪比计算公式
M S E = 1 M N ∑ i = 0 M − 1 ∑ j = 0 N − 1 ∣ ∣ I ( i , j ) − K ( i , j ) ∣ ∣ 2 P S N R = 10 ⋅ log 10 ( M A X I 2 M S E ) = 20 ⋅ log 10 ( M A X I M S E ) \begin{aligned} & MSE = \frac{1}{MN}\sum\limits_{i=0}^{M-1}\sum\limits_{j=0}^{N-1}||I(i, j) - K(i, j)||^2\\ &PSNR = 10 \cdot \log_{10}\left(\cfrac{MAX_I^2}{MSE}\right) = 20 \cdot \log_{10}\left(\cfrac{MAX_I}{\sqrt{MSE}}\right) \end{aligned} MSE=MN1i=0∑M−1j=0∑N−1∣∣I(i,j)−K(i,j)∣∣2PSNR=10⋅log10(MSEMAXI2)=20⋅log10(MSEMAXI)
4.2.1 有背景人脸数据
原图大小为 400 × 400 400 \times 400 400×400
4.2.2 无背景人脸
原图大小为 250 × 250 250\times 250 250×250
通过结果可以看出,无论是有背景的还是无背景的人脸图片,在降到 k = 50 k=50 k=50 时,都能较好的保留图片特征,人眼几乎无法分辨损失,降到 k = 10 k=10 k=10 时,图片有了较为明显的损失,降到 k = 3 k=3 k=3 时,图片损失扩大,仅能判断出该图原本是个人像,这些情况下有无背景的差别并不大。但在降到 k = 1 k=1 k=1 时,有背景的图片已经无法看出原图是一张人像,但无背景的图片仍然保留了人头像的大致轮廓。
但是从信噪比的角度来看,无论是降到几维,有背景图片的信噪比一直大于无背景图片的信噪比。
5 结论
- PCA降低了训练数据的维度的同时保留了主要信息,但在训练集上的主要信息未必是重要信息,被舍弃掉的信息未必⽆⽤,只是在训练数据上没有表现,因此PCA也有可能加重了过拟合。
- PCA算法中舍弃了 d − k d-k d−k 个最⼩的特征值对应的特征向量,⼀定会导致低维空间与⾼维空间不同,但是通过这种⽅式有效提⾼了样本的采样密度;并且由于较⼩特征值对应的往往与噪声相关,通过PCA在⼀定程度上起到了降噪的效果。
- PCA用于图片的降维可以极大地缓解存储压力,尤其是在如今像素越来越高的情况下。使用PCA降维我们只需要存储三个比较小的矩阵,能够较大地节省存储空间。