资源简介
可实现的2DLDA算法,有mat,自己用的,直接可实现
代码片段和文件信息
clc
close all hidden
clear all
%% 导入之前生成的数据集
load ORL2D_data
xx=5;%设循坏次数为50次
%% 分类标签
groups=[]; %这一步用来给图像加标签,以确定是哪个人
for i=1:cNum
groups=[groupsones(1fperc)*i];%fperc为人脸库中每个人有多少张图像,如yale库中每人有11张图像,这个值也在Yale_data中,load进来就有的
end
groups=groups‘; %通过上面的for循环,标签已经加好
accuracy=[];
for fftr=5 %取训练样本数为5,就是说一个人在人脸库里有十几张图片,我只取出357张作为训练,剩余的那些作为测试具体的你自己去设定
all_accuracy=0; %
errornum=0; %误识数,就是识别错误的个数
ave_times=0; %计算时间
disp([‘2DLDAfftr=‘num2str(fftr)]); %在commend window中显示训练个数2DLDAfftr=35或7,用于观察运行进度
for i=1:xx %每种训练样本数,计算50次,以求最终识别率的平均值,
t1=clock; %设定开始时间
test_accuraty=0; %识别率,先设为0,因为要进行循坏,所以在开始要清零
[test train] = crossvalind(‘holdOut‘groupsfftr/fperc);%此步骤加上以下的4个步骤都是用于随机选择人脸库中随机选取每个人的fftr(前面已经设定)张图像作为训练样本,剩余的作为测试图像
train_samples=all_samples(::train);%随机选取训练人脸数据,这里 train_samples为3维,第一维表示一张图像的行,第二维是表示图像的列,第三维是说有多少个这样的行和列的人脸,比如yale库中15个人,每人11张图像,那么每人选3个作为训练,这里第三维就是3*15=45
train_data_labels=groups(train); %加标签,确定是哪个人的人脸图像
test_samples=all_samples(::test);%这里是剩余的测试人脸图像,同样的原理
test_data_labels=groups(test); %加标签
%% 以下是LDA处理过程
N=cNum*fftr;
[nSmpnFeanumtr] = size(train_samples);%size用于获得矩阵尺寸,这里是三维,同上
ReducedDim = 10; %降温幅度,把一幅图像降到10维
mean_maxt=zeros(nSmpnFeacNum);%zeros用于分配一个全为0的,尺寸为(nSmpnFeacNum)的矩阵
mean_all=mean(train_samples3);%求矩阵间均值
for j=1:cNum%for循环用于求类内均值,就是每个类的均值,同一个人的图像属于一个类
mean_cNum=mean(train_samples(::1+fftr*(j-1):fftr*j)3);
mean_maxt(::j)=mean_cNum;
end
Sb=zeros(nFea);
Sw=zeros(nFea);
for m=1:cNum%以下是Sb计算类间离散度矩阵,具体参看文献
sb=(mean_maxt(::m)-mean_all)‘*(mean_maxt(::m)-mean_all);
Sb=Sb+fftr*sb;
for n=1:fftr
X_t=train_samples(::n+fftr*(m-1));%以下是Sw计算类内离散度矩阵,具体参看文献
sw=(X_t-mean_maxt(::m))‘*(X_t-mean_maxt(::m));
Sw=Sw+sw;
end
end
Sb=(1/N)*Sb;
Sw=(1/N)*Sw;
[eigvector eigvalue] = eig(SbSw); %最终的计算公式,就是那个求解方程eigvalue矩阵中的值都放在对角线上,表示的是特征值,eigvector矩阵是特征值对应的特征向量
eigvalue = diag(eigvalue);%将对角化的特征值转成一个列向量
[~ index] = sort(-eigvalue);%将特征值进行排序
eigvalue = eigvalue(index);
eigvector = eigvector(:index);
eigvector = eigvector(: 1:ReducedDim);
for q = 1:size(eigvector2)
eigvector(:q) = eigvector(:q)./norm(eigvector(:q));%这些都是提取最小(大)特征值所对应的特征向量
end
%% recognition这里是识别过程
train_alldata=bsxfun(@minustrain_samplesmean_all);
test_alldata=bsxfun(@minustest_samplesmean_all);
for a=1:(fperc-fftr)*cNum
test_data=test_alldata(::a);
test_proj=test_data*eigvector;
all_result=[];
for b=1:fftr*cNum
train_data=tra
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4537 2014-03-10 23:19 2DLDA\LDA2D_knn.asv
文件 4776 2014-11-10 20:07 2DLDA\LDA2D_knn.m
文件 3729559 2013-10-08 16:25 2DLDA\ORL2D_data.mat
文件 1396287 2013-10-08 16:15 2DLDA\Yale2D_data.mat
目录 0 2014-11-14 10:26 2DLDA\
- 上一篇:可实现的LPP算法代码
- 下一篇:MiniBalance上位机所有资料
评论
共有 条评论