UFLDL教程笔记及练习答案二(预处理:主成分分析和白化)

首先将本节主要内容记录下来,然后给出课后习题的答案。

笔记:

1:首先我想推导用SVD求解PCA的合理性。

PCA原理:假设样本数据X∈Rm×n,其中m是样本数量,n是样本的维数。PCA降维的目的就是为了使将数据样本由原来的n维降低到k维(k<n)。方法是找数据随之变化的主轴,在Andrew
Ng的网易公开课上我们知道主方向就是X的协方差所对应的最大特征值所对应的特征向量的方向(前提是这里X在维度上已经进行了均值归一化)。在matlab中我们通常可以用princomp函数来求解,详细见:http://blog.csdn.net/lu597203933/article/details/41544547。这里我们讲解如何用svd来求解。 我们的目的就是要求协方差矩阵所对应的特征值和特征向量。

奇异值分解求解:    

我们知道奇异值分解矩阵表示为:X =SVDT,其中S是X*XT的特征向量(Rm×m);而V是对角矩阵(Rm×n),每一个对象值称为X的奇异值,是X*XT或者XT*X的特征值的非负平方根;D是XT*X的特征向量(Rn×n)。当样本X在维度上进行了均值归一化,那么它的协方差就是:

因此D每一列都是协方差矩阵的的特征向量,因此Xpca=X*D就是PCA后的结果。

用上面对X进行奇异值分解求解协方差矩阵的特征向量(即数据随之变化的主方向),完全是根据矩阵的奇异值分解定义得来的。但是存在这一个这样的问题,当样本个数m非常大时,我们需要的存储空间是m×m+m×n+n×n将会非常大,那么我们有没有简便的方法呢,我们按如下公式求解

这里的sigma为协防差矩阵(Rn×n),是对称半正定矩阵,按照奇异值分解的定义这里的S是sigma*sigmaT的特征向量,V为其sigma的奇异值,D为sigmaT*sigma的特征向量,也就是S的转置。下面我们证明这里的S也是XT*X(X的协方差)的特征向量,V为协方差的特征值。

由定义我们可以得知下面公式(大S和小s是区分开的;其中小d为协方差的特征向量,v为协方差特征值的非负平方根)

下面是推导过程:

我们可以看出小d就等于大S,也就是说sigma的奇异值分解得到的S就是我们要求的协方差(sigma)的特征向量,而m*V=vTv,得出sigma的奇异值正好是X的奇异值的平方(即为sigma的特征值)的倍数,这样也就可以通过前k个V个奇异值(即协方差的前k个特征值)所占的比重来决定k的大小。

由于sigma是Rn×n,与样本大小无关,因此我们通过对sigma进行奇异值分解间接得到协方差矩阵的特征向量和特征值所需要的存储空间为4*n*n,在样本数量很大的时候,对空间要求将是大大的缩减。因此我们通常用svd求解pca的代码如下:

avg = mean(X, 1);
X = X - repmat(avg, size(X,1),1);
sigma = X'*X./size(X,1);
[S,V,D]= svd(sigma);
Xpca = X*S;

结论:

[S,V,DT]= svd(sigma)得到的S是XTX(协方差)的特征向量,V是协方差的特征值矩阵,V也是X通过PCA后的数据的协方差矩阵,为对角矩阵,这样就表明去除了各个维度之间的相关性了。。

2:PCA白化和ZCA白化

在我们得到Xpca之后,它的协方差:

我们得出了PCA后数据的协方差就是原始数据协方差的特征值构成的矩阵V,故其为对角矩阵,除了对象元素,其它元素均为0,这说明其它维度之间没有相关性,即去除了数据之间的冗余。

PCA白化就是使PCA后数据的协方差变为单位矩阵,此时我们可以通过以下公式的得到。直接使用作为缩放因子来缩放每个特征

考虑到特征值有可能为0,因此我们对其进行来正则化:

ZCA白化就是通过重构PCA白化后的原始数据,其协方差矩阵也是单位矩阵,很多算法都是用白化作为预处理的步骤的,这样就去除了各个维度之间的相关性,得到对原始图像更低冗余的表示。

3:对图像数据应用PCA算法

这个在UFLDL教程有一小节,意思就是比如从图像中得到一个patch(14*14),是一个196维的向量,我们需要做的是将这196维向量的均值归一化为0(无需做方差归一化),但是注意这里和上面是有区别的,上面是对每个维度进行均值归一化,而这里是对每一个样本进行均值归一化(我也不太理解为什么这样处理~~),教程给出的理由是“对每一个像素单独估计均值和方差意义不大,因为(理论上)图像任一部分的统计性质都应该和其它部分相同”这样就能保证所有的特征的均值在0附近。“根据应用,在大多数情况下,我们并不关注所输入图像的整体明亮程度。比如在对象识别任务中,图像的整体明亮程度并不会影响图像中存在的是什么物体。更为正式地说,我们对图像块的平均亮度值不感兴趣,所以可以减去这个值来进行均值规整化”。

这样处理之后再对数据进行上述描述的由svd求PCA后的数据及白化。

练习答案:

需要注意的是以下联系的X是n×m维的。1 exercise:pca in 2D是对数据的维度进行均值归一化,,而2: Exercise:PCA and Whitening是对每一个样本进行均值归一化(对图像的应用)

1: Exercise:PCA in 2D

(1)% Step 1a: Implement PCA to obtain U

u = zeros(size(x, 1)); % You need to compute this
avg = mean(x,2);     %按行求取均值
x = x - repmat(avg, 1,size(x,2));   %% size(x,2) = 45
sigma = x * x'/ size(x,2);
[u, s, v] = svd(sigma);

(2)Step 1b: Compute xRot, the projection on to the eigenbasis

xRot = u'* x;

(3)%% Step 2: Reduce the number ofdimensions from 2 to 1.

k = 1; % Use k = 1 and project the data onto the first eigenbasis
xHat = zeros(size(x)); % You need to compute this
x_ap = u(:,1:k)'*x;
xHat(1:k,:) = x_ap;
xHat = u*xHat;

(4)%% Step 3: PCA Whitening

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

(5) %% Step 3: ZCA Whitening

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

2: Exercise:PCA and Whitening

(1)% Step 0b: Zero-mean the data (byrow)

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

(2)% Step 1a: Implement PCA to obtainxRot

xRot = zeros(size(x)); % You need to compute this
sigma = x*x'./size(x, 2);
[U,S,V] = svd(sigma);
xRot = U'*x;

(3)Step 1b: Check your implementationof PCA

covar = zeros(size(x, 1)); % You need to compute this
covar = xRot*xRot'/size(xRot,2);

(4)Step 2: Find k, the number of components to retain

k = 0; % Set k accordingly
sum_k = 0;
sum = trace(S);
for k = 1:size(S,1)
    sum_k = sum_k + S(k,k);
    if(sum_k/sum >= 0.99)
        break;
    end
end

(5)%% Step 3: Implement PCA with dimension reduction

xHat = zeros(size(x));  % You need to compute this                %%%%% 还原近似数据
xTilde = U(:,1:k)' * x;
xHat(1:k,:)=xTilde;
xHat=U*xHat;

(6)%% Step 4a: Implement PCA withwhitening and regularisation

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

(7)  % Step 4b: Check yourimplementation of PCA whitening

  covar = xPCAWhite * xPCAWhite'./size(xPCAWhite, 2);

(8)Step 5: Implement ZCA whitening

xZCAWhite = U * diag(1./sqrt(diag(S) + epsilon)) * U' * x;
时间: 2024-08-18 19:23:13

UFLDL教程笔记及练习答案二(预处理:主成分分析和白化)的相关文章

UFLDL教程笔记及练习答案六(稀疏编码与稀疏编码自编码表达)

稀疏编码(SparseCoding) sparse coding也是deep learning中一个重要的分支,同样能够提取出数据集很好的特征(稀疏的).选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基本元素的叠加,在图像中这些基本元素可以是面或者线. 稀疏编码算法的目的就是找到一组基向量使得我们能将输入向量x表示成这些基向量的线性组合: 这里构成的基向量要求是超完备的,即要求k大于n,这样的方程就大多情况会有无穷多个解,此时我们给

UFLDL教程笔记及练习答案三(Softmax回归与自我学习)

1:softmax回归 当p(y|x,theta)满足多项式分布,通过GLM对其进行建模就能得到htheta(x)关于theta的函数,将其称为softmax回归.教程中已经给了cost及gradient的求法.需要注意的是一般用最优化方法求解参数theta的时候,采用的是贝叶斯学派的思想,需要加上参数theta. 习题答案: (1) 数据加载------代码已给 (2) %% STEP 2: Implement softmaxCost   得到计算cost和gradient M = theta

UFLDL教程笔记及练习答案三(Softmax回归与自我学习***)

1:softmax回归 当p(y|x,theta)满足多项式分布,通过GLM对其进行建模就能得到htheta(x)关于theta的函数,将其称为softmax回归. 教程中已经给了cost及gradient的求法.须要注意的是一般用最优化方法求解參数theta的时候,採用的是贝叶斯学派的思想,须要加上參数theta. softmax回归 习题的任务就是用原有的像素数据集构建一个softmax回归模型进行分类.准确率略低 92.6%,. 而自我学习是用5~9之间的数据集当做无标签的数据集,然后构建

UFLDL教程笔记及练习答案五(自编码线性解码器与处理大型图像)

自动编码线性解码器 自动编码线性解码器主要是考虑到稀疏自动编码器最后一层输出如果用sigmoid函数,由于稀疏自动编码器学习是的输出等于输入,simoid函数的值域在[0,1]之间,这就要求输入也必须在[0,1]之间,这是对输入特征的隐藏限制,为了解除这一限制,我们可以使最后一层用线性函数及a = z 习题答案: SparseAutoEncoderLinerCost.m function [cost,grad,features] = sparseAutoencoderLinearCost(the

UFLDL教程笔记及练习答案四(建立分类用深度学习)

此次主要由自我学习过度到深度学习,简单记录如下: (1)深度学习比浅层网络学习对特征具有更优异的表达能力和紧密简洁的表达了比浅层网络大的多的函数集合. (2)将传统的浅层神经网络进行扩展会存在数据获取.局部最值和梯度弥散的缺点. (3)栈式自编码神经网络是由多层稀疏自编码器构成的神经网络(最后一层采用的softmax回归或者logistic回归分类),采用逐层贪婪的训练方法得到初始的参数,这样在数据获取方面就可以充分利用无标签的数据.通过逐层贪婪的训练方法又称为预训练,然后可以使用有标签的数据集

UFLDL 教程三总结与答案

主成分分析(PCA)是一种能够极大提升无监督特征学习速度的数据降维算法.更重要的是,理解PCA算法,对实现白化算法有很大的帮助,很多算法都先用白化算法作预处理步骤.这里以处理自然图像为例作解释. 1.计算协方差矩阵:   按照通常约束,x为特征变量,上边表示样本数目,下标表示特征数目.这里样本数为m. xRot = zeros(size(x)); sigma=x*x'/size(x,2); %sigma为协方差矩阵 [U,S,V]=svd(sigma); %U为特征向量,X为特征值,V为U的转置

神级网络 - UFLDL教程笔记

激活函数: 1)sigmoid函数 - 值域(0,1)    2)tanh函数 - 值域(-1,1)   两个函数都扩展至向量表示:      - 网络层数  - 第l层的节点数(不包括偏置单元)  - 第l层第j单元 与 第l+1层第i单元之间的连接参数,大小为  - 第l+1层第i单元的偏置项  - 第l层的激活值  - 第l层第i单元输入加权和(包括偏置单元)  - 样本 m - 样本数 α - 学习率 λ - 权重衰减参数,控制方差代价函数两项的相对重要性. hw,b(x)=a 前向传播

Deep Learning 12_深度学习UFLDL教程:Sparse Coding_exercise(斯坦福大学深度学习教程)

前言 理论知识:UFLDL教程.Deep learning:二十六(Sparse coding简单理解).Deep learning:二十七(Sparse coding中关于矩阵的范数求导).Deep learning:二十九(Sparse coding练习) 实验环境:win7, matlab2015b,16G内存,2T机械硬盘 本节实验比较不好理解也不好做,我看很多人最后也没得出好的结果,所以得花时间仔细理解才行. 实验内容:Exercise:Sparse Coding.从10张512*51

简明Python教程笔记(二)----用户交互raw_input()

raw_input() python内建函数 将所有输入看做字符串,返回字符串类型 input()对待纯数字输入时具有自己的特性,它返回所输入的数字的类型( int, float ) input() 本质上还是使用 raw_input() 来实现的,只是调用完 raw_input() 之后再调用 eval() 函数 例子: #!/usr/bin/env pythonthis_year = 2014name = raw_input('please input your name:')age1 =