目录
  1. 1. 白化(Whitening)
    1. 1.1. 白化的结果
    2. 1.2. 为什么使用白化?
    3. 1.3. 两种白化方式
      1. 1.3.1. PCA 白化
      2. 1.3.2. ZCA 白化
  2. 2. 图解PCA
    1. 2.1. 二维均匀分布:rand
    2. 2.2. 二维高维分布:randn
  3. 3. 数学原理
    1. 3.1. SVD图解⭐️
    2. 3.2. 数学算法
      1. 3.2.1. 算法流程:
      2. 3.2.2. 考察白化的合法化:
      3. 3.2.3. 正则化:
白化(Whitening)

白化(Whitening)

白化的结果

  1. 使数据的不同维度去相关;(对角协方差矩阵)
  2. 使数据的每个维度的方差为1;(协方差矩阵是单位矩阵II

为什么使用白化?

假设训练数据是图像,由于图像中相邻像素之间具有很强的相关性,所以用于训练时输入是冗余的。白化的目的就是降低输入的冗余性。

比如在独立成分分析(ICAICA)中,对数据做白化预处理可以去除各观测信号之间的相关性,从而简化了后续独立分量的提取过程,而且,通常情况下,数据进行白化处理与不对数据进行白化处理相比,算法的收敛性较好。

两种白化方式

PCA 白化

其实我们之前学的PCA算法中,可能PCA给我们的印象是一般用于降维操作。然而其实PCA如果不降维,而是仅仅使用PCA求出特征向量,然后把数据X映射到新的特征空间,这样的一个映射过程,其实就是满足了我们白化的第一个性质:除去特征之间的相关性

PCA白化算法的实现过程:

  1. PCA操作,求出新特征空间中X的新坐标。
  2. 在新坐标系下进行方差归一化操作

ZCA 白化

ZCA白虎是在PCA白化的基础上,又进行处理的一个操作。具体的实现是把上面PCA白化的结果,又变换到原来坐标系下的坐标:

ZCAZCAZZ代表 zero - phase 零相位,说明此数据与原数据没有发生旋转

ZCA白化算法的实现过程:

  1. PCA操作,求出新特征空间中X的新坐标。
  2. 在新坐标系下进行方差归一化操作
  3. 再投影回原坐标系

图解PCA

二维均匀分布:rand

二维高维分布:randn

注:这里的 PCAPCA 白化和 ZCAZCA 白化看上去一样其实是不一样的,PCAPCA 的数据在维度方向是无关的,相当于原数据发生了一个旋转,ZCAZCA 则与原数据没有发生旋转,从第一个图可以发现这种旋转方式。下图可以反映这种变换。

代码部分:

close all 
[s1, s2] = RandStream.create('mrg32k3a', 'NumStreams', 2);
% x1 = rand(s1,5000,1)-0.5;
% x2 = rand(s2,5000,1)-0.5;
x1 = randn(5000,1)-0.5;
x2 = randn(5000,1)-0.5;

%% x1 与 x2 独立随机
figure();
set(gcf,'color','w')
subplot(2,3,1)
scatter(x1,x2,2)
axis equal
xlabel("x1")
ylabel("x2")
title("独立无关变量")

%% 假设将x1与x2合成一个新的信号
y1 = x1 + 2*x2;
y2 = 1*x1 + 0.5*x2;
subplot(2,3,2)
scatter(y1,y2,2)
axis equal
xlabel("x1")
ylabel("x2")
title("由独立信号生成的新信号")

%% PCA
X = [y1 y2];
% 1. 取出均值
X = X - mean(X,1);
% 2. svd 处理
[U, D, V] = svd(1/4999*X'*X);

X_PCA = X*U ; % 新坐标的投影
subplot(2,3,3);
scatter(X_PCA(:,1),X_PCA(:,2),2)
axis equal
xlabel("y1")
ylabel("y2")
title("PCA下的新坐标")

% 3. 对PCA做方差归一化
X_PCA_std = X_PCA ./ sqrt(diag(D))';
subplot(2,3,4);
scatter(X_PCA_std(:,1),X_PCA_std(:,2),2)
axis equal
xlabel("y1")
ylabel("y2")
title("PCA方差归一化")

cov(X_PCA_std(:,1))
cov(X_PCA_std(:,2))

%% ZCA白化
subplot(2,3,5);
X_ZCA = U*X_PCA_std'; % 投影:直接矩阵乘即可
scatter(X_ZCA(1,:),X_ZCA(2,:),2)
axis equal
xlabel("x1")
ylabel("x2")
title("ZCA白化")

数学原理

SVD图解⭐️

图解奇异值分解:https://my.oschina.net/findbill/blog/535044

数学算法

摘自:https://www.cnblogs.com/demian/p/7627324.html

算法流程:

给定训练数据集(假设每个特征都具有零均值):XRn×mX \in \R^{n\times m},nn 是数据维度;mm 是样本个数。

  1. 计算数据的协方差矩阵为:

    注:svd中输入的必须是协方差,即必须要有分母,这样算出来的奇异值矩阵S,才可以用作PCA的方差归一化处理

Σ=1m1XXT\Sigma = \frac{1}{m-1}XX^T

  1. 对协方差矩阵做奇异值分解:

[U,S,V]=svd(Σ)[U,S,V] = svd(\Sigma)

  1. PCA + 特征方差归一化处理:

    XPCAWhite=S12UTX=[1λ10000001λn]XrotateX_{\text {PCAWhite}}=S^{-\frac{1}{2}} U^{T} X=\left[\begin{array}{ccc} {\frac{1}{\sqrt{\lambda_{1}}}} & {0} & {0} \\ {0} & {\ddots} & {0} \\ {0} & {0} & {\frac{1}{\sqrt{\lambda_{n}}}} \end{array}\right] X_{\text {rotate}}

    其中,XrotateXrotate 就是原数据在主成分轴上的投影,而 S12S^{-\frac{1}{2}} 相当于对每一个主轴上的数据做一个缩放,缩放因子就是除以对应特征值的平方根。以下两个公式等价:

    方差归一化:

    XPCAwhite=Xrotatestd(Xrotate)X_{PCAwhite} = \frac{X_{rotate}}{std(X_{rotate})}

    利用奇异值放缩达到归一化的目的:

    XPCAwhite=Xrotateλi+εX_{PCAwhite} = \frac{X_{rotate}}{\sqrt{\lambda_i+\varepsilon }}

  2. ZCA 白化:PCA 白化后的数据重新变换回原来的空间

    XZCAwhite=UXPCAwhiteX_{ZCAwhite} = U X_{PCAwhite}

考察白化的合法化:

PCA白化的结果就是:对角协方差为II

PCAWhite=1mXPCAwhiteXPCAwhile=S12UT(1mXXT)U(S12)T=S12UTUS12=S12(UTU)S(UTU)S12=S12ISIS12=I\begin{aligned} \sum_{P \text {CAWhite}} &=\frac{1}{m} X_{\text {PCAwhite}} X_{\text {PCAwhile}} \\ &=S^{-\frac{1}{2}} U^{T}\left(\frac{1}{m} X X^{T}\right) U\left(S^{-\frac{1}{2}}\right)^{T} \\ &=S^{-\frac{1}{2}} U^{T} \sum U S^{-\frac{1}{2}} \\ &=S^{-\frac{1}{2}}\left(U^{T} U\right) S\left(U^{T} U\right) S^{-\frac{1}{2}} \\ &=S^{-\frac{1}{2}} I S I S^{-\frac{1}{2}} \\ &=I \end{aligned}

XZCAwhite=UXPCAwhiteX_{ZCAwhite} = U X_{PCAwhite}

ZCA 白化也是一个合法的白化。

ZCAwhite=1mXZCAwhiteXZCAwhite=U1mXZCAwhiteXZCAwhiteUT=UIUT=I\begin{aligned} \sum_{ZCAwhite} &=\frac{1}{m} X_{ZCAwhite} X_{ZCAwhite} \\ &=U \frac{1}{m} X_{ZCAwhite} X_{ZCAwhite} U^{T} \\ &=U I U^{T} \\ &=I \end{aligned}

正则化:

实践中需要实现PCA白化或ZCA白化时,有时一些特征值λi\lambda_i在数值上接近于0,这样在缩放步骤时我们除以 λi\sqrt{\lambda_i} 将导致除以一个接近0的值;这可能会导致数据上溢(赋为最大值)或造成数值不稳定。因而在实践中,我们使用少量的正则化实现这个缩放过程,即在取平方根和倒数之前给特征值加上一个很小的常数ε\varepsilon

S12=[1λ1+ε0000001λn+ε]S^{\frac{1}{2}}=\left[\begin{array}{ccc} {\frac{1}{\sqrt{\lambda_{1}+\varepsilon}}} & {0} & {0} \\ {0} & {\ddots} & {0} \\ {0} & {0} & {\frac{1}{\sqrt{\lambda_{n}+\varepsilon}}} \end{array}\right]

一般取值为 ε105\varepsilon\approx10^{-5}