1、相关理论 白化这个词,可能在深度学习领域比较常遇到,挺起来就是高大上的名词,然而其实白化是一个比PCA稍微高级一点的算法而已,因此若是熟悉PCA,那么其实会发现这是一个很是简单的算法。 白化的目的是去除输入数据的冗余信息。假设训练数据是图像,因为图像中相邻像素之间具备很强的相关性,因此用于训练时输入是冗余的;白化的目的就是下降输入的冗余性。 php
输入数据集X,通过白化处理后,新的数据X’知足两个性质: (1)特征之间相关性较低; (2)全部特征具备相同的方差。 其实咱们以前学的PCA算法中,可能PCA给咱们的印象是通常用于降维操做。然而其实PCA若是不降维,而是仅仅使用PCA求出特征向量,而后把数据X映 射到新的特征空间,这样的一个映射过程,其实就是知足了咱们白化的第一个性质:除去特征之间的相关性。所以白化算法的实现过程,第一步操做就是PCA,求出新特征空间中X的新坐标,而后再对新的坐标进行方差归一化操做。 2、算法概述 白化分为PCA白化、ZCA白化,下面主要讲解算法实现。这部分主要是学了UFLDL的深度学习《白化》教程: http://ufldl.stanford.edu/wiki/index.php/%E7%99%BD%E5%8C%96。算法
本身的一点归纳总结,算法实现步骤以下: 一、首先是PCA预处理 上面图片,左图表示原始数据X,而后咱们经过协方差矩阵能够求得特征向量u一、u2,而后把每一个数据点,投影到这两个新的特征向量,获得进行坐标以下: 这就是所谓的pca处理。 二、PCA白化 所谓的pca白化是指对上面的pca的新坐标X’,每一维的特征作一个标准差归一化处理。由于从上面咱们看到在新的坐标空间中,(x1,x2)两个坐标轴方向的数据明显标准差不一样,所以咱们接着要对新的每一维坐标作一个标注差归一化处理: 固然你也能够采用下面的公式: X’为通过PCA处理的新PCA坐标空间,而后λi就是第i维特征对应的特征值(前面pca获得的特征值),ε是为了不除数为0。 三、ZCA白化 ZCA白虎是在PCA白化的基础上,又进行处理的一个操做。具体的实现是把上面PCA白化的结果,又变换到原来坐标系下的坐标: 给人的感受就像是在PCA空间作了处理完后,而后又把它变换到原始的数据空间。 具体源码实现以下:学习
def zca_whitening(inputs): sigma = np.dot(inputs, inputs.T)/inputs.shape[1] #inputs是通过归一化处理的,因此这边就至关于计算协方差矩阵 教程
U,S,V = np.linalg.svd(sigma) #奇异分解 epsilon = 0.1 #白化的时候,防止除数为0 ZCAMatrix = np.dot(np.dot(U, np.diag(1.0/np.sqrt(np.diag(S) + epsilon))), U.T) #计算zca白化矩阵 图片
return np.dot(ZCAMatrix, inputs) #白化变换input
参考文献:一、http://ufldl.stanford.edu/wiki/index.php/%E7%99%BD%E5%8C%96源码