2二维线性鉴别分析(2DLDA)

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2 二维线性鉴别分析(2DLDA )

2.1 实验原理

由上面的公式计算w G 和b G ,类似于经典的Fisher 准则,二维图像直接投影的广义Fisher 准则定义如下:

()T b T w X G X J X X G X

= 一般情况下w G 可逆,也就是根据1w b G G -计算本征值、本征向量,取最大的d 个本征值

对应的本征向量作为二维投影的向量组。需要特别指出的是,尽管b G 和w G 都是对称矩阵,

但1w b G G -不一定是对称矩阵。所以各投影轴之间关于w G 及t G 共轭正交,而不是正交。 本实验为简单起见,使用的为欧式距离。

2.2 实验过程

读取训练样本——〉求样本均值——〉求类内散布矩阵——〉特征值分解——〉对实验样本分类——〉计算分类正确率

2.3 实验结果分析

本实验中的类别数为40,每类的样本数为10,训练数为5,检测数为5。实验的结果正确率为72%,结果正确率偏低。

2.4 matlab 代码

clear all;

t0=clock;

class_num = 40;

class_sample = 10;

train_num = 5;

test_num = 5;

scale = 1;

allsamples=[];%所有训练图像

gnd=[];

k=1;

path = ['C:\Documents and Settings\dongyan\桌面\模式识别\ORL\ORL\ORL'];

for i=1:class_num

for j =1:train_num

name =[path num2str(10*i+j-10,'%.3d') '.BMP' ];

[a,map]=imread(name,'bmp');

a = imresize(a,scale);

a=double(a);

ImageSize=size(a);

height=ImageSize(1);

width=ImageSize(2);

A=reshape(a,1,ImageSize(1)*ImageSize(2));

allsamples=[allsamples;A];

gnd(k)=i;

k=k+1;

end;

end;

trainData=allsamples;

sampleMean=mean(allsamples);%求所有图片的均值

[nSmp,nFea] = size(trainData);

classLabel = unique(gnd);

nClass = length(classLabel);

classmean=zeros(nClass,height*width);%求每类的均值

for i=1:nClass

index = find(gnd==classLabel(i));

classmean(i,:)=mean(trainData(index, :));

end

Gb=0;

Amean=reshape(sampleMean,height,width);%求类间散布矩阵Gb

for i=1:nClass

Aimean=reshape(classmean(i,:),height,width);

Gb=Gb+(Aimean-Amean)'*(Aimean-Amean);

end

Gw=0;%求类内散布矩阵

for i=1:nClass

for j=train_num*(i-1)+1:train_num*i

g=reshape((trainData(j,:)-classmean(i,:)),height,width);

Gw=Gw+g'*g;

end

end

invGw=inv(Gw);%求(Gw-1)*Gb

U=invGw*Gb;

[eigvu eigvet]=eig(U);%求特征值与特征向量

d=diag(eigvu);

[d1 index]=sort(d);

cols=size(eigvet,2);

for i=1:cols

vsort(:,i) = eigvet(:, index(cols-i+1) ); % vsort 是一个M*col阶矩阵,保存的是按降序排列的特征向量,每一列构成一个特征向量

dsort(i) = d( index(cols-i+1) ); % dsort 保存的是按降序排列的特征值,是一维行向量end %完成降序排列

for i=1:8

X(:,i)=vsort(:,i);%X表示投影轴

end

accu=0;%做测试,记录命中率

for i=1:class_num

for j =train_num+1:class_sample

name =[path num2str(10*i+j-10,'%.3d') '.BMP' ];

Image = double(imread(name));

Image = imresize(Image,scale);

testdata1=Image*X;

for k=1:class_num*train_num

juli(k)=norm(testdata1-reshape(trainData(k,:),height,width)*X);%计算图片与训练样本之间的距离,如果距离最小,认为测试图片与训练图片属于同一类

end;

[r t]=min(juli);

if fix((t-1)/train_num)==(i-1)

accu=accu+1;

end

end;

end;

accu=accu/(class_num*test_num);

accu

time1 = etime(clock,t0)

相关文档
最新文档