zoukankan      html  css  js  c++  java
  • 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,只要求各个特征维度上的方差相同即可。

  • 相关阅读:
    Android 开发 深入理解Handler、Looper、Messagequeue 转载
    Android 开发 Handler的基本使用
    Java 学习 注解
    Android 开发 AlarmManager 定时器
    Android 开发 框架系列 百度语音合成
    Android 开发 框架系列 Google的ORM框架 Room
    Android 开发 VectorDrawable 矢量图 (三)矢量图动画
    Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制
    Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图
    Android 开发 知晓各种id信息 获取线程ID、activityID、内核ID
  • 原文地址:https://www.cnblogs.com/andyniu/p/7792081.html
Copyright © 2011-2022 走看看