PCA和Softmax学习

PCA和Softmax学习

老师上课说PCA(主成分分析)简单,不用讲,简单是简单,但也要看看,主要就是看fuldl上的教程,然后自己推导和matlab实现。

PCA

pca算法

pca是一种降维方法,可以看做是逐一取方差最大方向,就是对协方差矩阵做特征值分解,取最大特征值所对应的方向。算法描述如下:

1 对所有样本进行中心化: xi <— xi1mmi=1xi
2 计算样本的协方差矩阵 XXT
3 对协方差矩阵 XXT 做特征值分解
4 取最大的 d 个特征值所对应的特征向量 w1,w2,w3,,wd
5 使用特征向量乘以原始数据得到旋转数据 xrot=Ux ,如果实现降维,则使用 x˜=U(1:k)x
代码如下:

sigma = x * x' / size(x,2);  %协方差矩阵
[u, s, v] = svd(sigma); %求特征
xRot = u' * x;  %数据旋转后的结果
%降维
u(:,2) = 0;
xHat = u' * x;

PCA白化

白化是为了实现:
1 特征之间相关性较低
2 所有特征具有相同的方差

在使用pca降维时,需要计算协方差的特征向量,它们之间是不相关的。为了满足特征具有相同的方差,则使用 1λ λ 为特征向量,即 xPCAwhite,i=xrot,iλi . 这样就 s.t.WTW=I

ZCA白化

ZCA是使旋转尽可能的接近原始数据,在使用时一般保留n个维度。

对于两种白化的实现,由于当特征值 λ 可能为接近0的数,这使得 1λ 为无限大,则需要给 λ 加上 ϵ .具体代码实现如下:

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

对于教程后面的练习题,第一个照着公式撸就好了,第二个主要代码如下:

%% Step 0b: Zero-mean the data (by row)
%为每个图像计算像素强度的均值
avg = mean(x, 1);  %每列为一张图片
x = x - repmat(avg, size(x,1), 1);

%% Step 1a: Implement PCA to obtain xRot
sigma = x * x' / size(x,1);
[s, u, v] = svd(sigma);
xRot = u' * x;

%% Step 1b: Check your implementation of PCA
covar = u;

%% Step 2: Find k, the number of components to retain
k = ceil(size(u,1) * 0.99); % 99%向上取整

%% Step 3: Implement PCA with dimension reduction
u(:, k + 1:end) = 0;
xHat = u' * x;

%% Step 4a: Implement PCA with whitening and regularisation
epsilon = 0.1;
xPCAWhite = zeros(size(x));

%% Step 4b: Check your implementation of PCA whitening 
epsilon = 0.1;
covar = covar + epsilon;

%% Step 5: Implement ZCA whitening 
epsilon = 0.1;
xZCAWhite = u * diag(1./(diag(u) + epsilon)) * u' * x;

Softmax回归

Softmax回归是解决多分类问题,和logistic类似(logistic是解决二分类问题)。

对于训练集 {(x1,y1),...(xm,ym)} ,其中x为特征,y为类标,k为类别个数, yi{1,2,...k} .
hypothesis 如下:

hθ(xi)=p(yi=1|xi;θ)p(yi=2|xi;θ)...p(yi=k|xi;θ)=1kj=1eθTjxieθT1xieθT2xi...eθTkxi

代价函数为:

J(θ)=1mi=1mj=1k1{yi=j}logeθTjxikl=1eθTlxi+λ2i=1kj=0nθ2ij

梯度公式如下:

θjJ(θ)=1mi=1m[xi(1{yi=j}p(yi=j|xi;θ))]+λθj

上述公式都是ufldl中给出的,现在给出梯度的推导:

θJ(θ)=1mi=1mj=ik1{yi=j}logeθTjxikl=1eθTlxi=1mi=1m1{yi=j}logeθTjxikl=1eθTlxi+cjk1{yc=j}logeθTcxikl=1eθTlxi

由于:
θjlogeθTjxikl=1eθTlxi=θTjxilogl=1keθTlxi=xi1kl=1eTlxieTlxixi(1.1)

θjlogeθTcxikl=1eθTlxi=θTcxilogl=1keθTlxi=1kl=1eTlxieTlxixi(1.2)

在(1.2)中 cj 则, θTcxi 等于0
由于在 yi 中,只存在一个j使得 yi=j(jk) ,则 kcj1{yc=j}=11{yi=j}

把(1.1)(1.2)带入第一个式子可得

1m[i=1m1{yi=j}logeθTjxikl=1eθTlxi+cjk1{yc=j}logeθTcxikl=1eθTlxi]=1mi=1m[1{yi=j}(xi1kl=1eTlxieTlxixi)+(11{yi=j})1kl=1eTlxieTlxixi]=1mi=1m[xi(1{yi=j}1{yi=j}eTlxikl=1eTlxi)+(eTlxikl=1eTlxi+1{yi=j}eTlxikl=1eTlxi)=1mi=1m[xi(1{yi=j}p(yi=j|xi;θ))]

第一次使用lateX公式编辑,公式写的有点乱。
最后就是matlab实现,主要代码如下:

%softmaxCost.m
%计算hypothesis
exp0 = exp(theta * data);  %10 * 100
h = exp0./repmat(sum(exp0), numClasses, 1);

%计算代价 权重衰减项
cost = -1 / numCases * sum(sum((groundTruth.*log(h)))) + lambda / 2 * (sum(sum(theta.^2)));

%计算梯度
thetagrad = -1 / numCases * ((groundTruth - h)*data') + lambda * theta;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%softmaxPredict.m
numClasses = softmaxModel.numClasses;
%预测
exp0 = exp(theta * data);
h = exp0./repmat(sum(exp0), numClasses, 1);

%预测结果, 概率最大的那个
[m, i] = max(h);  %按列比较
pred = i;

最后得到测试准确率为:92.640%
这里写图片描述

为了清洗的查看错误的结果,对识别错误的数字可视化:

%可视化出错结果
view = find(sparse(labels(:) ~= pred(:)))';
visualization(images(:,view), 28);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%visualization.m
function visualization(data, pSize)
%可视化图
%data   输出数据
%pSize  图像尺寸

fsize = 10; %显示10*10张图片
figure(1);

%循环绘制子图
for i = 1: fsize * fsize
    subplot(fsize, fsize, i);
    imshow(reshape(data(:,i), pSize, pSize));
end

end

结果为:
这里写图片描述

补充(2017.07.12)

这是之前囫囵吞枣的看了一遍,就几乎照着推了一遍,对其原理根本不理解,现在在论文中又看到了softmax,因此又重新看了一下。

首先,softmax是根据logistic得来的,因为logistic分布为两极化,可以使正样本趋近于1,负样本趋近于0,因此softmax函数定义为:

P(i)=θTixkj=1eθTjx

同时,logistic的损失函数是根据似然函数得到的:

L(θ)=i=1mP(y=1|xi)yiP(y=0|xi)1yi

由于乘积的方式不好计算,因此去对数,得到对数似然函数:

logL(θ)=i=1m[yiP(y=1|xi)+(1yi)P(y=0|xi)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值