matlab实现zca去白化,机器学习 - 无监督学习实践1: PCA与白化

主成分分析(PCA)

PCA

白化(Whitening)

Whitening

白化的目的就是降低输入的冗余性,即想通过白化过程使得输入:

特征间的相关性较低; (PCA)

所有特征具有相同的方差. (1 λ i + ϵ 1\over\sqrt{\lambda_i+\epsilon}λi​+ϵ​1​缩放)

PCA已经使得数据间的相关性降低,为使每个输入特征具有单位方差,用1 λ i + ϵ 1\over\sqrt{\lambda_i+\epsilon}λi​+ϵ​1​作为缩放因子(ϵ \epsilonϵ用于正则化,防止分母为零,导致数据上溢到无穷,同时具有平滑即低通滤波作用),缩放每个特征x r o t , i x_{rot,i}xrot,i​,即PCA白化后的数据x P C A w h i t e x_{PCAwhite}xPCAwhite​满足:

x P C A w h i t e , i = x r o t , i λ i + ϵ ,   i 代 表 成 分 或 维 度 x_{PCAwhite,i}={x_{rot,i}\over\sqrt{\lambda_i+\epsilon}}, \space i代表成分或维度xPCAwhite,i​=λi​+ϵ​xrot,i​​,i代表成分或维度

PCA白化后的数据已经具有单位协方差,ZCA白化是在PCA白化的基础上,左乘一个任意正交矩阵R RR(R R T = R T R = I RR^{T}=R^{T}R=IRRT=RTR=I,也可以是旋转或反射矩阵),那么处理后的数据仍然具有单位协方差,在ZCA白化中,取PCA投影矩阵R = U R=UR=U,则:

x Z C A w h i t e = U x P C A w h i t e x_{ZCAwhite}=Ux_{PCAwhite}xZCAwhite​=UxPCAwhite​

这种旋转使得x Z C A w h i t e x_{ZCAwhite}xZCAwhite​尽可能的接近原始数据x xx.

PCA/Whitening 计算步骤

Implementing

PCA/Whitening

使数据均值为零;

计算协方差矩阵;

计算协方差矩阵的特征值和特征向量;

使用特征向量组成的PCA变换矩阵U UU(旋转矩阵,按特征值大小降序且按列排)旋转数据,得到PCA变换后的数据x r o t x_{rot}xrot​,取前k kk个特征向量组成旋转矩阵旋转数据,得到PCA降维后的数据(假设输入x ∈ R n ,   k < n x\in R^n, \space k

使用1 λ i + ϵ 1\over\sqrt{\lambda_i+\epsilon}λi​+ϵ​1​对PCA旋转后的数据缩放,使其具有相同单位协方差,得到PCA白化后的数据x P C A w h i t e x_{PCAwhite}xPCAwhite​;

对PCA白化后的数据,左乘PCA变换矩阵得到ZCA白化后的数据x Z C A w h i t e x_{ZCAwhite}xZCAwhite​.

二维数据PCA实验

Exercise:PCA_in_2D

MATLAB实现:

使数据均值为零:(提供的二维数据以具有相同均值0,此步省去) avg = mean(x, 1);

x = x - repmat(x, 1);

计算协方差矩阵: sigma = cov(x', 1); % MATLAB function, '1' normalize with n

sigma = x*x'/size(x, 2); % or you can use this code

原始数据协方差: sigma =

0.0883 0.0733

0.0733 0.0890

计算协方差矩阵的特征值和特征向量: [U, S, ~] = svd(sigma);

1a4a10c5be80b4eddd4030e760f24cd9.png

原始二维数据及其协方差矩阵的特征向量

U =

-0.7055 -0.7087

-0.7087 0.7055

S =

0.1620 0

0 0.0154

PCA变换旋转数据x xx得到x r o t x_{rot}xrot​: xRot = U'*x;

b79230a4ee6443639c7a8639e4644ca5.png

PCA旋转后的数据

PCA降维数据:

xRot = U(:,1:k)'*x; % projecting to 1 dimension

xHat = U(:,1:k)*xRot; % projecting the xRot back

3bdd728022f99482b876b57ae693470c.png

PCA降维 - 旋转后映射回的数据

PCA白化:

xPCAWhite = diag(1./sqrt(diag(S)+epsilon))*U'*x; % xPCAWhite_i = xRot_i/sqrt(lambda_i)

sigmaPCAWhite = cov(xPCAWhite', 1); % computes the covariance of PCAWhite data

348a943d4d6c0d6611da539ad1657ccd.png

PCA降维 - PCA白化后的数据

sigmaPCAWhite =

0.9921 0.0066

0.0066 0.9937

ZCA白化:

xZCAWhite = U*diag(1./sqrt(diag(S)+epsilon))*U'*x; % xZCAWhite_i = U*xPCAWhite

sigmaZCAWhite = cov(xZCAWhite', 1); % computes the covariance of ZCAWhite data

a1b7e783335010d39804bb4c0e06a620.png

ZCA降维 - ZCA白化后的数据

sigmaZCAWhite =

0.9996 -0.0008

-0.0008 0.9863

PCA与白化图像数据实验

Exercise:PCA and

Whitening

PCA实验

当把PCA应用于图像时,有点疑惑的是,按照协方差的公式:

C o v ( X , Y ) = E [ ( X − E [ X ] ) ( Y − E [ Y ] ) ] , Cov(X,Y)=E[(X-E[X])(Y-E[Y])] ,Cov(X,Y)=E[(X−E[X])(Y−E[Y])],

减去的均值应该是所有样本的均值.

这样,对于图像块矩阵x n × m \rm{x}_{n \times m}xn×m​,其中,n nn为一个样本的特征维度即一个图像块拉成列向量的维度,m mm为图像块的数目,求其特征维上的协方差时,均值应该这样求:x ‾ = 1 m ∑ i = 1 m x ( i ) \overline{\rm x}={1\over m}\sum_{i=1}^{m}{{\rm x}^{(i)}}x=m1​∑i=1m​x(i),而教程中是这样求的:x ( i ) ‾ = 1 n ∑ j = 1 n x j ( i ) \overline{{\rm x}^{(i)}}={1\over n}\sum_{j=1}^{n}{{\rm x}^{(i)}_j}x(i)=n1​∑j=1n​xj(i)​,即每个块求均值.

文中说我们对图像块的平均亮度值不感兴趣,所以可以减去这个值进行均值规整化.

So, we won’t use variance normalization. The only normalization we

need to perform then is mean normalization, to ensure that the

features have a mean around zero. Depending on the application, very

often we are not interested in how bright the overall input image is.

For example, in object recognition tasks, the overall brightness of

the image doesn’t affect what objects there are in the image. More

formally, we are not interested in the mean intensity value of an

image patch; thus, we can subtract out this value, as a form of mean

normalization.

PCA白化实验

Exercise: PCA

Whitening

一点说明:教程中叙述的与展示的实验结果图不一致:文中叙述的是144 × 10000 144\times10000144×10000的矩阵(与Wiki上的教程一致),实验数据集却是手写体784 × 60000 784\times60000784×60000,这里也用手写体数据,可以到THE

MNIST DATABASE下载.

零均值化数据

这里处理的是手写体图像,所以求得是每个图像块(patch)的均值.

% avg = mean(x, 1);

% x = x - repmat(avg, size(x,1), 1);

x = bsxfun(@minus, x, mean(x,1)); % or this code

b9c65867eabb233c8c5f53b1dd20d38b.png

手写体数据及零均值化数据示意

旋转数据:

sigma = x*x'/m; % n-by-n

[u, s, ~] = svd(sigma);

xRot = u'*x;% n-by-m

验证PCA实现的正确性,即旋转数据的协方差仅对角元素非零:

covar = xRot*xRot'/m; % the mean of xRot is 0

cdf0d18292041d6f4c0dbcfe3bd74884.png

手写体数据旋转后数据的协方差

寻找保留主成分数目:

保留方差百分比:99%:

lambda = diag(s);

lambda_sum = sum(lambda);

lambda_sumk = 0;

perc = 0;

k = 0;

while perc < 0.99

k = k + 1;

lambda_sumk = lambda_sumk + lambda(k);

perc = lambda_sumk / lambda_sum;

end

维数约简与重构:

xDimk = u(:,1:k)'*x;

xHat = u(:,1:k)*xDimk;

db11c3ae19c00ff45a0ba5a3dead141b.png

PCA维数约简后重构的图像 (采用每个图像块的均值零均值化图像,

方差保留百分比:99.01%,784 -> 300)

如果零均值化过程,采用所有图像块的均值,则零均值化后的图像和PCA重构后的图像如下图所示:

99765c5f381206ae8d8c961d033c846d.png

PCA维数约简后重构的图像 (采用所有图像块的均值零均值化图像,

方差保留百分比:99.01%,784 -> 300)

PCA白化及检验:

通过观察白化后数据的协方差矩阵,分别使用不同的值正则化和不使用正则化(epsilon近似为0):

epsilon = 1e-1;

%%% YOUR CODE HERE %%%

xPCAWhite = diag(1./sqrt(diag(s)+epsilon))*u'*x;

6dfd8ab865dba661f9bb7433bb06406b.png

白化后数据的协方差矩阵

ZCA白化:

xZCAWhite = u*diag(1./sqrt(diag(s)+epsilon))*u'*x;

48b9aa53c931af16f8477aa7ff2647e3.png

ZCA维数约简后重构的图像

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值