版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23947237/article/details/83411261
子空间:从 PCA 到 DNN(一)
1. PCA
主成分分析算法 (Principal Components Analysis, PCA) 是一种常用的数据分析方法。PCA 通过线性 变换将原始数据变换为一组各维度线性无关 的表示,可用于提取数据的主要特征分量,常用于高维数据的降维 。该算法尝试搜寻数据所处的子空间,只需计算特征向量就可以进行降维。
设想有一个数据集,其中每个元素代表一辆车,车的属性可能是车的最高速度,每公里耗油量等。如果有这样两个属性,一个以千米为单位的最大速度,一个以英里为单位的最大速度。这两个速度很显然是线性关系,可能因为数字取整等缘故有一点点扰动,但不影响整体线性关系 。因此实际上,数据的信息量是冗余的。多一维度的属性并不包括更多信息。PCA 解决的就是将多余的属性去掉的问题。
再比如直升飞机驾驶员。每个驾驶员都有两个属性,第一个表示驾驶员的技能评估,第二个表示驾驶员对驾驶的兴趣程度。由于驾驶直升机难度较大,所以一般只有对其有很大的兴趣,才能较好的掌握这项技能。因此这两个属性是强相关 的。
由图发现
u
1
u_1
u 1 方向体现了数据的相关性,称之为主方向 ,而垂直的
u
2
u_2
u 2 则表现了噪声的扰动。接下来我们的任务就是如何寻找这个主方向 ?在解决这个问题前先要复习一下相关内容。
1.1 向量、基变换
数据被抽象为一组向量,那么下面有必要研究一些向量的数学性质,这也是 PCA 的理论基础。参考链接
内积 :
A
=
(
x
1
,
y
1
)
T
,
B
=
(
x
2
,
y
2
)
T
A=(x_1,y_1)^T, \quad B=(x_2,y_2)^T
A = ( x 1 , y 1 ) T , B = ( x 2 , y 2 ) T 。联系余弦定理,有
A
⋅
B
=
x
1
x
2
+
y
1
y
2
=
∣
A
∣
∣
B
∣
cos
α
\begin{aligned} A \cdot B &= x_1x_2+y_1y_2 \\ &= \vert A\vert \vert B\vert \cos \alpha \end{aligned}
A ⋅ B = x 1 x 2 + y 1 y 2 = ∣ A ∣ ∣ B ∣ cos α 设向量
B
B
B 的模为 1,则
A
A
A 与
B
B
B 的内积值等于
A
A
A 向
B
B
B 所在直线投影 的矢量长度。
基 :要准确描述向量
(
x
,
y
)
T
(x,y)^T
( x , y ) T ,首先要确定一组基,然后给出在基所在的各个直线上的投影值 ,即基向量的线性组合 来表示一个向量。只不过我们经常默认以
(
1
,
0
)
(1,0)
( 1 , 0 ) 和
(
0
,
1
)
(0,1)
( 0 , 1 ) 为基。
(
x
,
y
)
=
x
(
1
,
0
)
+
y
(
0
,
1
)
(x,y) = x(1,0)+y(0,1)
( x , y ) = x ( 1 , 0 ) + y ( 0 , 1 )
例如,
(
1
,
1
)
(1,1)
( 1 , 1 ) 和
(
−
1
,
1
)
(-1,1)
( − 1 , 1 ) 也可以成为一组基。一般我们希望基的模 是 1,因为从内积的意义可以看到,基的模是 1 就可以方便用向量点乘基 直接获得其在新基上的坐标 (投影值)了。实际上,对应任何一个向量我们总可以找到其同方向上模为 1 的向量(除以模),例如上面的基可以变为
(
1
2
,
1
2
)
(\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}})
( 2
1 , 2
1 ) 和
(
−
1
2
,
1
2
)
(−\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}})
( − 2
1 , 2
1 ) 。此时二维笛卡尔直角坐标系上的一个坐标
(
3
,
2
)
(3,2)
( 3 , 2 ) 就在新的基下表示为
x
′
=
(
3
,
2
)
⋅
(
1
2
,
1
2
)
y
′
=
(
3
,
2
)
⋅
(
−
1
2
,
1
2
)
(
x
′
,
y
′
)
=
(
5
2
,
−
1
2
)
\begin{aligned} x^{'} &= (3,2) \cdot (\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}}) \\ y^{'} &= (3,2) \cdot (-\frac{1}{\sqrt{2}},\frac{1}{\sqrt{2}}) \\ (x^{'}, y^{'}) &=(\frac{5}{\sqrt{2}},-\frac{1}{\sqrt{2}}) \end{aligned}
x ′ y ′ ( x ′ , y ′ ) = ( 3 , 2 ) ⋅ ( 2
1 , 2
1 ) = ( 3 , 2 ) ⋅ ( − 2
1 , 2
1 ) = ( 2
5 , − 2
1 ) 可以成为一组基的唯一要求就是线性无关 ,非正交的基也是可以的。不过因为正交基有较好的性质,所以一般使用的基都是正交的。
基变换 :描述向量在不同的基向量下的变换,上述的变换可以通过矩阵相乘的形式简洁的表示为:
(
1
/
2
1
/
2
−
1
/
2
1
/
2
)
(
3
2
)
=
(
5
/
2
−
1
/
2
)
\begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ -1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix} \begin{pmatrix} 3 \\ 2 \end{pmatrix} = \begin{pmatrix} 5/\sqrt{2} \\ -1/\sqrt{2} \end{pmatrix}
( 1 / 2
− 1 / 2
1 / 2
1 / 2
) ( 3 2 ) = ( 5 / 2
− 1 / 2
) 假设
p
r
=
(
p
r
x
,
p
r
y
)
T
p_r = (p_{rx},p_{ry})^T
p r = ( p r x , p r y ) T 是基(注意
R
R
R 个基需要满足是一组线性无关 的),
a
m
a_m
a m 是坐标
(
x
m
,
y
m
)
T
(x_m,y_m)^T
( x m , y m ) T 。
(
p
1
T
p
2
T
⋮
p
R
T
)
(
a
1
a
2
⋯
a
M
)
=
(
p
1
T
a
1
p
1
T
a
2
⋯
p
1
T
a
M
p
2
T
a
1
p
2
T
a
2
⋯
p
2
T
a
M
⋮
⋮
⋱
⋮
p
R
T
a
1
p
R
T
a
2
⋯
p
R
T
a
M
)
\begin{pmatrix} p_1^T \\ p_2^T \\ \vdots \\ p_R^T \end{pmatrix} \begin{pmatrix} a_1 & a_2 & \cdots & a_M \end{pmatrix} = \begin{pmatrix} p_1^T a_1 & p_1^T a_2 & \cdots & p_1^T a_M \\ p_2^T a_1 & p_2^T a_2 & \cdots & p_2^T a_M \\ \vdots & \vdots & \ddots & \vdots \\ p_R^T a_1 & p_R^T a_2 & \cdots & p_R^T a_M \end{pmatrix}
⎝ ⎜ ⎜ ⎜ ⎛ p 1 T p 2 T ⋮ p R T ⎠ ⎟ ⎟ ⎟ ⎞ ( a 1 a 2 ⋯ a M ) = ⎝ ⎜ ⎜ ⎜ ⎛ p 1 T a 1 p 2 T a 1 ⋮ p R T a 1 p 1 T a 2 p 2 T a 2 ⋮ p R T a 2 ⋯ ⋯ ⋱ ⋯ p 1 T a M p 2 T a M ⋮ p R T a M ⎠ ⎟ ⎟ ⎟ ⎞
两个矩阵相乘的意义是将右边矩阵中的每一列列向量变换到左边矩阵中每一行行向量为基所表示的空间中去。本质上一个矩阵可以表示一种线性变换 。
1.2 协方差
选择不同的基可以对同样一组数据给出不同的表示,而且如果基的数量少于向量本身的维数,则可以达到降维的效果。 假设
P
R
×
N
X
N
×
M
=
Y
R
×
M
P_{R\times N}X_{N \times M}=Y_{R \times M}
P R × N X N × M = Y R × M ,这里基底数目
R
R
R 可以小于
N
N
N ,而
R
R
R 决定了变换后数据的维数。也就是说,我们可以将高维数据变换到更低维度的空间中去,因此这种矩阵相乘的表示也可以表示降维变换。
但是我们还没有回答一个最最关键的问题:如何选择基才是最优的 。如何找到数据的主方向呢? 或者说现在要将数据降到
K
K
K 维,那么我们应该如何从一组基中选择
K
K
K 个基才能最大程度保留原有的信息? 在二维空间下可以这样理解,有一个单位向量
u
u
u ,若从原点出发,这样定义
u
u
u 以后就相当于定义了一条直线。每个数据点在该直线上都有一个投影点。对基变换的讨论我们已经知道,这个问题实际上是要在二维平面中选择一个方向,将所有数据都投影到这个方向所在直线上,用投影值表示原始记录。这是一个实际的二维降到一维的问题 。
如图表示了 5 条数据,经过归一化处理后对应于 5 个数据点。
如果我们将主方向
u
u
u 选择为
x
x
x 轴,可以看出数据点如果向
x
x
x 轴投影,那么降维后最左边的两个点会重叠在一起 ,中间的两个点也会重叠在一起,于是本身四个各不相同的二维点投影后只剩下两个不同的值了,这是一种严重的信息丢失。所以看来
x
x
x 轴不是最好的投影选择。
直观目测如果向通过第一象限和第三象限的斜线投影,则五个点在投影后还是可以区分的。其实我们寻找的也是一个投影后可以很好区分各个数据点的主方向
u
u
u ,希望投影后的投影值尽可能分散 。
这种分散程度 ,可以用数学上的方差 来表述。于是上面的问题被形式化表述为:寻找一组基,使得所有数据变换为这组基上的坐标表示后,方差值最大 。
对于更高维数据,还有一个问题需要解决。多维空间下,多个主方向时怎么办? 那就是不止寻找一个单位向量了,比如考虑三维降到二维的问题,与之前相同,首先我们希望找到一个方向使得投影后方差最大,这样就完成了第一个方向的选择,继而我们还要选择第二个投影方向 。找到一个主方向后,将该主方向的方差影响去掉 ,然后再找主方向。如何去掉前一个主方向的方差影响呢?
对于二维数据来说,是将所有数据点在垂直于该主方向的另一个方向上 做投影,要去掉主方向
u
1
u_1
u 1 的方差影响,需要在
u
2
u_2
u 2 方向上进行投影,多维空间上也可以类推。
从直观上说,让两个字段尽可能表示更多的原始信息,我们不希望它们之间存在(线性)相关性 ,因为相关性意味着两个字段不是完全独立,必然存在重复表示 的信息。即数学上可以用两个字段的协方差表示其相关性 ,当协方差为 0 时,表示两个字段完全独立 。
为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上 选择。因此最终选择的两个方向一定是正交的。
至此,我们得到了降维问题的优化目标 :将一组向量降维,其目标是选择一组单位正交基,使得原始数据变换到这组基上后,各字段两两间协方差尽可能接近于 0,而字段的方差则尽可能大 。根据上述原理,我们发现要达到优化目前,等价于将协方差矩阵对角化:即除对角线外的其它元素化为 0,并且在对角线上将元素按大小从上到下排列。下面是原始数据
X
X
X 的协方差矩阵。
R
X
=
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
)
R_X=\frac{1}{m}XX^\mathrm{T}=\begin{pmatrix} \frac{1}{m}\sum_{i=1}^m{a_i^2} & \frac{1}{m}\sum_{i=1}^m{a_ib_i} \\ \frac{1}{m}\sum_{i=1}^m{a_ib_i} & \frac{1}{m}\sum_{i=1}^m{b_i^2} \end{pmatrix}
R X = m 1 X X T = ( m 1 ∑ i = 1 m a i 2 m 1 ∑ i = 1 m a i b i m 1 ∑ i = 1 m a i b i m 1 ∑ i = 1 m b i 2 )
假设
P
X
=
Y
PX=Y
P X = Y ,
P
P
P 是正交基,
Y
Y
Y 是变换后的数据表示。设
Y
Y
Y 的协方差矩阵为
R
Y
R_Y
R Y ,有关系:
R
Y
=
1
m
Y
Y
T
=
1
m
(
P
X
)
(
P
X
)
T
=
P
(
1
m
X
X
T
)
P
T
=
P
R
X
P
T
\begin{array}{l l l} R_Y & = & \frac{1}{m}YY^\mathrm{T} \\ & = & \frac{1}{m}(PX)(PX)^\mathrm{T} \\ & = & P(\frac{1}{m}XX^\mathrm{T})P^\mathrm{T} \\ & = & PR_XP^\mathrm{T} \end{array}
R Y = = = = m 1 Y Y T m 1 ( P X ) ( P X ) T P ( m 1 X X T ) P T P R X P T 因此,我们希望最大化投影方差,选择单位向量
u
u
u 使得下式最大化:
max
u
1
m
∑
i
=
1
m
(
x
(
i
)
T
u
)
2
=
1
m
∑
i
=
1
m
u
T
x
(
i
)
x
(
i
)
T
u
=
u
T
(
1
m
∑
i
=
1
m
x
(
i
)
x
(
i
)
T
)
u
\begin{aligned} \max_u\frac{1}{m}\sum_{i=1}^m ({x^{(i)}}^\mathrm T u)^2 &= \frac{1}{m}\sum_{i=1}^m u^\mathrm T x^{(i)} {x^{(i)}}^\mathrm T u \\ & =u^\mathrm T \left(\frac{1}{m} \sum_{i=1}^m x^{(i)} {x^{(i)}}^\mathrm T \right)u \end{aligned}
u max m 1 i = 1 ∑ m ( x ( i ) T u ) 2 = m 1 i = 1 ∑ m u T x ( i ) x ( i ) T u = u T ( m 1 i = 1 ∑ m x ( i ) x ( i ) T ) u 使用拉格朗日方程求解该最大化问题,则:
ℓ
=
u
T
(
1
m
∑
i
=
1
m
x
(
i
)
x
(
i
)
T
)
u
−
λ
(
∣
∣
u
∣
∣
2
−
1
)
=
u
T
R
X
u
−
λ
(
u
T
u
−
1
)
\begin{aligned} \ell &=u^\mathrm T \left(\frac{1}{m} \sum_{i=1}^m x^{(i)} {x^{(i)}}^\mathrm T \right)u-\lambda(||u||_2-1) \\ &=u^\mathrm T R_X u - \lambda(u^\mathrm Tu-1) \end{aligned}
ℓ = u T ( m 1 i = 1 ∑ m x ( i ) x ( i ) T ) u − λ ( ∣ ∣ u ∣ ∣ 2 − 1 ) = u T R X u − λ ( u T u − 1 ) 求导,求解:
∇
u
ℓ
=
∇
u
(
u
T
R
X
u
−
λ
(
u
T
u
−
1
)
)
=
∇
u
u
T
R
X
u
−
λ
∇
u
u
T
u
=
∇
u
t
r
(
u
T
R
X
u
)
−
λ
∇
u
t
r
(
u
T
u
)
=
(
∇
u
T
t
r
(
u
T
R
X
u
)
)
T
−
λ
(
∇
u
T
t
r
(
u
T
u
)
)
T
=
(
R
X
u
)
T
T
−
λ
u
T
T
=
R
X
u
−
λ
u
\begin{aligned} \nabla_u \ell &=\nabla_u(u^\mathrm T R_X u -\lambda(u^\mathrm Tu-1)) \\ &=\nabla_u u^\mathrm T R_X u-\lambda \nabla_u u^\mathrm T u \\ &=\nabla_u tr(u^\mathrm T R_X u)-\lambda \nabla_u tr(u^\mathrm T u) \\ &=(\nabla_{u^\mathrm T}tr(u^T R_X u))^\mathrm T-\lambda(\nabla_{u^T}tr(u^\mathrm T u))^\mathrm T \\ &={(R_X u)^T}^\mathrm T-\lambda{u^T}^\mathrm T \\ &=R_X u-\lambda u \end{aligned}
∇ u ℓ = ∇ u ( u T R X u − λ ( u T u − 1 ) ) = ∇ u u T R X u − λ ∇ u u T u = ∇ u t r ( u T R X u ) − λ ∇ u t r ( u T u ) = ( ∇ u T t r ( u T R X u ) ) T − λ ( ∇ u T t r ( u T u ) ) T = ( R X u ) T T − λ u T T = R X u − λ u
R
X
R_X
R X 的特征向量就是对应的解。
P
T
=
{
u
1
,
u
2
,
⋯
 
,
u
k
}
P^\mathrm T=\{u_1,u_2,\cdots,u_k\}
P T = { u 1 , u 2 , ⋯ , u k } 。
1.3 小结
总结一下 PCA 算法步骤:
设有 m 条 n 维数据。
1)将原始数据按列组成 n 行 m 列矩阵 X
2)将 X 的每一行进行零均值化
3)求出协方差矩阵 R_X
4)求出协方差矩阵的特征值及对应的特征向量
5)将特征向量按对应特征值大小从上到下按行排列成矩阵,取前 k 行组成矩阵 P
6)Y=PX 即为降维到 k 维后的数据
例如
X
=
(
−
1
−
1
0
2
0
−
2
0
0
1
1
)
X = \begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix}
X = ( − 1 − 2 − 1 0 0 0 2 1 0 1 ) 通过
R
X
R_X
R X 求得特征值和特征向量
λ
1
=
2
,
λ
2
=
2
/
5
P
=
(
1
/
2
1
/
2
−
1
/
2
1
/
2
)
\lambda_1=2, \quad \lambda_2=2/5 \\ \quad \\ P=\begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \\ -1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix}
λ 1 = 2 , λ 2 = 2 / 5 P = ( 1 / 2
− 1 / 2
1 / 2
1 / 2
) 只提取一维最重要的信息,则需要用
P
P
P 的第 1 行乘以数据,就得到了降维后的表示:
Y
=
(
1
/
2
1
/
2
)
(
−
1
−
1
0
2
0
−
2
0
0
1
1
)
=
(
−
3
/
2
−
1
/
2
0
3
/
2
−
1
/
2
)
\begin{aligned} Y&=\begin{pmatrix} 1/\sqrt{2} & 1/\sqrt{2} \end{pmatrix}\begin{pmatrix} -1 & -1 & 0 & 2 & 0 \\ -2 & 0 & 0 & 1 & 1 \end{pmatrix} \\ &=\begin{pmatrix} -3/\sqrt{2} & -1/\sqrt{2} & 0 & 3/\sqrt{2} & -1/\sqrt{2} \end{pmatrix} \end{aligned}
Y = ( 1 / 2
1 / 2
) ( − 1 − 2 − 1 0 0 0 2 1 0 1 ) = ( − 3 / 2
− 1 / 2
0 3 / 2
− 1 / 2
) 奇异值分解(SVD) 是 PCA 的一种实现。PCA的实现手段是通过计算协方差矩阵然后对其特征值与特征向量进行求解。协方差矩阵的维度取决于样本维度。在这样的协方差矩阵上求解特征值,耗费的计算量呈平方级增长。利用 SVD 可以求解出PCA 的解,但是无需耗费大计算量,只需要耗费(样本量×样本维度)的计算量。