1. PCA导论
PCA顾名思义,就是找出数据里最主要的方面,用数据里最主要的方面来代替原始数据。具体的,假如我们的数据集是n维的,共有m个数据 D = ( x ( 1 ) , x ( 2 ) , . . . , x ( m ) ) D=(x^{(1)},x^{(2)},...,x^{(m)}) D=(x(1),x(2),...,x(m))。我们希望将这m个数据的维度从n维降到q维,希望这m个q维的数据集尽可能的代表原始数据集。我们知道数据从n维降到q维肯定会有损失,但是我们希望损失尽可能的小。那么如何让这n’维的数据尽可能表示原来的数据呢?
如下例子,将数据从二维降维到一维。数据如下图。我们希望找到某一个维度方向,它可以代表这两个维度的数据。图中列了两个向量方向,
u
1
u_1
u1和
u
2
u_2
u2,那么哪个向量可以更好的代表原始数据集呢?从直观上也可以看出,u1比u2好。
为什么 u 1 u_1 u1比 u 2 u_2 u2好呢?可以有两种解释,第一种解释是样本点到这个直线的距离足够近,第二种解释是样本点在这个直线上的投影能尽可能的分开。
假如我们把q从1维推广到任意维,则我们的希望降维的标准为:样本点到这个超平面的距离足够近,或者说样本点在这个超平面上的投影能尽可能的分开。
基于上面的两种标准,我们可以得到PCA的两种等价推导:
- 基于最小投影距离
- 基于最大投影方差
2. 基于最大投影方差
我们希望投影后投影值尽可能分散,而这种分散程度,可以用数学上的方差来表述。一个字段的方差可以看做是每个元素与字段均值的差的平方和的均值,如下:
Var ( a ) = 1 m ∑ i = 1 m ( a i − μ ) 2 \operatorname{Var}(a)=\frac{1}{m} \sum_{i=1}^{m}\left(a_{i}-\mu\right)^{2} Var(a)=m1i=1∑m(ai−μ)2
由于我们在预处理时已经将每个字段的均值都化为0了,因此方差可以直接用每个元素的平方和除以元素个数表示
Var ( a ) = 1 m ∑ i = 1 m a i 2 \operatorname{Var}(a)=\frac{1}{m} \sum_{i=1}^{m} a_{i}^{2} Var(a)=m1i=1∑mai2
对于二维降成一维的问题,找到使得方差最大的方向就可以了。不过对于更高维,首先我们找到一个方向使得投影后方差最大,继而我们选择第二个投影方向,如果我们还是单纯只选择方差最大的方向,明显,这个方向与第一个方向应该是“几乎重合在一起”,显然这样的维度是没有用的,要让两个字段尽可能表示更多的原始信息,我们是不希望它们之间存在(线性)相关性的,因为相关性意味着两个字段不是完全独立,必然存在重复表示的信息
数学上用两个字段的协方差表示其相关性,由于已经让每个字段均值为0,则协方差为
Cov ( a , b ) = 1 m ∑ i = 1 m a i b i \operatorname{Cov}(a, b)=\frac{1}{m} \sum_{i=1}^{m} a_{i} b_{i} Cov(a,b)=m1i=1∑maibi
当协方差为0时,表示两个字段完全独立。为了让协方差为0,我们选择第二个基时只能在与第一个基正交的方向上选择。因此最终选择的两个方向一定是正交的。
由此,降维问题的优化目标:将一组N维向量降为K维(K大于0,小于N),其目标是选择K个单位(模为1)正交基,使得原始数据变换到这组基上后,各字段两两间协方差为0,而字段的方差则尽可能大(在正交的约束下,取最大的K个方差)。
假设我们只有a和b两个字段,那么我们将它们按行组成矩阵X:
X = ( a 1 a 2 ⋯ a m b 1 b 2 ⋯ b m ) X=\left(\begin{array}{llll} a_{1} & a_{2} & \cdots & a_{m} \\ b_{1} & b_{2} & \cdots & b_{m} \end{array}\right) X=(a1b1a2b2⋯⋯ambm)
可以得到:
1 m X X ⊤ = ( 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} X X^{\top}=\left(\begin{array}{cc} \frac{1}{m} \sum_{i=1}^{m} a_{i}^{2} & \frac{1}{m} \sum_{i=1}^{m} a_{i} b_{i} \\ \frac{1}{m} \sum_{i=1}^{m} a_{i} b_{i} & \frac{1}{m} \sum_{i=1}^{m} b_{i}^{2} \end{array}\right) m1XX⊤=(m1∑i=1mai2m1∑i=1maibim1∑i=1maibim1∑i=1mbi2)
这个矩阵对角线上的两个元素分别是两个字段的方差,而其它元素是a和b的协方差。
将上面结论推广:
设我们有m个n维数据记录,将其按列排成n乘m的矩阵X
C = 1 m X X ⊤ C=\frac{1}{m} X X^{\top} C=m1XX⊤
则C是一个对称矩阵,其对角线分别个各个字段的方差,而第i行j列和j行i列元素相同,表示i和j两个字段的协方差。
那么要达到优化目标,等价于将协方差矩阵对角化:即除对角线外的其它元素化为0,并且在对角线上将元素按大小从上到下排列
设原始数据矩阵X对应的协方差矩阵为C,而P是一组基按行组成的矩阵,设 Y = P X Y=PX Y=PX,则Y为X对P做基变换后的数据。设Y的协方差矩阵为D,我们推导一下D与C的关系:
D = 1 m Y Y ⊤ = 1 m ( P X ) ( P X ) ⊤ = 1 m P X X ⊤ P ⊤ = P ( 1 m X X ⊤ ) P ⊤ = P C P ⊤ \begin{aligned} D &=\frac{1}{m} Y Y^{\top} \\ &=\frac{1}{m}(P X)(P X)^{\top} \\ &=\frac{1}{m} P X X^{\top} P^{\top} \\ &=P\left(\frac{1}{m} X X^{\top}\right) P^{\top} \\ &=P C P^{\top} \end{aligned} D=m1YY⊤=m1(PX)(PX)⊤=m1PXX⊤P⊤=P(m1XX⊤)P⊤=PCP⊤
可以发现P是能让原始协方差矩阵对角化的P,即优化目标变成了寻找一个矩阵P,使得 P C P ⊤ P C P^{\top} PCP⊤是一个对角矩阵,并且对角元素按从大到小依次排列,那么P的前K行就是要寻找的基,用P的前K行组成的矩阵乘以X就使得X从N维降到了K维并满足上述优化条件
那么接下来要处理的就是对 X X ⊤ X X^{\top} XX⊤进行特征值分解。
2.PCA算法流程
输入:n维样本集
D
=
(
x
(
1
)
,
x
(
2
)
,
.
.
.
,
x
(
m
)
)
D=(x^{(1)},x^{(2)},...,x^{(m)})
D=(x(1),x(2),...,x(m)),要降维到的维数q.
输出:降维后的样本集
D
′
D'
D′
(1)对所有的样本进行中心化:
x
(
i
)
=
x
(
i
)
−
1
m
∑
j
=
1
m
x
(
j
)
x^{(i)}=x^{(i)}−\frac{1}{m}\sum_{j=1}^{m}x^{(j)}
x(i)=x(i)−m1∑j=1mx(j)
(2)计算样本的协方差矩阵 X X ⊤ XX^{\top} XX⊤; X ∈ n × m X\in n\times m X∈n×m
(3)对矩阵 X X ⊤ XX^{\top} XX⊤进行特征值分解
(4)取出最大的 q q q个特征值对应的特征向量 ( w 1 , w 2 , . . . , w q ) (w_1,w_2,...,w_q) (w1,w2,...,wq), w j ∈ 1 × n w_j \in 1 \times n wj∈1×n,将所有的特征向量标准化后,组成特征向量矩阵 W W W, W ∈ n × q W \in n \times q W∈n×q
(5)对样本集中的每一个样本 x ( i ) ∈ n × 1 x^{(i)} \in n \times 1 x(i)∈n×1,转化为新的样本 z ( i ) = W T x ( i ) z^{(i)}=W^{T}x^{(i)} z(i)=WTx(i), z ( i ) ∈ q × 1 z^{(i)} \in q \times 1 z(i)∈q×1
(6)得到输出样本集 D ′ = ( z ( 1 ) , z ( 2 ) , . . . , z ( m ) ) D^′=(z^{(1)},z^{(2)},...,z^{(m)}) D′=(z(1),z(2),...,z(m))
有时候,我们不指定降维后的
q
q
q的值,而是换种方式,指定一个降维到的主成分比重阈值t。这个阈值t在(0,1]之间。假如我们的n个特征值为
λ
1
≥
λ
2
≥
.
.
.
≥
λ
n
λ_1≥λ_2≥...≥λ_n
λ1≥λ2≥...≥λn,则q可以通过下式得到:
∑
i
=
1
q
λ
i
∑
i
=
1
n
λ
i
≥
t
\frac{\sum_{i=1}^{q} \lambda_{i}}{\sum_{i=1}^{n} \lambda_{i}} \geq t
∑i=1nλi∑i=1qλi≥t
3. 总结
PCA是一种非监督学习的降维方法,它只需要特征值分解,就可以对数据进行压缩,去噪;PCA算法的主要优点有:
1)仅仅需要以方差衡量信息量,不受数据集以外的因素影响。
2)各主成分之间正交,可消除原始数据成分间的相互影响的因素。
3)计算方法简单,主要运算是特征值分解,易于实现。
PCA算法的主要缺点有:
1)主成分各个特征维度的含义具有一定的模糊性,不如原始样本特征的解释性强。
2)方差小的非主成分也可能含有对样本差异的重要信息,因降维丢弃可能对后续数据处理有影响。
reference
[1]. 主成分分析原理总结. 刘建平Pinard
[2].主成分分析(PCA)原理详解.知乎
[3]. 机器学习中SVD总结.微信公众号Microstrong
[4]. 一文读懂PCA算法的数学原理