彻底学会PCA1-理解PCA原理


【系列文章】:
彻底学会PCA1-理解PCA原理
彻底学会PCA2-最大可分性的推导
彻底学会PCA3-最近重构性的推导

前言

最近在学习机器学习相关的一些线性代数知识,这其中就涉及到了PCA的原理。在这里将自己的学习过程整理成一个系列,希望可以帮助到大家。如果您有任何问题可以给我发邮件,我会在第一时间反馈给您。读懂这篇文章需要一定的线性代数知识,比如向量、矩阵、【特征向量】以及【特征值】的相关知识。如果您现在并未掌握上述基础知识还请先学习一下,互联网上有丰富的学习资源。
PCA(Principal Component Analysis)是一种常用的数据分析方法。PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降维。

数据的向量化表示及其降维问题

一般情况下,在数据挖掘和机器学习中,数据被表示为向量。例如某个淘宝店2012年全年的流量及交易情况可以看成一组记录的集合,其中每一天的数据是一条记录,格式如下: (日期, 浏览量, 访客数, 下单数, 成交数, 成交金额) 其中“日期”是一个记录标志而非度量值,而数据挖掘关心的大多是度量值,因此如果我们忽略日期这个字段后,我们得到一组记录,每条记录可以被表示为一个五维向量,其中一条看起来大约是这个样子: \[(500,240,25,13,2312.5)^T\] 我们当然可以对这一组五维向量进行分析和挖掘,不过我们知道,很多机器学习算法的复杂度和数据的维数有着密切关系,甚至与维数呈指数级关联。当然,这里区区五维的数据,也许还无所谓,但是实际机器学习中处理成千上万甚至几十万维的情况也并不罕见,在这种情况下,机器学习的资源消耗是不可接受的,因此我们必须对数据进行降维。

上面淘宝店铺的数据,从经验我们可以知道,“浏览量”和“访客数”往往具有较强的相关关系,而“下单数”和“成交数”也具有较强的相关关系。这里我们非正式的使用“相关关系”这个词,可以直观理解为“当某一天这个店铺的浏览量较高(或较低)时,我们应该很大程度上认为这天的访客数也较高(或较低)”。如果我们删除浏览量或访客数其中一个指标,我们应该期待并不会丢失太多信息。因此我们可以删除一个,以降低机器学习算法的复杂度。

降维当然意味着信息的丢失,不过鉴于实际数据本身常常存在的相关性,我们可以想办法在降维的同时将信息的损失尽量降低。

要理解PCA,我们需要首先介绍一下特征值与奇异值的相关知识。

特征值

如果说一个向量v是方阵A的特征向量,将一定可以表示成下面的形式: \[Av=\lambda v\] 这时候λ就被称为特征向量v对应的特征值,一个矩阵的一组特征向量是一组正交向量。特征值分解是将一个矩阵分解成下面的形式: \[A = Q \Sigma Q^{-1}\] 其中Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角阵,每一个对角线上的元素就是一个特征值。。首先,要明确的是,一个矩阵其实就是一个线性变换,因为一个矩阵乘以一个向量后得到的向量,其实就相当于将这个向量进行了线性变换。比如说下面的一个矩阵: \[M=\begin{bmatrix} 3&0\\0&1 \end{bmatrix}\] 它其实对应的线性变换是下面的形式:
因为这个矩阵M乘以一个向量(x,y)的结果是: \[\begin{bmatrix} 3&0\\0&1 \end{bmatrix} \begin{bmatrix} x\\y \end{bmatrix} = \begin{bmatrix} 3x\\y \end{bmatrix}\] 上面的矩阵是对称的,所以这个变换是一个对x,y轴的方向一个拉伸变换(每一个对角线上的元素将会对一个维度进行拉伸变换,当值>1时,是拉长,当值<1时时缩短),当矩阵不是对称的时候,假如说矩阵是下面的样子: \[M=\begin{bmatrix} 2&1\\0&2 \end{bmatrix}\] 它所描述的变换是下面的样子:
这其实是在平面上对一个轴进行的拉伸变换(如黑色的箭头所示),在图中,黑色的箭头是一个最主要的变化方向(变化方向可能有不止一个),如果我们想要描述好一个变换,那我们就描述好这个变换主要的变化方向就好了。反过头来看看之前特征值分解的式子,分解得到的Σ矩阵是一个对角阵,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)

当矩阵是高维的情况下,那么这个矩阵就是高维空间下的一个线性变换,这个线性变化可能没法通过图片来表示,但是可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。也就是之前说的:提取这个矩阵最重要的特征。总结一下,特征值分解可以得到特征值与特征向量,特征值表示的是这个特征到底有多重要,而特征向量表示这个特征是什么,可以将每一个特征向量理解为一个线性的子空间,我们可以利用这些线性的子空间干很多的事情。不过,特征值分解也有很多的局限,比如说变换的矩阵必须是方阵。

奇异值

可以看到特征值分解的局限性就在于只能对于方阵而言。然后在显示的数据统计中我们得到的大部分情况都不是方阵的形式,那么我们应该如何对矩阵进行分解呢?这个时候就可以使用奇异值分解了。假设我们有一组数据,有M个特征,有N条数据,那么我们的输入矩阵就是一个M * N的规格。奇异值分解的公式如下: \[ A_{m \times n} = U _{m \times m} \Sigma _{m \times n} V _{n \times n} ^T \] 假设A是一个M * N的矩阵,那么得到的U是一个M * M的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个M * N的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),\(V^T\)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量。
那么奇异值和特征值是怎么对应起来的呢?首先,我们将一个矩阵A的转置 * A,将会得到一个方阵,我们用这个方阵求特征值可以得到: \[(A^TA)v = \lambda v\] 这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到: \[\sigma = \sqrt{\lambda}\] \[\mu= \frac{1}{\sigma}Av\] 这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解: \[A _{m\times n} \approx U _{m \times r} \Sigma _{r\times r} V _{r\times n} ^T\] r是一个远小于m、n的数。这样一来我们就将m维度压缩到了r维度。节省了大量的运算资源。

奇异值与主成分分析

PCA的问题其实是一个基的变换,使得变换后的数据有着最大的方差。方差的大小描述的是一个变量的信息量,我们在讲一个东西的稳定性的时候,往往说要减小方差,如果一个模型的方差很大,那就说明模型不稳定了。但是对于我们用于机器学习的数据(主要是训练数据),方差大才有意义,不然输入的数据都是同一个点,那方差就为0了,这样输入的多个数据就等同于一个数据了。以下面这张图为例子:

这个假设是一个摄像机采集一个物体运动得到的图片,上面的点表示物体运动的位置,假如我们想要用一条直线去拟合这些点,那我们会选择什么方向的线呢?当然是图上标有signal的那条线。如果我们把这些点单纯的投影到x轴或者y轴上,最后在x轴与y轴上得到的方差是相似的(因为这些点的趋势是在45度左右的方向,所以投影到x轴或者y轴上都是类似的),如果我们使用原来的xy坐标系去看这些点,容易看不出来这些点真正的方向是什么。但是如果我们进行坐标系的变化,横轴变成了signal的方向,纵轴变成了noise的方向,则就很容易发现什么方向的方差大,什么方向的方差小了。

一般来说,方差大的方向是信号的方向,方差小的方向是噪声的方向,我们在数据挖掘中或者数字信号处理中,往往要提高信号与噪声的比例,也就是信噪比。对上图来说,如果我们只保留signal方向的数据,也可以对原数据进行不错的近似了。

PCA的全部工作简单点说,就是对原始的空间中顺序地找一组相互正交的坐标轴,第一个轴是使得方差最大的,第二个轴是在与第一个轴正交的平面中使得方差最大的,第三个轴是在与第1、2个轴正交的平面中方差最大的,这样假设在N维空间中,我们可以找到N个这样的坐标轴,我们取前r个去近似这个空间,这样就从一个N维的空间压缩到r维的空间了,但是我们选择的r个坐标轴能够使得空间的压缩使得数据的损失最小。

还是假设我们矩阵每一行表示一个样本,每一列表示一个feature,用矩阵的语言来表示,将一个m * n的矩阵A的进行坐标轴的变化,P就是一个变换的矩阵从一个N维的空间变换到另一个N维的空间,在空间中就会进行一些类似于旋转、拉伸的变化。 \[A _{m\times n} P _{n\times n} = \widetilde{A} _{m\times n}\] 而将一个m * n的矩阵A变换成一个m * r的矩阵,这样就会使得本来有n个feature的,变成了有r个feature了(r < n),这r个其实就是对n个feature的一种提炼,我们就把这个称为feature的压缩。用数学语言表示就是: \[A _{m\times n} P _{n\times r} = \widetilde{A} _{m\times r}\] 但是这个怎么和奇异值分解(SVD)扯上关系呢?之前谈到,SVD得出的奇异向量也是从奇异值由大到小排列的,按PCA的观点来看,就是方差最大的坐标轴就是第一个奇异向量,方差次大的坐标轴就是第二个奇异向量…我们回忆一下之前得到的SVD式子: \[A _{m\times n} \approx U _{m \times r} \Sigma _{r\times r} V _{r\times n} ^T\] 在矩阵的两边同时乘上一个矩阵V,由于V是一个正交的矩阵,所以V转置乘以V得到单位阵I,所以可以化成后面的式子: \[A _{m\times n} V _{r \times n} \approx U _{m \times r} \Sigma _{r\times r} V _{r\times n} ^T V _{r \times n}\] \[A _{m\times n} V _{r \times n} \approx U _{m \times r} \Sigma _{r\times r}\] 将后面的式子与A * P那个m * n的矩阵变换为m * r的矩阵的式子对照看看,在这里,其实V就是P,也就是一个变化的向量。可以看出,其实PCA几乎可以说是对SVD的一个包装,如果我们实现了SVD,那也就实现了PCA了。

理解了PCA的原理之后,我将在下一篇文章为大家讲解其中的数学推导过程。

参考文献

We Recommend a Singular Value Decomposition
机器学习中的数学(5)-强大的矩阵奇异值分解(SVD)及其应用
PCA的数学原理


分享博文


评论博文


Last one :   彻底学会PCA2-最大可分性的推导

Next article :   ML-情感分析2-使用向量空间模型与SVM进行情感分析