Pca变换matlab,PCA降维的关于转换矩阵运算问题

主函数是:

clear all;

clc

global imgRow;

global imgCol;

% 读入每个数字的前5副图像

nNumbers=10;

nCountsPerNumber = 5;

accu = 0;

display('PCA降维...');

img=imread('C:\MATLAB6p5\work\train\10.bmp');%为计算尺寸先读入一张

[imgRow,imgCol]=size(img);

TrainNumberContainer = zeros(nCountsPerNumber*nNumbers, imgRow*imgCol);

TestTestNumberContainer = zeros(nCountsPerNumber*nNumbers, imgRow*imgCol);

for i=1:nCountsPerNumber*nNumbers

strPath='C:\MATLAB6p5\work\train\';

strPath = strcat(strPath, num2str(9+i));

strPath=strcat(strPath,'.bmp');

img=imread(strPath);

temp = img(:);

%把读入的图像按列存储为行向量放入向量化数字容器NumberContainer的对应行中

TrainNumberContainer(i,:) = temp';

end

save('C:\MATLAB6p5\work\Mat\NumbersMat.mat', 'TrainNumberContainer')% 保存训练测试数字样本矩阵

%load NumbersMat.mat

[LowDimTrainNumbers, W1] = fastPCA1(TrainNumberContainer, 20); % 主成分分析PCA

save('C:\MATLAB6p5\work\Mat\LowDimTrainNumbers.mat', 'LowDimTrainNumbers');

for i=1:nCountsPerNumber*nNumbers

strPath='C:\MATLAB6p5\work\test\';

strPath = strcat(strPath, num2str(9+i));

strPath=strcat(strPath,'.bmp');

img=imread(strPath);

temp = img(:);

%把读入的图像按列存储为行向量放入向量化数字容器TestNumberContainer的对应行中

TestNumberContainer(i,:) = temp';

end

save('C:\MATLAB6p5\work\Mat\TestNumbersMat.mat', 'TestNumberContainer')% 保存测试数字样本矩阵

%load TestNumbersMat.mat

%[LowDimTestNumbers, W2] = fastPCA1(TestNumberContainer, 20); % 主成分分析PCA

%save('C:\MATLAB6p5\work\Mat\LowDimTestNumbers.mat', 'LowDimTestNumbers');

TestNumberContainer = im2double(TestNumberContainer);

meanVec = mean(TestTestNumberContainer);

[r c] = size(TestNumberContainer);

% 计算协方差矩阵的转置 covMatT

Z = (TestNumberContainer-repmat(meanVec, r, 1));

ProjectedTestImage = Z * W1;

load bp1.mat

Bptest = sim(net_1,ProjectedTestImage');

[Euc_dist_Numbers , Recognized_index] = sort(Bptest,1,'descend') ;

for i=1:50

if ceil(i/5)==Recognized_index(1,i)%ceil朝正无穷大方向取整

accu=accu+1;

end

end

accuracy=accu/50

神经网络训练函数是:

clear all;

clc;

T1 = zeros(10,50);

for k=1:10

T1(k,(k-1)*5+1:k*5) = 1;

end

load C:\MATLAB6p5\work\Mat\LowDimNumbers.mat

P = LowDimNumbers';

size(P);

size(T1);

% size(P)

% size(T1)

%数字类别10则输出层神经元数目10

%  创建一个新的前向神经网络

net_1=newff(minmax(P),[60,10],{'tansig','purelin'},'traingdm')

%  当前输入层权值和阈值

inputWeights=net_1.IW{1,1}

inputbias=net_1.b{1}

%  当前网络层权值和阈值

layerWeights=net_1.LW{2,1}

layerbias=net_1.b{2}

%  设置训练参数

net_1.trainParam.show = 50; %训练显示间隔

net_1.trainParam.lr = 0.5;

net_1.trainParam.mc = 0.8;

net_1.trainParam.epochs = 20000; % 最大训练次数

net_1.trainParam.goal = 1e-3; %期望训练误差

%  调用 TRAINGDM 算法训练 BP 网络

[net_1,tr]=train(net_1,P,T1); %TR -- 训练记录(训练次数及每次训练的误差)

%  对 BP 网络进行仿真

save('bp1', 'net_1');

PCA降维函数是:

function [pcaA V] = fastPCA1( A, k )

% 快速PCA

%

% 输入:A --- 样本矩阵,每行为一个样本

%      k --- 降维至 k 维

%

% 输出:pcaA --- 降维后的 k 维样本特征向量组成的矩阵,每行一个样本,列数 k 为降维后的样本特征维数

%      V --- 主成分向量

[r c] = size(A);

% 样本均值

meanVec = mean(A);

% 计算协方差矩阵的转置 covMatT

Z = (A-repmat(meanVec, r, 1));

covMatT = Z * Z';

% 计算 covMatT 的前 k 个本征值和本征向量

[V D] = eigs(covMatT, k);

% 得到协方差矩阵 (covMatT)' 的本征向量

V = Z' * V;

% 本征向量归一化为单位本征向量

for i=1:k

V(:,i)=V(:,i)/norm(V(:,i));

end

% 线性变换(投影)降维至 k 维

pcaA = Z * V;

% 保存变换矩阵 V 和变换原点 meanVec

save('C:\MATLAB6p5\work\Mat\PCA.mat', 'V', 'meanVec');

问题是:用训练图片得到的PCA转换矩阵该怎么用;如果是我主程序里的那种用法,为什么我的识别率好低,请大侠帮忙解惑。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值