2二维线性鉴别分析(2DLDA)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)