Backto DeepCV
之前说过 PCA, PCA 构建新的特征(主成分),除去特征之间的相关性(正交)。whitening 就是在 PCA 的基础上,再进一步,使得所有的特征都具有相同的方差(normalization)。Normalization 的方式,当然还是通用的,除以标准差。
Step 0: 原始输入
Step 1: find PCs
Step 2: Apply PCA, transformation
Step 3: PCA whitening
好了,上 Normalization,
, 但是在 PCA 中呢,特殊地,实际运算中就是
。然后
就是第
维特征对应的特征值(前面pca得到的特征值),
是为了避免除数为0。
Extra Step 4: ZCA whitening
在 PCA whitening 之上,还可以再进一步操作 – ZCA. PCA 把数据映射到新的特征空间里,ZCA 再变回到原始的空间里: . U 呢还是 SVD 分解的那个 U。
ZCA Whitening code:
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) #白化变换