主函数是:
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转换矩阵该怎么用;如果是我主程序里的那种用法,为什么我的识别率好低,请大侠帮忙解惑。