• 大小: 4.89MB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2023-09-26
  • 语言: 其他
  • 标签: 2DLDA  

资源简介

可实现的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\

评论

共有 条评论

相关资源