PCA和Softmax学习

来源:互联网 发布:马兰币数据 编辑:程序博客网 时间:2024/05/21 06:50

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 xRotsigma = x * x' / size(x,1);[s, u, v] = svd(sigma);xRot = u' * x;%% Step 1b: Check your implementation of PCAcovar = u;%% Step 2: Find k, the number of components to retaink = ceil(size(u,1) * 0.99); % 99%向上取整%% Step 3: Implement PCA with dimension reductionu(:, k + 1:end) = 0;xHat = u' * x;%% Step 4a: Implement PCA with whitening and regularisationepsilon = 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θTixieθ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%计算hypothesisexp0 = exp(theta * data);  %10 * 100h = 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.mnumClasses = 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.mfunction 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));endend

结果为:
这里写图片描述

0 0
原创粉丝点击