pca和svd都是降维常用的方法。今天回顾一下pca的原理。
motivation
现在有m个数据,每个样本有n个属性值,样本用矩阵表示为
X
∈
R
n
×
m
X \in R^{n\times m}
X∈Rn×m。每一列是一个样本。
方便接下来的讲述,我们把
X
X
X默认是做过零均值化的。那么X的属性的协方差矩阵C等于:
C
=
1
m
X
X
T
∈
R
n
×
n
C=\frac{1}{m}XX^T \in R^{n\times n}
C=m1XXT∈Rn×n
我们想用一组新的坐标表示X,同时新的坐标数目更少(属性更少)。且在这些坐标下,X投影到这些坐标的值的方差比较大(最大的叫主元,一般取方差前k大的轴)。
以上的出发点是遵循最大可分性原则。
假设
P
∈
R
n
×
n
P \in R^{n\times n}
P∈Rn×n是投影矩阵,线性变换之后的样本是
Y
=
P
X
Y=PX
Y=PX 当然此时
Y
Y
Y还是n维属性的。我们先不考虑降低维度的事情,先想如何能把Y的属性的方差最大化。
Method
想最大化Y的属性的方差,其实等价于最小化Y的各个属性之间的协方差。因为各个属性之间没有相关,才能让属性差异性最大,说明属性分布的更加离散。
因为正交变换不改变向量之间的相对位置,所以当样本的某种属性值降低,其他属性必然上升,要保持和原点的相对位置不变。
上图a和b的横纵坐标值在发生变化,当x轴坐标值小了,必然y轴坐标值大了。
为了让变换之后的样本的协方差最大,先求出
Y
Y
Y的协方差
D
D
D。
D
=
1
m
Y
Y
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}PXX^TP^T\\ =P\frac{1}{m}XX^TP^T\\ =PCP^T
D=m1YYT=m1PXXTPT=Pm1XXTPT=PCPT
理想中的D应该是对角阵,其他位置都是协方差,主对角线是属性的方差。那么问题就来到了如何找到一个P能让D是对角矩阵。
注意C是n维方阵,且实对称。实对称矩阵一定可以正交对角化。所以P就是能让C对角化的正交矩阵,那么D就是C的特征值了
D
=
d
i
a
g
{
λ
1
,
λ
2
,
.
.
.
λ
n
}
,
λ
1
>
=
λ
2
>
=
.
.
.
D =diag \left \{\lambda_1, \lambda_2,... \lambda_n \right \},\lambda_1>= \lambda_2 >=...
D=diag{λ1,λ2,...λn},λ1>=λ2>=...
P就是特征值按照位置对应的特征向量。
接着我们把D拆解:
D
=
P
C
P
T
≈
λ
1
p
1
p
1
T
+
λ
2
p
2
p
2
T
+
.
.
.
λ
k
p
k
p
k
T
D=PCP^T\\ \approx \lambda_1p_1p_1^T + \lambda_2p_2p_2^T + ... \lambda_k p_kp_k^T
D=PCPT≈λ1p1p1T+λ2p2p2T+...λkpkpkT
我们取前k大的特征值和对应的特征向量,能得到D的近似,那我们干脆就用这些特征向量,构成P,所以P的维度是
k
×
n
k\times n
k×n ,然后就得到了我们需要的变换矩阵P了。
实际上,还可以通过拉格朗日乘子法进行推导,也能得到相同的P。
reference
如何通俗易懂地讲解什么是 PCA 主成分分析?
机器学习】降维——PCA(非常详细)
奇异值分解(SVD)与图像压缩(附Python代码实现)
利用SVD求得两个对应点集合的旋转矩阵R和转移矩阵t的数学推导