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

📄 classify.m

📁 这是人脸识别代码
💻 M
字号:
function [Success,ClassifyTime] = Classify(TrainX,TrainClass,TestX,TestClass);
%
% 分类。对TestX的每一样本根据已知类别的TrainX进行分类
% 并根据TestClass返回TestX的识别结果Result
% TrainX的每一列是一个样本,TrainClass(i)是TrainX第i列的类别。
%
% Author : kk.h
% Date : 2004.5.2
% Email : kkcocoon@163.com
% SUN YAT-SEN UNIVERSITY
%
 
BTime = clock;

% K 阶识别率(K-近邻分类)
K = 3;

% -----------------------------------------------------------------------------------------------------------
% 识别
% 对TestX中的每一列,寻找TrainX中距离最近的一列,则判断为序号为该列的人

% 第i个测试样本的识别结果:
% TestClassReg(i,1),TestClassReg(i,2),TestClassReg(i,3) 是识别为训练样本中的最近的三类。
% Success(i,1),Success(i,2),Success(i,3)=1为成功识别为同一类,0为识别错误
% Distance(i,1),Distance(i,2),Distance(i,3) 为最近的三类的误差

% 测试的样本数
TestCount = size(TestX,2);

Success = zeros(TestCount,K);

for (i=1:TestCount)

    % 先求平均,为了求测试样本与该类的所有训练样本的平均的距离
    [TrainX,TrainClass]= MeanClass(TrainX,TrainClass);

    % 算出当前测试样本TestX(:,i)和TrainX的每一列(每一个训练样本)的距离
    for (j=1:size(TrainX,2))
       % theDist = norm(TestX(:,i) - TrainX(:,j),2); % L2的距离
       % theDist = norm(TestX(:,i) - TrainX(:,j),1); % L1的距离
        theDist(j) = norm(TestX(:,i) - TrainX(:,j),1) / (norm(TestX(:,i),1) + norm(TrainX(:,j),1)); % 相差性函数
       %  theDist = - abs(TestX(:,i))'*abs(TrainX(:,j))  / (norm(TestX(:,i),2)^2 + norm(TrainX(:,j),2)^2); % 匹配程度
    end
    
    % 按某种图像和图像集之间的距离的定义选取最近的
    
    % --------------------------------------------------------------
    % 修正Hausdorff距离: 测试样本与某类的所有训练样本的 距离的平均
    % 和DistClass(i)类样本的距离为Dist(i)
    %[Dist,DistClass]= MeanClass(theDist,TrainClass);
    
    % 最近邻
    Dist = theDist;
    DistClass = TrainClass;
    % --------------------------------------------------------------

    % 选取最近的
    % 初始化为第一个训练样本
    for k=1:K
        TestClassReg(i,k) = DistClass(1);
        Distance(i,k) = Dist(1);
    end
    
    % 比较Dist的每一列(和每一类训练样本的距离)
    for (j=2:size(Dist,2))
        k = 1;
        while (k<=K && Dist(j)>Distance(i,k))
            k = k+1;
        end
        if (k <= K)
            TestClassReg(i,k) = DistClass(j);
            Distance(i,k) = Dist(j);
        end;
    end;
    
    % 最近邻分类 K 阶识别率
    for k=1:K
        if (TestClassReg(i,k)==TestClass(i))
            Success(i,k)=1;
            break;
        end
    end
    
%     % K-近邻分类 2 4 6 2 3 4 2 5 5
%     TestClassRegCount = ones(K,1);
%     for k=1:K
%         for kk=(k+1):K
%             if TestClassReg(i,k)==TestClassReg(i,kk)
%                 TestClassRegCount(k) = TestClassRegCount(k) + 1;
%             end
%         end
%     end
%     
%     maxK = 1;
%     maxCount = TestClassRegCount(1);    
%     for k=1:K
%         if TestClassRegCount(k) > maxCount
%             maxK = k;
%             maxCount = TestClassRegCount(k);
%         end
%     end
%     
%     TestClassRegK(i) = TestClassReg(i,maxK);
%     
%     % K-近邻分类识别率
%     if TestClassRegK(i) == TestClass(i)
%         SuccessK(i) = 1;
%     else
%         SuccessK(i) = 0;
%     end 
end

% 所用总时间
ClassifyTime = etime(clock,BTime);

⌨️ 快捷键说明

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