PCA背后的公式推导

PCA背后的公式推导

一、PCA

   在之前讲述过如何使用PCA以及背后的基本的几何原理。但是并没有给出详细的数学推导,因此,在这里补上PCA的详细数学推导过程。

二、预备知识
1. 矩阵的特征值分解

   这一部分是线性代数的基本内容。

2. Frobenius 范数

   在线性代数中会有很有的范数来进行约束,Frobenius范数就是其中之一,它的定义十分简单,就是对矩阵中的每个元素进行平方,再进行求和,最后对计算得到的和进行开方。Frobenius范数通常记作\(||A||_F\),用公式表达如下:
\[ Frobenius(A) = ||A||_F = \sqrt{\sum_i\sum_j A_{i, j}^2} \tag{1} \]   其中,\(A\)表示一个矩阵,\(A_{i, j}\)表示的是矩阵中第\(i\)行第\(j\)列的元素。

  如果将矩阵是做一个多维空间中的一个点的话,那么Frobenius范数就代表这个点和原点之间的距离。

3. 矩阵的迹(Trace)

  在线性代数中,还有一个十分朴素但却十分重要的概念就是矩阵的迹(Trace),它表示的是矩阵的对角线上的元素的和, 记作\(Tr(A)\),用公式表达如下:
\[ Tr(A) = \sum_i A_{i, i} \tag{2} \]

   矩阵的迹(trace)有时候可以简化矩阵的计算,在线性代数中有很重要的用处。

4.矩阵的迹(trace)和Frobenius范数的关系

   在《深度学习》(中文版)(即有人称之为“花书”)中,第29页给出了一个公式:
\[ ||A||_F = \sqrt{Tr(AA^T)} \tag{3} \]    在这里,我们简单证明一下。

   假设我们的矩阵\(A\)可以表示为列向量的集合,即:
\[ A = \begin{bmatrix} \vec{a_1}& \vec{a_2}& \cdots& \vec{a_n} \end{bmatrix} \]    其中,每一项都是一个长度\(m\)的列向量,即\(\vec{a_i} \in \Bbb{R^m}\)。所以\(A \in \Bbb{R^{m \times n}}\)

   有上面的表示法,我们可以得到\(A^T\)\(A^T \in \Bbb{R^{n \times m}}\)
\[ A^T = \begin{bmatrix} \vec{a_1}^T \\ \vec{a_2}^T \\ \vdots \\ \vec{a_n}^T \end{bmatrix} \]    于是我们可以得到:
\[ \begin{aligned} A^T \cdot A=&\begin{bmatrix} \vec{a_1}^T \\ \vec{a_2}^T \\ \vdots \\ \vec{a_n}^T \end{bmatrix} \cdot \begin{bmatrix} \vec{a_1}& \vec{a_2}& \cdots& \vec{a_n} \end{bmatrix} \\ =& \begin{bmatrix} \vec{a_1}^T \cdot \vec{a_1}& \vec{a_1}^T \cdot \vec{a_2}& \cdots& \vec{a_1}^T \cdot \vec{a_n} \\ \vec{a_2}^T \cdot \vec{a_1}& \vec{a_2}^T \cdot \vec{a_2}& \cdots& \vec{a_2}^T \cdot \vec{a_n} \\ \vdots& \vdots& \ddots& \vdots\\ \vec{a_n}^T \cdot \vec{a_1}& \vec{a_n}^T \cdot \vec{a_2}& \cdots& \vec{a_n}^T \cdot \vec{a_n} \end{bmatrix} \end{aligned} \tag{4} \]    所以:
\[ Tr(A^TA) = \sum_{i=1}^n \vec{a_i}^T \cdot \vec{a_i} \tag{5} \]    我们考察其中的某一个\(\vec{a_i}^T \cdot \vec{a_i}\)。由于\(\vec{a_i}\)表示的是长度为\(m\)的列向量,表示的是矩阵\(A\)的第\(i\)列,因此,我们有:
\[ \begin{aligned} \vec{a_i}^T \cdot \vec{a_i} &=\begin{bmatrix} A_{1, i} \\ A_{2, i} \\ \vdots \\ A_{m, i} \end{bmatrix} \cdot \begin{bmatrix} A_{1, i} & A_{2, i}& \cdots & A_{m, i} \end{bmatrix} \\ &= \sum_{k = 1}^m A_{k, i} ^2 \end{aligned} \tag{6} \]

   将\(\vec{a_i}^T \cdot \vec{a_i} =\sum_{k = 1}^m A_{k, i} ^2\)代入式子(5),有:
\[ \begin{aligned} Tr(A^TA) &= \sum_{i=1}^n \vec{a_i}^T \cdot \vec{a_i} \\ &= \sum_{i= 1}^n \sum_{k = 1}^m A_{k, i}^2 \\ &= \sum_{i= 1}^n \sum_{j = 1}^m A_{j, i}^2 \\ &= \sum_{j = 1}^m \sum_{i= 1}^n A_{j, i}^2 \\ &= ||A||_F^2 \end{aligned} \tag{7} \]   考虑到对于一个矩阵,有:\(Tr(A^T A) = Tr(A A^T)\),故:
\[ ||A||_F = \sqrt{Tr(A^T A)} = \sqrt{Tr(A A^T)} \tag{8} \]   命题得证。

三、详细推导过程
1. 编码和解码

  在之前也讲述过PCA的求解过程,甚至也进行了代码的编写,但是并没有给出严格的数学证明,只是从感性上进行理解,即挑选若干个坐标的基,使得每个基上的样本的方差尽可能大,从而达到数据降维的目的。假设我们的每一个样本点都是一个列向量,长度为\(n\),不妨记作\(x_i\)\(x_i \in \Bbb{R^n}\)。一共收集到了\(m\)个样本数据,则这些矩阵可以组成我们的样本矩阵\(A\),如下:
\[ A = \begin{bmatrix}x_0 & x_1 & \cdots & x_m \end{bmatrix}, A \in \Bbb{R^{n \times m }} \]   按照之前的说明,我们求解\(\Sigma= AA^T\)\(\Sigma\)表示的是样本矩阵的协方差矩阵,接着我们对该协方差矩阵进行特征分解,会产生\(n\)个特征值,我们选择较大的若干个特征值,并选择对应的特征向量,组成一个对应的变换矩阵\(S\),然后对数据矩阵应用这个变换矩阵,有\(R = A S^T\),则这个\(R\)矩阵就是我们最后求得的结果,这个结果会存在一定的精度损失,不过一般可以忽略不记。

  如果我们此时在矩阵的右侧重新乘以变换矩阵\(S\),则结果会还原成我们的原始的数据矩阵,即: \[ RS = AS^T S = A \]   从上面的过程中可以看出,我们完全可以将PCA看作一个线性的编码和解码的过程,因此,我们所需要的就是求解编码和解码的矩阵信息。

2.编码矩阵和解码矩阵的关系

  现在开始,让我们从头开始推导PCA的相关公式。根据我们的经验,线性变换是所有变换中最简单的,因此我们就从最简单的线性变换开始。

  假设我们的数据矩阵依旧表示成上面的形式,如果我们收集数据维度太多,不便于进一步分析,我们希望可以对数据进行一定的线性压缩,这种压缩是可逆的,存在一个解码矩阵可以将数据还原成原始的数据。

  我们考虑其中的一个数据向量\(x_i\)\(x_i \in \Bbb{R^m}\)。编码压缩之后的数据向量为\(c_i\)\(c_i \in \Bbb{R^l}\),其中\(l < m\)。我们可以将这个编码过程表示成一个函数,即\(f(x_i) = c_i\)。同时也可以将解码函数表示成一个函数,即\(g(c_i)=x_i\),我们定义解码矩阵为\(D\)\(D \in \Bbb{R^{l \times m}}\)即有$g(c_i) = D ; c_i $那么下一步我们就是需要找解码矩阵和加码矩阵的关系。


Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×