主成分分析法PCA学习笔记
本章学习搬运来源:http://blog.codinglabs.org/articles/pca-tutorial.html
PCA的数学原理.
PCA的数学原理
PCA算法
PCA算法步骤:
设有m条n维数据。
1)将原始数据按列组成n行m列矩阵;
2)将X的每一行(每一行代表一个属性字段,每一列代表一条记录)进行零均值化,即减去这一行的均值;
3)求出协方差矩阵
C
=
1
m
X
X
T
C = \frac{1}{m}XX^T
C=m1XXT;
4)求出协方差矩阵的特征值及对应的特征向量;
5)将特征向量按对应特征值大小从上到下按排行成矩阵,取前k行组成矩阵
P
P
P;
6)
Y
=
P
X
Y = PX
Y=PX即为降为到
k
k
k维后的数据.
具体实例:PCA的数学原理.
PCA工作原理相关知识
1.内积
A ∗ B = ( a 1 , a 2 , ⋯ , a n ) T ⋅ ( b 1 , b 2 , ⋯ , b n ) T = a 1 b 1 + a 2 b 2 + ⋯ + a n b n A*B = (a_1,a_2,⋯,a_n)^T⋅(b_1,b_2,⋯,b_n)^T=a_1b_1+a_2b_2+⋯+a_nb_n A∗B=(a1,a2,⋯,an)T⋅(b1,b2,⋯,bn)T=a1b1+a2b2+⋯+anbn A ∗ B = ∣ A ∣ ∣ B ∣ c o s ( θ ) A*B = |A||B|cos(\theta) A∗B=∣A∣∣B∣cos(θ)
- A与B的内积等于A到B的投影长度乘以B的模,设向量B的模为1,则A与B的内积值等于A向B所在直线投影的矢量长度!
- 要准确描述向量,首先要确定一组基,然后给出基所在各个直线上的投影值,就可以了.
2.基
向量(x,y)实际上表示线性组合:
x
(
1
,
0
)
T
+
y
(
0
,
1
)
t
x(1,0)^T +y(0,1)^t
x(1,0)T+y(0,1)t
所以,要准确描述向量,首先要确定一组基,然后给出基所在各个直线上的投影,就可以了。
将(3,2)变换为新基上的坐标,就是用(3,2)与第一个基做内积运算,作为第一个新的坐标分量,然后用(3,2)与第二个基做内积运算,作为第二个新坐标的分量。实际上,我们可以用矩阵相乘的形式简洁的表示这个变换:
基变换的矩阵表示
(
1
/
2
1
/
2
−
1
/
2
1
/
2
)
(
3
2
)
=
(
5
/
2
−
1
/
2
)
\begin{pmatrix} 1/ \sqrt2 & 1/ \sqrt2 \\ -1/ \sqrt2 & 1/ \sqrt2 \\ \end{pmatrix}\begin{pmatrix} 3 \\ 2 \\ \end{pmatrix}=\begin{pmatrix} 5/ \sqrt2 \\ -1/ \sqrt2 \\ \end{pmatrix}
(1/2−1/21/21/2)(32)=(5/2−1/2)
其中矩阵的两行分别为两个基,乘以原向量,其结果刚好为新基的坐标。推广一下,如果我们有m个二维向量,只要将二维向量按列排成一个两行m列矩阵,然后用“基矩阵”乘以这个矩阵,就得到了所有这些向量在新基下的值,例如(1,1),(2,2),(3,3),想变换到刚才那组基上,则可以这样表示:
(
1
/
2
1
/
2
−
1
/
2
1
/
2
)
(
1
2
3
1
2
3
)
=
(
2
/
2
4
/
2
6
/
2
0
0
0
)
\begin{pmatrix} 1/ \sqrt2 & 1/ \sqrt2 \\ -1/ \sqrt2 & 1/ \sqrt2 \\ \end{pmatrix}\begin{pmatrix} 1 & 2 & 3\\ 1 & 2 & 3\\ \end{pmatrix}=\begin{pmatrix} 2/ \sqrt2 & 4/ \sqrt2 & 6/ \sqrt2\\ 0 & 0 & 0\\ \end{pmatrix}
(1/2−1/21/21/2)(112233)=(2/204/206/20)于是一组向量的基变换被干净的表示为矩阵的相乘。
一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果
3.矩阵相乘
- 抽象数学解释:矩阵可以表示一种线性变换.
- 具体物理解释:两个矩阵相乘的意义是将右边矩阵中的每一列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。
4.协方差矩阵及优化目标
不同的基可以对同样一组数据给出不同的表示,如果基的数量少于向量本身的维数,则可以达到降维的效果。那么问题来了:如何选择基才是最优的,或者说,如果我们有一组N维向量,现在要将其降维到K维(k<N),那么我们应该如何选择K个基才能最大程度保留原有的信息?
直观的看法是:希望投影后的投影值尽可能分散。而这种分散程度,可以用数学上的方差来表述。此处,一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,即
V
a
r
(
a
)
=
1
m
∑
i
=
1
n
(
a
i
2
−
μ
)
2
Var(a)= \frac{1}{m}\displaystyle\sum_{i=1}^{n}( a_i^2-\mu)^2
Var(a)=m1i=1∑n(ai2−μ)2由于上面我们已经将每个字段的均值化为0了,因此方差可以直接用每个元素的平方和除以元素个数表示:
V
a
r
(
a
)
=
1
m
∑
i
=
1
n
a
i
2
Var(a)= \frac{1}{m}\displaystyle\sum_{i=1}^{n}a_i^2
Var(a)=m1i=1∑nai2于是上面的问题被形式化表述为:寻找一个一维基,使得所有数据变换为这个基上的坐标表示后,方差值最大。
5协方差
对于上面二维降维一维的问题来说,找到那个使得方差最大的方向就可以了。对于更高维,考虑三维降到二维问题,如果是单纯只选择方差最大的方差,很明显,这个两个方向“几乎重合在一起”。从直观上说,让两个方向尽可能表示方差最大,但是不希望它们之间存在(线性)相关性的,因为相关性意味这两个字段不是完全独立,必然存在重复表示的信息。
数学上可以用两个变量的协方差表示其相关性,由于已经让每个字段均值为0,则:
C
o
v
(
a
,
b
)
=
1
m
∑
i
=
1
m
a
i
b
i
Cov(a,b)=\frac{1}{m}\displaystyle\sum_{i=1}^{m}a_ib_i
Cov(a,b)=m1i=1∑maibi
可以看到,在字段均值为0的情况下,两个字段的协方差简洁的表示为其内积除以元素数m。
当协方差为0时,表示两个变量完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。
6.协方差矩阵
上面我们导出了优化目标,但不能直接操作,下面继续研究数据计算方案。
我们看到,最终要达到的目的与变量内方差和变量间协方差有密切关系。将方差与方差统一,两者均可表示为内积的形式:
假设我们只有a和b两个变量,那么我们将它们按行组成矩阵
X
X
X:
X
=
(
a
1
a
2
.
.
.
a
m
b
1
b
2
.
.
.
b
m
)
X=\begin{pmatrix} a_1 & a_2 &... & a_m\\ b_1 & b_2 &... & b_m\\ \end{pmatrix}
X=(a1b1a2b2......ambm)
然后我们用
X
X
X乘以
X
X
X的转置,并乘上系数1/m:
1
m
X
X
T
=
(
1
m
∑
i
=
1
m
a
i
2
1
m
∑
i
=
1
m
a
i
b
i
1
m
∑
i
=
1
m
a
i
b
i
1
m
∑
i
=
1
m
b
i
2
)
\frac{1}{m}XX^T=\begin{pmatrix} \frac{1}{m}\displaystyle\sum_{i=1}^{m}a_i^2 & \frac{1}{m}\displaystyle\sum_{i=1}^{m}a_ib_i\\ \frac{1}{m}\displaystyle\sum_{i=1}^{m}a_ib_i & \frac{1}{m}\displaystyle\sum_{i=1}^{m}b_i^2\\ \end{pmatrix}
m1XXT=⎝⎜⎜⎜⎛m1i=1∑mai2m1i=1∑maibim1i=1∑maibim1i=1∑mbi2⎠⎟⎟⎟⎞
这个矩阵对角线上的两个元素分别是两个字段的方差,而其他元素是a和b的协方差。
根据矩阵相乘的运算法则,这个结论很容易被推广到一般情况:
设我们有m个n维数据记录,将其按列排成n乘m的矩阵X,设 C = 1 m X X T C = \frac{1}{m}XX^T C=m1XXT,则C是一个对称矩阵,其对角线分别个各个字段的方差,而第i行j列和j行i列元素相同,表示i和j两个字段的协方差。
7.协方差矩阵对角化
根据上述推导,我们发现要达到优化目前,等价于将协方差矩阵对角化:即除对角线外的其他元素划为0,并且在对角线上将元素按大小从上到下排列,这样我们就达到了优化目的。
我们进一步看下原矩阵与基变换矩阵协方差矩阵的关系:
设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设Y = PX,则Y为X对P做基变换后的数据。设Y的协方差矩阵为D,我们推导D与C的关系:
D
=
1
m
Y
Y
T
=
1
m
(
P
X
)
(
P
X
)
T
=
1
m
P
X
X
T
P
T
=
P
(
1
m
X
X
T
)
P
T
=
P
C
P
T
D = \frac{1}{m}YY^T= \frac{1}{m}(PX)(PX)^T= \frac{1}{m}PXX^TP^T=P( \frac{1}{m}XX^T)P^T=PCP^T
D=m1YYT=m1(PX)(PX)T=m1PXXTPT=P(m1XXT)PT=PCPT
现在我们要找到P不是别的,而是能让原始协方差矩阵对角化的P。换句话说,优化目标变成了寻找一个矩阵P,满足
P
C
P
T
PCP^T
PCPT是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X从N维降到K维并满足上述优化条件。
至此,我们离“发明”PCA还有仅一步之遥!
现在所有焦点都聚焦在了协方差矩阵对角化问题上,由上文知道,协方差矩阵C是一个对称矩阵,在线性代数上,实对称矩阵由一系列非常好的性质:
1)实对称矩阵不同特征值对应的特征向量必然正交;
2)设特征向量
λ
\lambda
λ重数为r,则必然存在r个线性无关的特征向量对应于
λ
\lambda
λ,因此可以将这r个特征向量单位正交化。
由上面两条可知,一个n行n列的实对称矩阵一定可以找到n个单位正交特征向量,设这n个特征向量
e
1
,
e
2
,
.
.
.
,
e
n
e_1,e_2,...,e_n
e1,e2,...,en,我们将其按列组成矩阵:
E
=
(
e
1
e
2
.
.
.
e
n
)
E=(e_1 e_2 ... e_n)
E=(e1e2...en)则对协方差矩阵C有如下结论:
E
T
C
E
=
Λ
=
(
λ
1
λ
2
⋱
λ
n
)
E^TCE=\Lambda= \begin{pmatrix} \lambda_1 & & & \\ & \lambda_2 & & \\ & & \ddots & \\ & & & \lambda_n \\ \end{pmatrix}
ETCE=Λ=⎝⎜⎜⎛λ1λ2⋱λn⎠⎟⎟⎞
其中
Λ
\Lambda
Λ为对角矩阵,其对角元素为各特征向量对应的特征值。
到这里,我们发现我们已经找到了需要的矩阵P:
P
=
E
T
P = E^T
P=ET
P是协方差矩阵的特征向量单位化后按行排列出的矩阵,其中每一行都是C的一个特征向量。如果P安装
Λ
\Lambda
Λ中特征值的从大到小,将特征向量从上到下排列,则用P的前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y。
PCA反推
1.找到方差大的主成分,同时各个主成分相互“独立”,这些主成分中相互之间的方差为0,即主成分的协方差矩阵为对角矩阵,除了对角线上的元素(方差)不为零,其他各个元素都为0;
2.通过计算原始向量的协方差矩阵的特征向量;