背景|Background

待更
https://www.bookstack.cn/read/hands_on_Ml_with_Sklearn_and_TF/docs-8.降维.md

维数灾难|The Curse of Dimensionality

待更

主成分分析|Principal Component Analysis

预备知识

对于有NN个样本 Sample ,维度为pp的数据矩阵DataData,显然有:

X=[x1,x2,x3,,xN]T=[x11x1px1NxNp]Rp×n\begin{aligned} \textbf{X}= \begin{bmatrix} \textbf{x}_1,\textbf{x}_2,\textbf{x}_3,\cdots,\textbf{x}_N \end{bmatrix}^\mathsf{T}= \begin{bmatrix} x_{11} &\cdots &x_{1p}\\ \vdots &\ddots &\vdots\\ x_{1N} &\cdots &x_{Np} \end{bmatrix}∈\mathbb{R}^{p\times n} \end{aligned}

对应地,其样本均值 SampleMean (此处是每一列样本的均值)可以通过如下推导,利用矩阵的形式表示:

X=[x1x2xp]=1Ni=1NxiRp×1X=1N(x1,x2,,xN)(111)X=1NXT1N\begin{aligned} \overline{\mathbf{X}}&= \begin{bmatrix} \overline{\textbf{x}}_1\\ \overline{\textbf{x}}_2\\ \vdots\\ \overline{\textbf{x}}_p \end{bmatrix} =\frac 1 N\sum_{i=1}^{N}\mathbf{x}_i\in\mathbb R^{p\times 1}\\ \overline{\mathbf{X}}&=\frac 1 N(\textbf{x}_1,\textbf{x}_2,\cdots,\textbf{x}_N) \begin{pmatrix} 1\\1\\ \vdots\\ 1 \end{pmatrix}\\ \overline{\mathbf{X}}&=\frac 1 N\mathbf{X}^\mathsf{T}·\mathbf{1}_N \end{aligned}

同样地,也可以对其样本方差 SampleCovariance 的矩阵形式进行表达:

S=[S11S1pS1NSNp]=1Ni=1N(xiX)(xiX)TS=1N[x1X,,xNX][(x1X)T(xNX)T]S=1N(XTX1NT)(XTX1NT)TS=1NXTHXRp×p\begin{aligned} \mathbf{S}&= \begin{bmatrix} S_{11} &\cdots &S_{1p}\\ \vdots &\ddots &\vdots\\ S_{1N} &\cdots &S_{Np} \end{bmatrix} =\frac 1 N\sum_{i=1}^N(\mathbf{x}_i-\overline{\mathbf{X}})(\mathbf{x}_i-\overline{\mathbf{X}})^\mathsf{T}\\ \mathbf{S}&=\frac 1 N[\mathbf{x}_1-\overline{\mathbf{X}},\cdots,\mathbf{x}_N-\overline{\mathbf{X}}]\begin{bmatrix} (\mathbf{x}_1-\overline{\mathbf{X}})^\mathsf{T}\\ \vdots\\ (\mathbf{x}_N-\overline{\mathbf{X}})^\mathsf{T} \end{bmatrix}\\ \mathbf{S}&=\frac 1 N(\mathbf{X}^\mathsf{T}-\overline{\mathbf{X}}·\mathbf{1}_N^\mathsf{T})·(\mathbf{X}^\mathsf{T}-\overline{\mathbf{X}}·\mathbf{1}_N^\mathsf{T})^\mathsf{T}\\ \mathbf{S}&=\frac 1 N \mathbf{X}^\mathsf{T}\mathbf{H}\mathbf{X}\in\mathbb R^{p\times p} \end{aligned}

其中,H=IN1N1N×N\mathbf{H}=\mathbf{I}_N-\frac 1 N \mathbf{1}_{N\times N}.

HH矩阵为:中心矩阵|CenteringMatrix,关于中心矩阵,它拥有如下性质:

  1. 对称性:HT=H\mathbf{H}^\mathsf{T}=\mathbf{H}
  2. 幂等性:Hn=H\mathbf{H}^n=\mathbf{H}

证明:略

事实上,上述中的均值和方差以及符号只是便于理解,在多维空间中,均值通常记为μ\mathbf{\mu},方差事实上是数据的协方差,记为Σ\mathbf{\Sigma}.

方法思想|Algorithm

主成分分析(Principal Component Analysis,PCA),是一种用于提取数据集中的模式的统计技术,也是目前最受欢迎的降维算法。

其主要思想可以概括为 “ 一个中心两个基本点 ”,一个中心指 对原式特征空间进行重构,使原本相关的向量空间重构为互相无关的向量空间;两个基本点分别指:最大投影方差最小重构代价。(事实上是两个角度)

最大投影方差

最大投影方差 这个角度出发,我们的目的是找到一个低维超平面,使得将数据样本投影到该超平面上后的方差最大,也就是说这个超平面很很好地区分开每个样本。

以二维空间为例,如下图所示:

图源:百度百科

我们需要找到向量u1u_1u2u_2(图中指向右上角的方向为u1u_1),使得各个样本点在u1u_1上的投影最分散,也就是各个样本投影在u1u_1上后,它们与它们的均值(这个均值也投影在了u1u_1 上)距离最远。于是有目标函数:

J=maxu11Ni=1N(xiTu1xTu1)2s.t.    u1Tu1=1\begin{aligned} J=&\max_{u_1}\frac 1 N\sum_{i=1}^N(x_i^\mathsf{T}u_1-\overline{x}^\mathsf{T}u_1)^2 \\s.t. &\;\;u_1^\mathsf{T}u_1=1 \end{aligned}

向量a\vec{a}在向量b\vec{b}上的投影为:acos<a,b>|\vec{a}|\cos<\vec{a},\vec{b}>

而:ab=abcos<a,b>\vec{a}·\vec{b}=|\vec{a}||\vec{b}|\cos<\vec{a},\vec{b}>

所以当b\vec{b}为单位向量时,二者的内积即是a\vec{a}b\vec{b}上的投影值

对上式进行求解

1Ni=1N(xiTu1xTu1)2=1Ni=1N[(xix)Tu1]2=1Ni=1N[(xix)Tu1]T[(xix)Tu1]=1Ni=1N[u1T(xix)(xix)Tu1]=u1T[1Ni=1N(xix)(xix)T]u1=u1TSu1\begin{aligned} &\frac 1 N\sum_{i=1}^N(x_i^\mathsf{T}u_1-\overline{x}^\mathsf{T}u_1)^2\\ =&\frac 1 N\sum_{i=1}^N[(x_i-\overline{x})^\mathsf{T}u_1]^2\\ =&\frac 1 N\sum_{i=1}^N[(x_i-\overline{x})^\mathsf{T}u_1]^\mathsf{T}[(x_i-\overline{x})^\mathsf{T}u_1]\\ =&\frac 1 N\sum_{i=1}^N[u_1^\mathsf{T}(x_i-\overline{x})(x_i-\overline{x})^\mathsf{T}u_1]\\ =&u_1^\mathsf{T}\left[\frac 1 N\sum_{i=1}^N(x_i-\overline{x})(x_i-\overline{x})^\mathsf{T}\right]u_1\\ =&u_1^\mathsf{T}Su_1 \end{aligned}

于是,原式化为:

J=maxu1u1TSu1s.t.    u1Tu1=1\begin{aligned} J=\max_{u_1}u_1^\mathsf{T}Su_1\\ s.t. \;\;u_1^\mathsf{T}u_1=1 \end{aligned}

利用拉格朗日乘子法对该优化问题进行求解:

L=u1TSu1λ1(u1Tu11)Lu1=2Su12λ1u1=0Su1=λ1u1\begin{aligned} {\cal{L}}&=u_1^\mathsf{T}Su_1-\lambda_1(u_1^\mathsf{T}u_1-1)\\ \frac{\partial{\cal{L}}}{\partial u_1}&=2Su_1-2\lambda_1 u_1=0\\\\ \Rightarrow Su_1&=\lambda_1 u_1 \end{aligned}

可见,λ1\lambda_1是协方差矩阵SS特征值u1u_1 是其特征向量,于是整个问题转化为了求协方差矩阵SS特征分解问题。

Su1=λ1u1Su_1=\lambda_1 u_1 带入目标函数,

待更
另一个角度;SVD分解的方法

代码实现|Code

根据上述分析,我们能够得出对数据集进行PCA的一般步骤:

伪代码

sklearn库中的PCA

各参数介绍:https://blog.csdn.net/weixin_44781900/article/details/104839136

1
2
3
4
5
import numpy as np
from sklearn.decomposition import PCA
data = np.random.rand(10, 5) # 生成10个样本,每个样本5个特征
pca = PCA(n_components=2)
low_dim_data = pca.fit_transform(data) # 每个样本降为2维

自写PCA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def myPCA(data,n):
#数据中心化
newData = zeroMean(data)
#cov用于求协方差矩阵,参数rowvar = 0说明数据一行代表一个样本
covMat = np.cov(newData,rowvar=0)
#np.linalg.eig用于求矩阵的特征值和特征向量
eigVals, eigVects = np.linalg.eig(np.mat(covMat))
#对特征值从小到大排列
eigValIndice = np.argsort(eigVals)
#得到最大的n个特征值的下标
n_eigValIndice = eigValIndice[-1:-(n+1):-1]
#得到下标对应的特征向量
n_eigVects = eigVects[:, n_eigValIndice]
#低维特征空间的数据
lowDData = newData * n_eigVects
return np.array(lowDData)

拓展|Others

P-PCA

待更

Kernel-PCA

待更

https://vimsky.com/examples/usage/python-sklearn.decomposition.KernelPCA-sk.html

番外:PCA计算指标权重

https://blog.csdn.net/weixin_53972936/article/details/123310662

参考|Reference

  1. 机器学习白板推导系列|P22-P27
  2. 第八章——降维|博客园
  3. python实现PCA降维|博客园