1 PCA简介

PCA(Principal components analysis) 译为 主成分分析,是最基本的一种无监督降维算法,简单的 PCA 可以理解是在空间上对多特征进行坐标系的重划分,并且保证新的特征之间不存在线性相关,以及损失的信息尽可能少。


2 可视化理解

在这里插入图片描述

在上图中,我们假设存在一个二维数据集,而PCA则是希望对空间坐标系进行重划分,那么我们可以假定绿线是我们重新定义的 X X X 轴,与之相垂直的直线可以定义为 Y Y Y 轴(图示中没有画出)。

此时我们的白点数据在新的 X X X 轴(绿线)上得到投影点为蓝点,目的是希望蓝点之间的方差最大化。在我们的直观理解中,这些投影后的点很能够反应数据降维前在空间上的关系,只不过损失了部分信息。

PCA的目标是找到我们口中的新的坐标轴(方向),以下的数学推导就是沿着它进行的。


3 PCA原理推导

PCA原理推导有两种思路,分别是最小投影距离与最大投影方差,本质上是相同的,这里我们只介绍最大投影法查推导。

以下推导中,均假设数据集有 n n n 个样本, m m m 个特征,且数据集矩阵为 D = [ X 1 , X 2 . . . X m ] D=[X_1,X_2...X_m] D=[X1,X2...Xm],其中 X i X_i Xi 代表所有样本第 i i i 个特征的列向量。第一个主成分的方向向量为 u u u

① 中心化处理

中心化处理是为了方差公式书写表达的方便,我们已经提前进行了中心化,投影方差可以直接计算投影距离的平方。

n n n 个样本的第 i i i 个特征列向量 X i X_i Xi 的数据序列 { x 1 , x 2 . . . x n } \{x_1,x_2...x_n\} {x1,x2...xn},我们有
μ = 1 n ∑ i = 1 n x i \mu = \frac{1}{n}\sum_{i=1}^nx_i μ=n1i=1nxi
{ x 1 , x 2 . . . x n } = { x 1 − μ , x 2 − μ . . . x n − μ } \{x_1,x_2...x_n\}=\{x_1-\mu,x_2-\mu...x_n-\mu\} {x1,x2...xn}={x1μ,x2μ...xnμ}

所有有的 m m m 个都进行均值中心化操作,就可以使得数据集中心在原点附近,有利于待投影坐标轴的向量表示。

② 投影公式

这里回顾一下投影公式,假设要求解向量 a a a b b b 上的投影,我们有
P r o j b   a = ∣ ∣ a ∣ ∣ cos ⁡ ( a , b ) = ∣ ∣ a ∣ ∣ a b ∣ ∣ a ∣ ∣   ∣ ∣ b ∣ ∣ = a b ∣ ∣ b ∣ ∣ {Proj}_b\ a=||a||\cos(a,b)=||a||\frac{ab}{||a||\ ||b||}=\frac{ab}{||b||} Projb a=∣∣a∣∣cos(a,b)=∣∣a∣∣∣∣a∣∣ ∣∣b∣∣ab=∣∣b∣∣ab
假设我们的方向向量 u u u,其模(Norm)为1,即 ∣ ∣ u ∣ ∣ = 1 ||u||=1 ∣∣u∣∣=1。每个数据的行向量 x j x_j xj u u u 上的投影,可以有
P r o j u   x j = x j u ∣ ∣ u ∣ ∣ = x j u       s . t .    ∣ ∣ u ∣ ∣ = 1 {Proj}_u\ x_j=\frac{x_ju}{||u||}=x_ju\ \ \ \ \ s.t. \ \ ||u||=1 Proju xj=∣∣u∣∣xju=xju     s.t.  ∣∣u∣∣=1

③ 目标函数

有了上面的理解基础,再根据投影方差最大,则可以定义目标函数为
J ( u ) = ∑ i = j n ( x j u ) 2       s . t . ∣ ∣ u ∣ ∣ = 1 J(u)=\sum_{i=j}^n{(x_ju)}^2\ \ \ \ \ s.t.||u||=1 J(u)=i=jn(xju)2     s.t.∣∣u∣∣=1
更改为矩阵形式,其中 X X X 表示数据集矩阵,我们有
J ( u ) = ∣ ∣ X u ∣ ∣ 2 = u T X X T u       s . t . ∣ ∣ u ∣ ∣ = 1 J(u)=||Xu||^2=u^TXX^Tu\ \ \ \ \ s.t.||u||=1 J(u)=∣∣Xu2=uTXXTu     s.t.∣∣u∣∣=1

④ 拉格朗日乘子法

我们希望求解目标函数的最大值,使得投影方差之和最大。而对于这种带等式条件的目标函数最值问题,可以使用拉格朗日乘子法。

其实在求解这个二次型目标函数(明显为凸函数)前需要证明其存在最大值。由于实矩阵 X X X 乘以它的转置矩阵必为半正定矩阵,因此其特征值大于等于0,证明该二次型有最大值。也可以从图像的角度来理解,我们必可以找到一条过原点的直线,使得所有点在其上投影得到的方差之和最大。

将条件带入目标函数,构造拉格朗日函数(其中 λ \lambda λ 大于等于 0 0 0,且为常数),我们有
L ( u ) = u T X X T u + λ ( 1 − u T u ) L(u)=u^TXX^Tu+\lambda(1-u^Tu) L(u)=uTXXTu+λ(1uTu)
对其中的向量 u u u 求偏导,可以得到
∂ L ( u ) ∂ u = 2 X X T u − 2 λ u = 0 \frac{\partial L(u)}{\partial u}=2XX^Tu-2\lambda u=0 uL(u)=2XXTu2λu=0
将等式稍微变换一下得到
X X T u = λ u XX^Tu=\lambda u XXTu=λu

⑤ 特征向量

从我们得到的公式 X X T u = λ u XX^Tu=\lambda u XXTu=λu 可以明显的看出我要求解的矩阵 X X T XX^T XXT 的特征向量 u u u 其实就是我们的方向向量。

这里可能你会稍微疑惑,因为得到的特征向量不可能都刚好是单位向量,其实没关系。假设不是单位向量,你也可以带入推导中,只不过会多出一个常数项。之所以这样,是写投影公式的时候分母为1,有利于化简。

在推导公式中,对于一个形状为 n × n n\times n n×n X X T XX^T XXT矩阵,我们可以得到 n n n 个特征向量,假设我们要降维到 3 3 3 维,只需选取其中最大的 3 3 3 个特征值对应的特征向量,作为我们的待投影向量。

4 kernel PCA

在上面的PCA推导中可以看出,我们都是将数据投影到一个超平面上,但很多时候数据不是呈现线性关系,如此降维取得的效果可能不是很好。面对这种问题,我们可以尝试先对数据集进行非线性变换,使得变换后的数据可能拟合线性关系,然后再使用PCA。但是这样做计算量一般会增加很多,对此我们可以使用类似SVM中的核函数来减少计算量。在这里只是简单提及,以后写到SVM原理时,我会介绍核技巧以及在其他机器学习算法中的应用。


5 PCA python代码实现

import numpy as np
# 中心化操作
def zeroMean(dataMat):
	meanValue = np.mean(dataMat,axis=0)
	newDataMat = dataMat - meanValue
	return newDataMat,meanValue

# 获得去中心化后的矩阵XX_T的特征值与特征矩阵
def eigen(newDataMat):
	X_T = np.transpose(newDataMat)
	XX_T = np.dot(X,X_T)
	eigenvValues,eigenMat=np.linalg.eig(np.mat(XX_T))
    return eigenvValues,eigenMat

# PCA选择降到k维
def PCA(eigenValues,eigenMat,newDataMat,k):
	sortEV = np.argsort(eigenValues)
	kEV = sortEV[-1:-(k+1):-1]
	kEVectors = eigenMat[:,k]
	lowerDM = np.dot(newDataMat,nEVectors)
	return lowerDM,kEVectors

# 将降维后的数据还原 	 
# 由于我们对公式进行 (X-mean)u 操作,如果需要还原数据形状
# 可以乘以特征矩阵的逆矩阵,然后加上均值
def repaireData(lowerDM,kEVectors,MeanValue):
	repaireMat = mp.dot(lower,kEVectors.T) + MeanValue
	return repaireMat
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐