📄 classify.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 + -