⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 classinglda.m

📁 《机器学习》课上的作业
💻 M
字号:
%田宏宇——机器学习 作业2 LDA
function accuracy = ClassingLDA(ReducedDim)
%一个修改后的LDA进行人脸识别的Matlab代码
%clear all;
% calc xmean,sigma and its eigen decomposition 
allsamples=[];%所有训练图像 
load faceTemplet pattern;
%faceTemplet人脸包结构说明:
%pattern——1*40数组,包含40个人脸数据
%	pattern(i).num——此样本集中有几个样本,典型为10
%	pattern(i).figure——1*1结构,data
%		pattern(i).figure(j).data——1*10结构,存储10个样本
%			pattern(i).figure(j).data(k)——1*1结构,face
%				pattern(i).figure(j).data(k).face——图像样本

nclass = 40;	%选取类别数,以下的注释中假定为40
ntrain = 5;	    %训练数,以下的注释中假定为5
ntest = pattern(1).num - ntrain;	%测试数,以下的注释中假定为5

nums = [];
for i=1:nclass
    for j=1:ntrain
      % imshow(a); 
      b=pattern(i).figure.data(j).face(:); % b是列矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右 
      b=im2double(b');  % 转为实数行向量
      allsamples = [allsamples; b];  % allsamples 是一个M * N 矩阵,allsamples 中每一行数据代表一张图片,其中M为训练样本数
    end
    nums = [nums; i*ones(ntrain,1)];      % 制作类标签
end 

disp('1.训练样本导入完毕!');
tmp_T = cputime;

%求LDA变换矩阵
options = []; 
options.Fisherface = 1;
%W = sllda(allsamples, nums, 'regdual', 'prepca', true);
[eigvector, eigvalue] = LDA(allsamples, nums, options);

ReducedDim = size(eigvector, 2);
allsamples = allsamples - ones(ntrain*nclass,1) * mean(allsamples);        %数据中心化
allcoor = allsamples * eigvector;           %allcoor为M*fea,M = nclass*ntrain,
accu = 0;

disp('2.训练样本投影完毕!');

ReducedDim = size(eigvalue,1);
%以下求类的判别函数
oneClassSamples = ones(ntrain, ReducedDim);   %一类中的训练图像Feature

discResult = ones(1, nclass);           %预先构造一个判别结果数组

discStruct.funHandle = @sin;           %预先构造一个判别函数结构体
discStruct.sigma = [];                 %最终此判别函数结构体的长度为nclass
discStruct.mu = [];

for i=1:nclass
	for j=1:ntrain
        oneClassSamples(j,:) = allcoor((i-1)*ntrain+j,:);
        % OneClassSamples 是一个ntrain * ReducedDim 矩阵
    end 
    %求一类样本的均值以及协方差阵
  	meanClassSamples = mean(oneClassSamples);                       %均值行向量,1*ReducedDim
    sigma = cov(meanClassSamples);

    %构造一个判别函数结构体
    discStruct(i).funHandle = ...
            @(x, MU, SIGMA)(-x*(inv(SIGMA))*x'/2 + MU*(inv(SIGMA))'*x' -MU*(inv(SIGMA))*MU'/2 - log(det(SIGMA))/2);
    discStruct(i).sigma = sigma;
    discStruct(i).mu = meanClassSamples;
end

disp('3.类判别函数构造完毕!');

%以下用NaiveBayes准则进行分类测试
% 测试过程 
testsamples = []; %所有测试样本M*10304, M= nclass*ntest
for i = 1 : nclass
    for j = ntrain+1 : ntrain+ntest                 % 读入ntest x 5 副测试图像 
        b = pattern(i).figure.data(j).face(:);      % b是列矢量 1×N,其中N=10304,提取顺序是先列后行,即从上到下,从左到右 
        b = im2double(b');                          % 转换为行向量
        testsamples = [testsamples; b];
    end
end

testsamples = testsamples - ones(ntest*nclass,1) * mean(testsamples);    %数据中心化
tcoor = testsamples * eigvector;                    %测试样本进行投影,是M×ReducedDim阶矩阵, M= nclass*ntest

for i = 1 : nclass
    for j = 1 : ntest
        for k = 1 : nclass
            discResult(k) = discStruct(k).funHandle(tcoor((i-1)*ntest+j,:), discStruct(k).mu, discStruct(k).sigma);
        end 
         %利用排序方式得到样本属于第几类
        [maxv, indx] = max(discResult);
        result = ['第', num2str(i),'类中第', num2str(j), '张识别'];
        if indx == i
            accu = accu + 1;
            result = [result, '正确'];
        else
            result = [result, '错误,被识别为了第', num2str(indx), '类'];
        end
        disp(result);
    end
end
accuracy = accu / (nclass*ntest);             %输出识别率 
disp('>>> ');
disp(strcat('从',num2str(nclass),'类图像中选择前',num2str(ntrain),...
    '张训练,后',num2str(ntest),'张测试,'));
disp(strcat('抽取特征维数',num2str(ReducedDim),',共花费时间',num2str(cputime-tmp_T)));
disp('--- ');
disp(strcat('识别率为', num2str(accuracy*100), '%'));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -