一.基础知识
这一小节因为无关紧要,放在最后
这一小节会解释本文提到的一些名词,看后文遇到不懂的名词,再在这一小节中查找。
二.主成分分析法介绍
1. 核心思想
主成分分析法的核心思想就是:
Y
=
X
A
Y=XA
Y=XA
其中:
X
X
X:
(
m
,
n
)
(m,n)
(m,n)矩阵,原始数据集,一行代表一个样本,有
m
m
m个样本,每一列是一种特征,有
n
n
n种特征。
A
A
A:
(
n
,
?
)
(n,?)
(n,?)矩阵,表示线性变换的矩阵
Y
Y
Y:
(
m
,
?
)
(m,?)
(m,?)矩阵,经过PCA变换后的矩阵
上式可以解释为:
利用线性变换,将原始数据变换为一组各维度线性无关的表示。
2. 理论做法
这一部分灵感来源:https://blog.csdn.net/hustqb/article/details/78394058
我们要对
X
X
X进行线性变换,使得
Y
Y
Y在各维度上都线性无关。我们想到了计算
Y
Y
Y的协方差矩阵。(这里假设已经对
X
X
X进行了预处理,
X
=
X
−
X
ˉ
X=X-\bar{X}
X=X−Xˉ,
X
ˉ
\bar{X}
Xˉ是
X
X
X的均值,预处理后,
X
X
X的数学期望为0)
C
o
n
v
(
Y
)
=
1
m
Y
T
Y
=
1
m
(
X
A
)
T
(
X
A
)
=
A
T
C
A
Conv(Y)=\dfrac{1}{m}Y^TY=\dfrac{1}{m}(XA)^T(XA)=A^TCA
Conv(Y)=m1YTY=m1(XA)T(XA)=ATCA 其中:
C
C
C:是矩阵
X
X
X的协方差矩阵,由于
C
=
1
m
X
T
X
C=\dfrac{1}{m}X^TX
C=m1XTX,所以
C
C
C是对称矩阵。
协方差矩阵
C
o
n
v
(
Y
)
Conv(Y)
Conv(Y)的主对角线是方差,其余元素都是协方差,而方差表示在这个特征上,各个样本(虽然这里有个样本)间的差异性,而协方差为0,则说明这两个特征不相关。
所以,我们的目标就是使得
C
o
n
v
(
Y
)
Conv(Y)
Conv(Y)主对角线的元素值尽可能大,其余元素值为0。(由于PCA还可以降维,所以我们会按照从大到小的顺序排列主对角线元素)。
而通过推导,得到
C
o
n
v
(
Y
)
=
A
T
C
A
Conv(Y)=A^TCA
Conv(Y)=ATCA,我们只需要求得
A
A
A使得
C
C
C对角化即可。
我们知道,对称矩阵是一定可以对角化的。所以,我们可以通过求特征值和特征向量来将矩阵
C
C
C对角化:
C
=
P
Λ
P
T
P
T
C
P
=
Λ
C=P\Lambda P^T \\ P^T CP=\Lambda
C=PΛPTPTCP=Λ 其中
Λ
\Lambda
Λ:是对角阵,对角元素是
C
C
C的特征值
P
P
P:每一列是
Λ
\Lambda
Λ对应的特征值所对应的特征向量
所以,对矩阵
X
X
X进行PCA的做法是:
1. 求
C
=
1
m
X
T
X
C=\dfrac{1}{m}X^TX
C=m1XTX
2.求
C
C
C的特征向量
3.
C
C
C的特征向量构成矩阵
A
A
A的列
我们可以对特征向量的维度进行截断,以达到降维的目的。
上述步骤还有很多细节需要注意,不过我没有考虑过,欢迎补充。
3.利用SVD简化计算
然而在计算机编程中,调用计算SVD的库函数似乎比求特征向量速度快很多。所以经常使用SVD简化计算。
CS231n中的做法
原始笔记参考:http://cs231n.github.io/neural-networks-2/
需要梯子
# Assume input data matrix X of size [N x D]
X -= np.mean(X, axis = 0) # zero-center the data (important)
cov = np.dot(X.T, X) / X.shape[0] # get the data covariance matrix
U,S,V = np.linalg.svd(cov)
Xrot = np.dot(X, U) # decorrelate the data
Xrot_reduced = np.dot(X, U[:,:100]) # Xrot_reduced becomes [N x 100]
在上述代码中,SVD的作用仅仅就是求矩阵
U
U
U,令
A
=
U
A=U
A=U后,得到:
Y
=
X
U
Y
T
Y
=
(
X
U
)
T
X
U
=
U
T
X
T
X
U
=
U
T
U
Σ
V
T
U
=
Σ
Y=XU\\ Y^TY=(XU)^TXU=U^TX^TXU=U^TU\Sigma V^TU=\Sigma
Y=XUYTY=(XU)TXU=UTXTXU=UTUΣVTU=Σ
备注: 由于
X
T
X
X^TX
XTX是对称矩阵,所以
U
U
U和
V
V
V相等。
更常见的做法
参考资料:
https://stats.stackexchange.com/questions/134282/relationship-between-svd-and-pca-how-to-use-svd-to-perform-pca
这个回答非常到位,感人。强推
更常见用SVD简化PCA的计算是直接对
X
X
X进行奇异值分解:
X
=
U
Σ
V
T
X=U\Sigma V^T
X=UΣVT
那么此时,PCA就是:
Y
=
X
V
Y=XV
Y=XV
解释一下:
C
=
1
m
X
T
X
=
1
m
V
Σ
T
U
T
U
Σ
V
T
=
V
Σ
2
m
V
T
C=\dfrac{1}{m}X^TX=\dfrac{1}{m}V \Sigma^TU^TU\Sigma V^T=V\dfrac{\Sigma^2}{m}V^T
C=m1XTX=m1VΣTUTUΣVT=VmΣ2VT
备注:
U
U
U是酉矩阵,
U
T
U
=
E
U^TU=E
UTU=E
Σ
\Sigma
Σ是
X
X
X的奇异值,奇异值的平方是特征值
所以,此时:
C
o
n
v
(
Y
)
=
V
T
C
V
=
Σ
2
m
Conv(Y)=V^TCV=\dfrac{\Sigma^2}{m}
Conv(Y)=VTCV=mΣ2
是个对角阵,而且按照主元素从大到小的顺序排列(奇异值分解的要求)
我这里只是从数学上简单推了下,真正的原理,链接里给的非常详细,我偷懒了,没有翻译。
一.基础知识
1. 线性变换在原来基下的矩阵
A
A
A就是线性变换
T
T
T在基
α
1
,
α
2
,
⋯
 
,
α
n
\alpha_1,\alpha_2,\cdots,\alpha_n
α1,α2,⋯,αn下的矩阵。
其中:
T T T:是 V V V的线性变换
V V V: 是数域 P \mathbb{P} P上的 n n n维线性空间
A A A: 是矩阵,如下:
2.如何理解线性变换常常写成矩阵相乘的形式
这一部分灵感来源:https://blog.csdn.net/unclerunning/article/details/70893118
已知:
A
A
A: 线性变换的矩阵,即
求:
x \bold{x} x经过线性变换 T T T变换后的向量
其中:
x \bold{x} x: x = [ x 1 x 2 ⋯ x n ] = x 1 α 1 + x 2 α 2 + ⋯ + x n α n \bold{x}=\begin{bmatrix}x_1\\x_2\\\cdots\\x_n\end{bmatrix}=x_1\alpha_1+x_2\alpha_2+\cdots+x_n\alpha_n x=⎣⎢⎢⎡x1x2⋯xn⎦⎥⎥⎤=x1α1+x2α2+⋯+xnαn,这里默认基向量是标准基向量。 x \bold{x} x是在原来的空间中的一个向量
解:
T
(
x
)
=
T
(
α
1
,
α
2
,
⋯
 
,
α
n
)
[
x
1
x
2
⋯
x
n
]
=
[
T
α
1
T
α
2
⋯
T
α
n
]
[
x
1
x
2
⋯
x
n
]
T(\bold{x})=T(\alpha_1,\alpha_2,\cdots,\alpha_n)\begin{bmatrix}x_1\\x_2\\\cdots\\x_n\end{bmatrix}=\begin{bmatrix}T\alpha_1&T\alpha_2\cdots&T\alpha_n\end{bmatrix}\begin{bmatrix}x_1\\x_2\\\cdots\\x_n\end{bmatrix}
T(x)=T(α1,α2,⋯,αn)⎣⎢⎢⎡x1x2⋯xn⎦⎥⎥⎤=[Tα1Tα2⋯Tαn]⎣⎢⎢⎡x1x2⋯xn⎦⎥⎥⎤
通常,
[
T
α
1
T
α
2
⋯
T
α
n
]
\begin{bmatrix}T\alpha_1&T\alpha_2\cdots&T\alpha_n\end{bmatrix}
[Tα1Tα2⋯Tαn]是已知的,所以用这个矩阵右乘原向量,就可以得到线性变换后的向量。
所以:在基为标准基时,线性变换在标准基下的矩阵 乘以 需要变换的向量,就是原向量 线性变换后的结果。
这里补充这个知识的意义在于:对一个向量做线性变换,变换矩阵到底是什么样的。
当原向量是列向量,变换矩阵左乘,变换后的基向量构成变换矩阵的列。
当原向量是行向量,变换矩阵右乘,变换后的基向量构成变换矩阵的行。
3. 奇异值分解
M
=
U
Σ
V
∗
M=U\Sigma V^*
M=UΣV∗
如果存在上述这样的
M
M
M的分解,则称这样的分解为
M
M
M的奇异值分解
其中:
M M M是 m × n m\times n m×n阶矩阵
U U U是 m × m m\times m m×m阶酉矩阵
Σ \Sigma Σ是 m × n m\times n m×n阶非负 实数 对角矩阵
V ∗ V^* V∗是 V V V的共轭转置,是 n × n n \times n n×n阶 酉矩阵(complex unitary matrix)