目录
本人数学渣,此文主要按照个人理解写,欢迎各位朋友批评指正。
相关数学知识
理解主成分分析需要一些数学知识
- 向量內积
- 向量投影
- 基
- 方差与协方差
- 协方差矩阵
- 拉格朗日乘数法
- 特征值和特征向量
向量投影
由高中数学我们可以知道:
A
⋅
B
=
∣
A
∣
∣
B
∣
c
o
s
(
a
)
A \cdot B = |A||B|cos(a)
A⋅B=∣A∣∣B∣cos(a)
其中A在B上的投影为:
∣
A
∣
c
o
s
(
a
)
=
A
⋅
B
∣
B
∣
|A|cos(a) = \frac{A \cdot B}{|B|}
∣A∣cos(a)=∣B∣A⋅B
如果B的模长为1,则有
∣
A
∣
c
o
s
(
a
)
=
A
⋅
B
|A|cos(a) =A \cdot B
∣A∣cos(a)=A⋅B
基
线性空间V的一个子集S如果满足以下两个条件,那么称S是V的一个基
- S是线性无关的
- V中任意向量都能由S中的有限多个向量线性表出
例如(0,1)、(1,0)就是二维线性空间的一组基,首先它们线性无关,其次二维空间上的任意向量(x,y)都可以表示成 x ( 1 , 0 ) + y ( 0 , 1 ) x(1,0)+y(0,1) x(1,0)+y(0,1)。又由向量投影的定义,我们可以发现,二维空间上的向量可以由它在各个基上的投影表示(x(1,0)表示向量在(1,0)上的投影,y(0,1)表示向量在(0,1)上的投影),而n维向量也是如此。
基可以是正交的也可以是非正交的。
基变换
顾名思义,我们可以给向量换一组基。怎么换呢?这里用到了矩阵乘法
一般的,如果我们有M个N维向量,想将其变换为由R个N维向量表示的新空间中,那么首先将R个基按行组成矩阵A,然后将向量按列组成矩阵B,那么两矩阵的乘积AB就是变换结果,其中AB的第m列为A中第m列变换后的结果。
两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去
例如,我们要把以(0,1)、(1,0)为基的向量(3,2)变换到以
(
1
2
,
1
2
)
(\frac1{\sqrt2},\frac1{\sqrt2})
(21,21)和
(
−
1
2
,
1
2
)
(-\frac1{\sqrt2},\frac1{\sqrt2})
(−21,21)为基的空间去。
可以进行如下计算:
(
1
2
1
2
−
1
2
1
2
)
(
3
2
)
=
(
5
2
−
1
2
)
\begin{pmatrix}\frac1{\sqrt2}&\frac1{\sqrt2}\\-\frac1{\sqrt2}&\frac1{\sqrt2}\end{pmatrix}\begin{pmatrix}3\\2\end{pmatrix}=\begin{pmatrix}\frac5{\sqrt2}\\\frac{-1}{\sqrt2}\end{pmatrix}
(21−212121)(32)=(252−1)
方差与协方差
方差:设 X X X是一个随机变量,若 E { [ X − E ( X ) ] 2 } E\{[X-E(X)]^2\} E{[X−E(X)]2}存在,则称 E { [ X − E ( X ) ] 2 } E\{[X-E(X)]^2\} E{[X−E(X)]2}为 X X X的方差,记为 D ( X ) D(X) D(X)或 V a r ( X ) Var(X) Var(X)。方差用于衡量随机变量的离散程度。
协方差:量 E { [ X − E ( X ) ] [ Y − E ( Y ) ] } E\{[X-E(X)][Y-E(Y)]\} E{[X−E(X)][Y−E(Y)]}称为随机变量 X X X和 Y Y Y的协方差,记为 C o v ( X , Y ) Cov(X,Y) Cov(X,Y)。协方差用于衡量两个变量的总体误差。
协方差矩阵
设n维随机变量
(
X
1
,
X
2
,
.
.
.
,
X
n
)
(X_1,X_2,...,X_n)
(X1,X2,...,Xn)的二阶混合中心矩(就是元素的方差和两两元素之间的的协方差)
c
i
j
=
C
o
v
(
X
i
,
X
j
)
=
E
{
[
X
i
−
E
(
X
)
]
[
X
j
−
E
(
X
)
]
}
,
i
,
j
=
1
,
2
,
.
.
.
,
n
c_{ij}=Cov(X_i,X_j)=E\{[X_i-E(X)][X_j-E(X)]\},i,j=1,2,...,n
cij=Cov(Xi,Xj)=E{[Xi−E(X)][Xj−E(X)]},i,j=1,2,...,n都存在,则称矩阵
C
=
(
c
11
c
12
…
c
1
n
c
21
c
22
…
c
2
n
⋮
⋮
⋮
c
n
1
c
n
2
…
c
n
n
)
C=\begin{pmatrix}c_{11}&c_{12}&\dots&c_{1n}\\c_{21}&c_{22}&\dots&c_{2n}\\\vdots&\vdots&&\vdots\\c_{n1}&c_{n2}&\dots&c_{nn}\end{pmatrix}
C=⎝⎜⎜⎜⎛c11c21⋮cn1c12c22⋮cn2………c1nc2n⋮cnn⎠⎟⎟⎟⎞
为n维随机变量
(
X
1
,
X
2
,
.
.
.
,
X
n
)
(X_1,X_2,...,X_n)
(X1,X2,...,Xn)的协方差矩阵。
不难发现协方差矩阵是一个对称矩阵。
假如我们对X进行零均值化,即对所有
X
i
X_i
Xi,都减去均值
X
i
−
E
(
X
)
X_i - E(X)
Xi−E(X),则有
C
=
X
X
T
(
假
设
X
是
列
向
量
)
C=XX^T(假设X是列向量)
C=XXT(假设X是列向量)
拉格朗日乘数法(Lagrange multiplier)
在数学最优问题中,拉格朗日乘数法(以数学家约瑟夫·路易斯·拉格朗日命名)是一种寻找变量受一个或多个条件所限制的多元函数的极值的方法。
以求解二元函数在等式条件下的极值为例:给定函数
f
(
x
,
y
)
f(x,y)
f(x,y)和等式条件
φ
(
x
,
y
)
\varphi(x,y)
φ(x,y),求解函数在条件下的极值点,可以先做拉格朗日函数
F
(
x
,
y
,
λ
)
=
f
(
x
,
y
)
+
λ
φ
(
x
,
y
)
F(x,y, \lambda)=f(x,y)+\lambda\varphi(x,y)
F(x,y,λ)=f(x,y)+λφ(x,y)然后分别对
x
x
x、
y
y
y和
λ
\lambda
λ 求导,并令导等于0,解方程组,即可求得极值。
特征值和特征向量
设
A
A
A 是n阶方阵,如果数
λ
\lambda
λ 和n维非零列向量
x
x
x 使关系式
A
x
=
λ
x
Ax=\lambda x
Ax=λx成立,那么这样的数
λ
\lambda
λ 称为矩阵
A
A
A 特征值,非零向量
x
x
x 称为
A
A
A 的对应于特征值
λ
\lambda
λ 的特征向量。
主成分分析(PCA)原理
主成分分析(Principal Component Analysis,PCA), 是一种统计方法。通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。
- 主成分分析是一种降维方法
- 主成分分析可以用作数据的有损压缩
PCA干了什么,它为什么能降维?
前面说过,向量可以由它在各个基上的投影表示,在不同的基上,向量有不同的表示方法。而主成分分析可以说是为向量寻找一组新的基,新的基的数量一般小于待降维向量的维度,通过将现有向量投影到新的基上(进行基变换),就达到了降维的目的。但是这样还不行,我们要求向量在新的基上需要尽可能的保留原始的信息。
如何使降维后的向量尽可能地保留原来的信息呢?
假设有m个n维向量,对这一组向量进行降维,我们可以选择
r
r
r 个新基,计算出原始向量在新基上投影,并规定向量在新基上的投影尽可能地分散。(直观地看,如果一组向量在基上越分散,就越容易区分,保留的信息就越多。)如果用方差表示投影的分散程度,则有如下公式:
V
a
r
(
X
)
=
E
{
[
a
i
−
μ
i
]
2
}
Var(X)=E\{[a_{i}-\mu_i]^2\}
Var(X)=E{[ai−μi]2}其中
a
i
a_{i}
ai是降维后的样本矩阵第 i 维的值,
μ
\mu
μ 是样本矩阵第 i 维的均值。
我们希望向量在基上投影后的方差尽可能地大。
n维向量降成r维,第1个基可以是方差最大的基,那第2个到第r个基又如何选呢?
只考虑方差可能导致不同基上的投影很包含许多重复信息,为了避免降维后的向量包含太多重复信息,规定投影后向量各个维度之间之间的相关性尽要可能地小。用协方差表示相关性,有如下公式
C
o
v
(
a
i
,
a
j
)
=
E
{
[
a
i
−
μ
i
]
[
a
j
−
μ
j
]
}
Cov(a_{i},a_{j}) = E\{[a_{i}-\mu_i][a_{j}-\mu_j]\}
Cov(ai,aj)=E{[ai−μi][aj−μj]}
当协方差为0时,表示降维后的向量各个维度之间没有相关性,不包含重复信息。根据线性代数的知识我们可以知道,此时基之间应该是两两正交的。所以在选取第2个基时,应该选择与第一个基正交且方差尽可能大的方向。
综上所述,PCA要做的事如下:
- 寻找一组基,使向量在基上的投影方差最大
- 基与基之间需要正交,以确保降维后向量的不同维度之间的协方差为0
数学推导
假设原样本为a(m个n维向量),首先我们需要找到一个基p,保证向量在基上的投影方差最大
b
=
p
a
V
=
m
a
x
p
1
m
∑
m
i
(
b
i
−
b
‾
)
2
=
m
a
x
p
1
m
∑
m
i
(
p
a
i
−
p
a
‾
)
2
b = pa\\ V=\underset p{max}\frac1m\sum_m^i(b_i-\overline b)^2\\ =\underset p{max}\frac1m\sum_m^i(pa_i-p\overline a)^2
b=paV=pmaxm1m∑i(bi−b)2=pmaxm1m∑i(pai−pa)2为方便计算,我们事先对A进行零均值化,则
a
‾
=
0
\overline a=0
a=0 从而
V
=
m
a
x
p
1
m
∑
m
i
(
p
a
i
)
2
=
m
a
x
p
1
m
∑
m
i
(
p
a
i
)
(
p
a
i
)
T
=
m
a
x
p
1
m
∑
m
i
(
p
a
i
a
i
T
p
T
)
=
m
a
x
p
1
m
∑
m
i
(
p
a
i
a
i
T
p
T
)
=
m
a
x
p
1
m
p
C
o
v
(
a
)
p
T
V=\underset p{max}\frac1m\sum_m^i(pa_i)^2\\ =\underset p{max}\frac1m\sum_m^i(pa_i)(pa_i)^T\\ =\underset p{max}\frac1m\sum_m^i(pa_i{a_i}^Tp^T)\\ =\underset p{max}\frac1m\sum_m^i(pa_i{a_i}^Tp^T)\\ =\underset p{max}\frac1mpCov(a)p^T\\
V=pmaxm1m∑i(pai)2=pmaxm1m∑i(pai)(pai)T=pmaxm1m∑i(paiaiTpT)=pmaxm1m∑i(paiaiTpT)=pmaxm1pCov(a)pT接下来解上面的式子,为了使解唯一,我们添加等式条件
∣
∣
p
∣
∣
2
=
1
||p||_2=1
∣∣p∣∣2=1 ,则有下面带一个等式条件的最优化问题
V
=
m
a
x
p
1
m
p
C
o
v
(
a
)
p
T
s
.
t
.
∣
∣
p
∣
∣
2
=
1
V=\underset p{max}\frac1mpCov(a)p^T\\ s.t.\;\;||p||_2=1
V=pmaxm1pCov(a)pTs.t.∣∣p∣∣2=1上面问题等价于
V
=
m
a
x
p
p
T
C
o
v
(
a
)
p
s
.
t
.
∣
∣
p
∣
∣
2
=
1
V=\underset p{max}p^TCov(a)p\\ s.t.\;\;||p||_2=1
V=pmaxpTCov(a)ps.t.∣∣p∣∣2=1对于这类问题,通常用拉格朗日乘数法解决
F
=
m
a
x
p
p
T
C
o
v
(
a
)
p
+
λ
(
∣
∣
p
∣
∣
2
−
1
)
F =\underset p{max}p^TCov(a)p + \lambda(||p||_2-1)
F=pmaxpTCov(a)p+λ(∣∣p∣∣2−1)分别对
p
p
p、
λ
\lambda
λ求导,解方程组,解得
C
o
v
(
a
)
p
=
λ
p
Cov(a)p = \lambda p
Cov(a)p=λp这很明显是特征值特征向量的定义,
p
p
p是协方差矩阵
C
o
n
v
(
a
)
Conv(a)
Conv(a)的一个特征向量,而
λ
\lambda
λ是对应的特征值。另外,有下列等式
m
a
x
p
p
T
C
o
v
(
a
)
p
=
m
a
x
p
p
T
λ
p
\underset p{max}p^TCov(a)p=\underset p{max}p^T\lambda p
pmaxpTCov(a)p=pmaxpTλp所以,我们只要求得协方差矩阵最大特征值对应的特征向量就是求得了
p
p
p 。
接下来,我们需要找第二个基,同样,我们需要保证方差最大且与之前的基正交。由上面的推导,我们发现要想使基上的投影方差最大
p
p
p就必须满足
C
o
v
(
a
)
p
=
λ
p
=
>
m
a
x
p
p
T
C
o
v
(
a
)
p
=
m
a
x
p
p
T
λ
p
Cov(a)p = \lambda p=>\underset p{max}p^TCov(a)p=\underset p{max}p^T\lambda p
Cov(a)p=λp=>pmaxpTCov(a)p=pmaxpTλp但由于最大的特征值对应的特征向量已经被选择作为第一个基,所以我们只能选择第二大的。
接下来考察另一个条件,新选择的基需要与之前的基正交。由于协方差矩阵是一个是对称矩阵,对于对称矩阵,不同特征值对应的特征向量必然正交,所以第二大特征值对应的特征向量就是我们要找的基。
类似的,如果降维后的向量有3维、4维,我们可以继续选择协方差矩阵第3、第4大的特征值对应的特征向量。
最后,将求完的基按行组成的矩阵P,则可以通过下面公式即可得到降维后的数据
B
=
P
A
B = PA
B=PA
算法实战
算法流程
如果有m条n维数据
- 将数据整理成n行m列的矩阵A
- 将矩阵的每一行零均值化
- 计算原始数据的协方差矩阵
- 计算协方差矩阵的特征值和特征向量
- 选取最大的K个特征值所对应的特征向量组成构成矩阵P
- 通过 B = P A B = PA B=PA 计算得到降维后的数据
算法核心代码
def PCA(data,k):
A = data
mean = np.mean(A,0)#计算均值
means= np.tile(mean,(A.shape[0],1))
A = A - means #零均值化
Cov = np.cov(A.T) #求协方差矩阵
print(Cov.shape)
featValue, featVec= np.linalg.eig(Cov)#计算特征值特征向量 the column v[:,i] is the eigenvector corresponding to the eigenvalue w[i].
index = np.argsort(-featValue)[:k]
P = featVec.T[index]
B = np.dot(P,A.T)
C = np.dot(P.T,B).T + means
return B,C
算法实战-图像压缩
实际的图像压缩要更复杂,这里仅仅简单地应用上面的算法
#读取图片到矩阵
def readImg(imgpath):
img = Image.open(imgpath).convert("L")
print('原始图片大小',img.size)
imgmatrix = np.asarray(img)
img = Image.fromarray(imgmatrix)
print('原始图片大小',imgmatrix.shape)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off') # 关掉坐标轴为 off
plt.title('Original Img') # 图像题目
plt.show()
return imgmatrix
#从矩阵还原图片
def ShowImg(imgmatrix):
img = Image.fromarray(imgmatrix)
print('解压缩图片大小',imgmatrix.shape)
plt.figure(figsize=(10,10))
plt.imshow(img)
plt.axis('off') # 关掉坐标轴为 off
plt.title('Decompression Img') # 图像题目
plt.show()
#实验
imm = readImg('Image.JPG')
B,C=PCA(imm,120)#第二维压缩10倍
ShowImg(C)
实验结果
原始图像
降维后还原的图像