摘要
本文将介绍PCA算法,包括PCA算法的数学理解以及如何用代码逻辑。
一、简介
PCA(Principal Component Analysis,主成分分析)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。
二、数学相关概念
内积与投影
基
在线性代数中,基(basis)(也称为基底)是描述、刻画向量空间的基本工具。向量空间的基是它的一个特殊的子集,基的元素称为基向量。向量空间中任意一个元素,都可以唯一地表示成基向量的线性组合。如果基中元素个数有限,就称向量空间为有限维向量空间,将元素的个数称作向量空间的维数。
使用基底可以便利地描述向量空间。比如说,考察从一个向量空间 V V {\displaystyle \mathrm {V} }{\mathrm {V}} VV射出的线性变换 f f {\displaystyle f}f ff,可以查看这个变换作用在向量空间的一组基 B B {\displaystyle {\mathfrak {B}}}{\mathfrak {B}} BB上的效果。掌握了 f ( B ) f ( B ) {\displaystyle f({\mathfrak {B}})}f({\mathfrak {B}}) f(B)f(B),就等于掌握了 f f 对 V V {\displaystyle f}f对{\displaystyle \mathrm {V} }{\mathrm {V}} ff对VV中任意元素的效果。
不是所有空间都拥有由有限个元素构成的基底。这样的空间称为无限维空间。某些无限维空间上可以定义由无限个元素构成的基。如果承认选择公理,那么可以证明任何向量空间都拥有一组基。一个向量空间的基不止一组,但同一个空间的两组不同的基,它们的元素个数或势(当元素个数是无限的时候)是相等的。一组基里面的任意一部分向量都是线性无关的;反之,如果向量空间拥有一组基,那么在向量空间中取一组线性无关的向量,一定能将它扩充为一组基。在内积向量空间中,可以定义正交的概念。通过特别的方法,可以将任意的一组基变换成正交基乃至标准正交基。
方差的概念
方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。在许多实际问题中,研究方差即偏离程度有着重要意义。
协方差的概念
在概率论和统计学中,协方差(Covariance)用于衡量两个随机变量的联合变化程度。而方差是协方差的一种特殊情况,即变量与自身的协方差。
期望值分别为 E ( X ) = μ E ( X ) = μ 与 E ( Y ) = ν E ( Y ) = ν {\displaystyle E(X)=\mu }E(X)=\mu与{\displaystyle E(Y)=\nu }E(Y)=\nu E(X)=μE(X)=μ与E(Y)=νE(Y)=ν的两个具有有限二阶矩的实数随机变量X 与Y 之间的协方差定义为:
cov
(
X
,
Y
)
=
E
(
(
X
−
μ
)
(
Y
−
ν
)
)
=
E
(
X
⋅
Y
)
−
μ
ν
.
cov
(
X
,
Y
)
=
E
(
(
X
−
μ
)
(
Y
−
ν
)
)
=
E
(
X
⋅
Y
)
−
μ
ν
.
{\displaystyle \operatorname {cov} (X,Y)=\operatorname {E} ((X-\mu )(Y-\nu ))=\operatorname {E} (X\cdot Y)-\mu \nu .}{\displaystyle \operatorname {cov} (X,Y)=\operatorname {E} ((X-\mu )(Y-\nu ))=\operatorname {E} (X\cdot Y)-\mu \nu .}
cov(X,Y)=E((X−μ)(Y−ν))=E(X⋅Y)−μν.cov(X,Y)=E((X−μ)(Y−ν))=E(X⋅Y)−μν.
协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。 如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。 如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
如果X 与Y 是统计独立的,那么二者之间的协方差就是0,这是因为
E
(
X
⋅
Y
)
=
E
(
X
)
⋅
E
(
Y
)
=
μ
ν
,
E
(
X
⋅
Y
)
=
E
(
X
)
⋅
E
(
Y
)
=
μ
ν
{\displaystyle E(X\cdot Y)=E(X)\cdot E(Y)=\mu \nu ,}E(X \cdot Y)=E(X) \cdot E(Y)=\mu\nu
E(X⋅Y)=E(X)⋅E(Y)=μν,E(X⋅Y)=E(X)⋅E(Y)=μν,
但是反过来并不成立,即如果X 与Y 的协方差为0,二者并不一定是统计独立的。
协方差矩阵
在统计学与概率论中,协方差矩阵(也称离差矩阵、方差-协方差矩阵)是一个矩阵,其 i, j 位置的元素是第 i 个与第 j 个随机变量之间的协方差。这是从标量随机变量到高维度随机向量的自然推广。
实对称矩阵
实对称矩阵有一系列非常好的性质:
- 实对称矩阵不同特征值对应的特征向量必然正交。
- 特征向量λ重数为r,则必然存在r个线性无关的特征向量对应于λ,因此可以将这r个特征向量单位正交化。
特征值特征向量
A为n阶矩阵,若数λ和n维非0列向量x满足Ax=λx,那么数λ称为A的特征值,x称为A的对应于特征值λ的特征向量。式Ax=λx也可写成( A-λE)x=0,并且|λE-A|叫做A 的特征多项式。当特征多项式等于0的时候,称为A的特征方程,特征方程是一个齐次线性方程组,求解特征值的过程其实就是求解特征方程的解。
三、数学理论
在数学上,向量的表示是基于基向量的,如三维坐标中x轴,y轴,z轴就是一组三维基向量分别为: ( 1 , 0 , 0 ) T (1,0,0)^T (1,0,0)T, ( 0 , 1 , 0 ) T (0,1,0)^T (0,1,0)T, ( 0 , 0 , 1 ) T (0,0,1)^T (0,0,1)T,此时在三维坐标中的一个坐标,如: ( 3 , 4 , 6 ) T (3,4,6)^T (3,4,6)T,就是该向量分别在x轴,y轴,z轴上的投影的长度 $ (3,4,6)^T = 3 * (1,0,0)^T +4 * (0,1,0)^T +6 * (0,0,1)^T $
此时要是重新选择一组基向量,如何将向量转换到新的基向量所对应的坐标,这里就涉及到向量的变化。
这里可以直接得出结论:将向量与基向量进行内积所得到的向量就是该向量在基向量下的坐标。
(这里对基向量有要求,基向量的模需要为1,如果不唯一需要转换成模为1的基向量,或者在向量与基向量内积的时候除以基向量的模。)
3.1用向量解决转换
新向量B,向量
A
T
A^T
AT,基向量
α
、
β
、
γ
\alpha、\beta、\gamma
α、β、γ。B、A和基向量都是n维
当基向量的模为1时:
B = ( α . A T , β . A T , γ . A T ) B = (\alpha.A^T,\beta.A^T,\gamma.A^T) B=(α.AT,β.AT,γ.AT)
当基向量的模不为1时:
B = ( α . A T ∣ ∣ α ∣ ∣ , β . A T ∣ ∣ β ∣ ∣ , γ . A T ∣ ∣ γ ∣ ∣ ) B = (\frac{\alpha.A^T}{||\alpha||},\frac{\beta.A^T}{||\beta||},\frac{\gamma.A^T}{||\gamma||}) B=(∣∣α∣∣α.AT,∣∣β∣∣β.AT,∣∣γ∣∣γ.AT)
3.2用矩阵解决转换
此时我们得到了向量转换的方法,再扩大问题,如果对于m个n维向量,新基向量为: α 1 , α 2 . . . . . . α n \alpha_1,\alpha_2......\alpha_n α1,α2......αn,基向量也为n维,此时如何将这m个n维向量转换为新基向量下的新坐标。
可以看出,问题只是稍微的变复杂了,并没有太过于复杂,看到m个n维向量,第一时间就应该想到矩阵,上面的问题我们可以用矩阵的方式来表达,如下:
m个n维向量矩阵表示:(每一列代表一个向量)
A
=
[
a
1
a
2
⋯
a
m
]
=
[
a
11
a
12
⋯
a
1
m
a
21
a
22
⋯
a
2
m
⋮
⋮
⋱
⋮
a
n
1
a
n
2
⋯
a
n
m
]
A = \begin{bmatrix} a_{1} & a_{2} & \cdots & a_{m} \end{bmatrix} = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1m}\\\\ a_{21} & a_{22} & \cdots & a_{2m}\\\\ \vdots & \vdots & \ddots & \vdots\\\\ a_{n1} & a_{n2} & \cdots & a_{nm} \end{bmatrix}
A=[a1a2⋯am]=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1ma2m⋮anm⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
新向量组成的矩阵 B = ( α 1 α 2 ⋯ α n ) A = [ b 11 b 12 ⋯ b 1 m b 21 b 22 ⋯ b 2 m ⋮ ⋮ ⋱ ⋮ b n 1 b n 2 ⋯ b n m ] = [ b 1 b 2 ⋯ b m ] B = \begin{pmatrix} \alpha_1 \\\\ \alpha_2 \\\\ \cdots \\\\ \alpha_n \end{pmatrix} A = \begin{bmatrix} b_{11} & b_{12} & \cdots & b_{1m}\\\\ b_{21} & b_{22} & \cdots & b_{2m}\\\\ \vdots & \vdots & \ddots & \vdots\\\\ b_{n1} & b_{n2} & \cdots & b_{nm} \end{bmatrix} = \begin{bmatrix} b_{1} & b_{2} & \cdots & b_{m} \end{bmatrix} B=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎛α1α2⋯αn⎠⎟⎟⎟⎟⎟⎟⎟⎟⎞A=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡b11b21⋮bn1b12b22⋮bn2⋯⋯⋱⋯b1mb2m⋮bnm⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=[b1b2⋯bm]
以上就完成了以矩阵的形式进行m个n维向量转换,扩展到一般情况下任意矩阵都可以进行转换,接下来是在转换的基础上进行降维。
3.3用矩阵的形式进行降维
这里其实很简单,当对应的基向量个数k小于n个时,得到的新矩阵B的行数也小于n,也就是说新向量的维数为k小于n,就完成了降维。(是不是非常简单)
新向量组成的矩阵
B
=
(
α
1
α
2
⋯
α
k
)
A
=
[
b
11
b
12
⋯
b
1
m
b
21
b
22
⋯
b
2
m
⋮
⋮
⋱
⋮
b
k
1
b
k
2
⋯
b
k
m
]
=
[
b
1
b
2
⋯
b
m
]
B = \begin{pmatrix} \alpha_1 \\\\ \alpha_2 \\\\ \cdots \\\\ \alpha_k \\\\ \end{pmatrix} A = \begin{bmatrix} b_{11} & b_{12} & \cdots & b_{1m}\\\\ b_{21} & b_{22} & \cdots & b_{2m}\\\\ \vdots & \vdots & \ddots & \vdots\\\\ b_{k1} & b_{k2} & \cdots & b_{km}\\\\ \end{bmatrix} = \begin{bmatrix} b_{1} & b_{2} & \cdots & b_{m} \end{bmatrix}
B=⎝⎜⎜⎜⎜⎜⎜⎜⎜⎜⎜⎛α1α2⋯αk⎠⎟⎟⎟⎟⎟⎟⎟⎟⎟⎟⎞A=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡b11b21⋮bk1b12b22⋮bk2⋯⋯⋱⋯b1mb2m⋮bkm⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=[b1b2⋯bm]
3.4如何用常识选择合适的基向量
接下来就是理解PCA最重要的一步啦,以上我们已经可以对任意个任意维度的向量进行转换或者降维,但是可以看出上面的降维需要自己选择基向量,那么如何选择基向量呢?
首先大家降维的目的是让数据在尽可能的损失最少的信息时达到数据简单的目的,显然损失最少的信息就是我们的限制,向量在空间中就是一个点,他的坐标就代表了信息,不同向量之间的差别也就是以坐标来区别的。如果两个向量的相对位置在降维后没有改变,我们就可以说信息得到了保存。
上图,就符合我们的期望,如何用数学表达表示出来呢,这里就是方差最大,就是让坐标点分布越均匀,坐标的信息就得以保全的更多,这样第一个维度的选择就得以解决。
V a r ( a ) = 1 m ∑ i = 1 m ( a i − μ ) 2 Var(a) = \frac{1}{m}\sum^m_{i=1}(a_i-\mu)^2 Var(a)=m1i=1∑m(ai−μ)2
因为数据进行过归一话处理之后, μ = 0 \mu=0 μ=0,所以$Var(a) = \frac{1}{m}\summ_{i=1}(a_i)2 $
于是上面的问题被形式化表述为:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
第一个维度问题解决,第二个维度呢,我们第一个维度利用了方差的性质,第二个维度就要用协方差的性质了,如果我们还是单纯只选择方差最大的方向,很明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,因此,应该有其他约束条件。从直观上说,让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息。
数学上可以用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则: C o v ( a , b ) = 1 m ∑ i = 1 m a i ∗ b i Cov(a,b)=\frac{1}{m}\sum^m_{i=1}a_i * b_i Cov(a,b)=m1∑i=1mai∗bi
可以看到,在字段均值为0的情况下,两个字段的协方差简洁的表示为其内积除以元素数m。
当协方差为0时,表示两个字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。
3.5如何用矩阵选择合适的基向量
这里就就要用到上面X讲的实对称矩阵、协方差矩阵还有特征值特征向量这些东西啦。(这些你要是不能很好理解可以去看线性代数。)
首先我们对m个n维向量组成的矩阵 A T A^T AT,每一个元素减去每一行的均值,这一步其实就是对数据的归一化。
X = [ a 11 − μ 1 a 12 − μ 1 ⋯ a 1 m − μ 1 a 21 − μ 2 a 22 − μ 2 ⋯ a 2 m − μ 2 ⋮ ⋮ ⋱ ⋮ a n 1 − μ n a n 2 − μ n ⋯ a n m − μ n ] X = \begin{bmatrix} a_{11}-\mu_1 & a_{12}-\mu_1 & \cdots & a_{1m}-\mu_1\\\\ a_{21}-\mu_2 & a_{22}-\mu_2 & \cdots & a_{2m}-\mu_2\\\\ \vdots & \vdots & \ddots & \vdots \\\\ a_{n1}-\mu_n & a_{n2}-\mu_n & \cdots & a_{nm}-\mu_n \end{bmatrix} X=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a11−μ1a21−μ2⋮an1−μna12−μ1a22−μ2⋮an2−μn⋯⋯⋱⋯a1m−μ1a2m−μ2⋮anm−μn⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
首先我们得到协方差矩阵:矩阵X是矩阵A减去均值得到的矩阵
C
=
X
X
T
=
[
a
11
a
12
⋯
a
1
m
a
21
a
22
⋯
a
2
m
⋮
⋮
⋱
⋮
a
n
1
a
n
2
⋯
a
n
m
]
n
∗
m
[
a
11
a
12
⋯
a
1
m
a
21
a
22
⋯
a
2
m
⋮
⋮
⋱
⋮
a
n
1
a
n
2
⋯
a
n
m
]
m
∗
n
T
=
[
∑
i
=
1
m
(
a
i
1
)
2
∑
i
=
1
m
a
i
1
a
i
2
⋯
∑
i
=
1
m
a
i
1
a
i
n
∑
i
=
1
m
a
i
1
a
i
2
∑
i
=
1
m
(
a
i
2
)
2
⋯
∑
i
=
1
m
a
i
2
a
i
n
⋮
⋮
⋱
⋮
∑
i
=
1
m
a
i
1
a
i
n
∑
i
=
1
m
a
i
2
a
i
n
⋯
∑
i
=
1
(
m
a
i
n
)
2
]
n
∗
n
C = XX^T = \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1m}\\\\ a_{21} & a_{22} & \cdots & a_{2m}\\\\ \vdots & \vdots & \ddots & \vdots\\\\ a_{n1} & a_{n2} & \cdots & a_{nm}\\\\ \end{bmatrix}_{n*m} \begin{bmatrix} a_{11} & a_{12} & \cdots & a_{1m}\\\\ a_{21} & a_{22} & \cdots & a_{2m}\\\\ \vdots & \vdots & \ddots & \vdots\\\\ a_{n1} & a_{n2} & \cdots & a_{nm}\\\\ \end{bmatrix}^T _{m*n} = \begin{bmatrix} \sum^m_{i=1}(a_{i1})^2 & \sum^m_{i=1}a_{i1}a_{i2} & \cdots & \sum^m_{i=1}a_{i1}a_{in}\\\\ \sum^m_{i=1}a_{i1}a_{i2} & \sum^m_{i=1}(a_{i2})^2 & \cdots & \sum^m_{i=1}a_{i2}a_{in}\\\\ \vdots & \vdots & \ddots & \vdots\\\\ \sum^m_{i=1}a_{i1}a_{in} & \sum^m_{i=1}a_{i2}a_{in} & \cdots & \sum^m_{i=1(}a_{in})^2\\\\ \end{bmatrix}_{n*n}
C=XXT=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1ma2m⋮anm⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤n∗m⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡a11a21⋮an1a12a22⋮an2⋯⋯⋱⋯a1ma2m⋮anm⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤m∗nT=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡∑i=1m(ai1)2∑i=1mai1ai2⋮∑i=1mai1ain∑i=1mai1ai2∑i=1m(ai2)2⋮∑i=1mai2ain⋯⋯⋱⋯∑i=1mai1ain∑i=1mai2ain⋮∑i=1(main)2⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤n∗n
显然,协方差矩阵是一个实对称矩阵,而且对角线的值为每一个维度对应的方差,其余值为对应的协方差,用一个协方差矩阵就直接求出了方差和协方差。
现在进行数学推导,首先原始数据矩阵为A,进行归一化减去均值后得到的矩阵为X,矩阵X对应的协方差矩阵为 C = X X T C = XX^T C=XXT,基向量对应的矩阵为P,降维后得到的数据矩阵为 Y = P X Y=PX Y=PX,Y对应的协方差矩阵为 D = Y Y T D=YY^T D=YYT,以上为所有变量。现在推导D与C的关系。P为未知,Y为未知,C和X为已知。
D = Y Y T = P X ( P X ) T = P X X T P T = P C P T D = YY^T = PX(PX)^T = PXX^TP^T = PCP^T D=YYT=PX(PX)T=PXXTPT=PCPT
如果学过线性代数就可以得知。现在事情很明白了!我们需要使方差最大,协方差为0.就是使D为对角矩阵。
我们要找的P不是别的,而是能让原始协方差矩阵对角化的P。换句话说,优化目标变成了寻找一个矩阵P,满足PCPT是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件。
3.6用SVD(奇异值分解来实现PCA算法)
以上其实已经从数学逻辑和代码实现上说明了如何实现PCA算法,但其实还有另外一个方法。利用奇异值分解。
本质上和利用实对称矩阵的方法没有太大区别,也是利用方差和协方差,构建协方差矩阵。但在求特征值和特征向量时有所不同。
原方法是利用协方差矩阵是实对称矩阵很方便的求特征向量和特征值。但在这里可以使用奇异值分解来求解协方差矩阵的特征值和特征向量。
3.7如何用奇异值分解求解特征值和特征向量
这里作者还没学会,等学会了再来更新哈(嘿嘿)
3.8为什么要使用奇异值分解来求解
我们可以看出使用基于特征值分解来求解PCA时需要计算协方差矩阵,在数据量很大时,协方差矩阵会非常大,不利于计算和效率。但在使用奇异值分解时可以不求出协方差矩阵就可以求出特征值和特征向量。这也是奇异值分解的一大优点。
四、PCA算法
总结一下PCA的算法步骤:
设有m条n维数据。
- 将原始数据按列组成n行m列矩阵X
- 将X的每一行(代表一个属性字段)进行零均值化,即减去这一行的均值
- 求出协方差矩阵 C = X X T C = XX^T C=XXT
- 求出协方差矩阵的特征值及对应的特征向量
- 将特征向量按对应特征值大小从上到下按行排列成矩阵,取前k行组成矩阵P
- Y=PX即为降维到k维后的数据
五、总结
PCA算法是属于非监督的算法,实现比较简单,但数学逻辑比较有意思,而且思想很有意思。
PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1 ,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴