降维算法之PCA(主成分分析)
降维算法之PCA (主成分分析)
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=1∑nxi
{
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=j∑n(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)=∣∣Xu∣∣2=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+λ(1−uTu)
对其中的向量
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
∂u∂L(u)=2XXTu−2λ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
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)