PCA和Whitening

随便写点什么,最近做实验效果老不好,都要疯了。

前几天,刚刚明白了,为什么要定义内积运算,这是因为矩阵乘法的基本运算单元就是所谓的内积。

内积运算是将两个向量映射成为一个数值,使用空间几何的相关知识方便的进行解释。

$A * B$ = $|A| * |B| * cos(alpha)$

这个公式我想了好久,终于使用一种笨办法给解决了。

首先将A和B归一化成长度为1的向量,然后就可以使用三角单位圆来进行表示了,然后在用内积进行运算,最后在还原到原来的尺度。完美!

内积的意义在几何空间下表示为,如果定义B的标量长度为1,那么就是向量A在向量B上面的投影的长度。

由此,在进行几何空间坐标变换的时候,如果定义基的长度为1,那么向量在这个新基上的表示就是一个简单的内积操作。

因此,在知道基的情况下,可以很方便的进行不同基下的坐标转换。

假设现在的数据空间维度为10维,有8个向量,这8个向量是基于标准正交基来进行表示的,现在构造一组新的基(PCA中使用的就是求出特征向量的方法),要将这8个向量在这个新空间中重新进行表示,应该怎么做呢?

矩阵A,表示构建的新基,每一行表示一个基,最多有10行(当然也可以少于10行,如果少于10行,那么就是降维了)。

矩阵B,表示要重新构建的向量,每一列表示一个向量,在本例中有8个。

经过A*B的矩阵乘法运算之后,得到的就是8个向量在新基下的坐标表示了。

其实,这里中的最小的运算单元就是上面提到的内积操作,而,新基向量的长度(高维称为范数)为1,从而使得,进行内积的运算结果直接就是向量在新基下的坐标

至于PCA的实现,一般都是对矩阵做一个SVD分解就可以。

PCA的限制,这点其实蛮重要的。PCA本身就是就数据变换了基,使得数据在这个新基下的表示各个轴上面没有相关性,这相当于是假设了数据本身的特征是正交的,这是一个很强的限制条件,对于哪些特征不是正交的,PCA的效果会受到损失。同时对于哪些特征之间是高阶相关而不是简单的线性相关的数据,使用PCA也会有点影响,不过这个时候可以使用kernel技术,不过我还不太了解kernel,所以就不多说了。

上面说了这么多,但是在实际应用的时候,由于PCA是没有参数的,因此,在工程项目中可以很方便的使用。

书上都说,白化的目的是为了降低数据的冗余,使得特征之间的相关性较低,同时保证所有特征的方差相同。其实我也不太理解这样做到底是为什么,一般都是加上去效果好就用,不好就不用呗,看的哪些文章中也没有很好的解释。

常用来进行白化的操作有两种方式,一种是PCA whiten,另外一种是ZCA whiten。

数据标准化在进行操作过程中有时候有重要的影响,其实,解释性还是看效果的,这些操作仅仅像积木一样在数据分析中进行搭建,一般情况下都是将数据的分布变成均值为0,方差为1的形式,这样也方便对数据进行处理,在深度学习中的BN操作其实也是对数据进行了一种类似的操作,不管怎么说,就工程技术而言,效果好才是王道,要给搞理论的留口饭吃,要不然,你都解释清楚了,人家干嘛去啊。

重点来了,如果将PCA和标准化结合起来,这种处理技术就叫做PCA whiten。

使用PCA来进行维度降低,就是降低数据的冗余,至于所有特征的方差相同是通过数据的标准化形式实现的。

为什么对特征进行标准化归一?

主要是因为,不同特征的度量是不同的,比如说身高,体重,具有的现实意义特征表示的含义单位不一致的,扩展到一些说不清道不明的抽象数据上面(唉,这里说的就是CNN的中间特征啦),那就更难进行说明了,因此,在这里进行数据标准化,最本质的目的是为了讲特征数据归一到同一个度量,这样,就可以方便的进行数据后续处理操作。

至于ZCA whiten,没有PCA whiten那么强硬的要求方差为1,只要求各个特征维度上的方差相同即可。

原文地址:https://www.cnblogs.com/andyniu/p/7792081.html