最小距离分类器
1. 理论基础
最小距离分类又称最近邻分类,是一种非常简单的分类思想。这种基于匹配的分类技术通过以一种原型模式向童代表每一个类别,识别时一个未知模式被赋予一个按照预先定义的相似性度量与其距离最近的类别,常用的距离度量有欧氏距离,马氏距离等。下面我们以欧氏距离为例讲解最小距离分类器。
一种简单的做法是把每个类所有样本的平均向量作为代表该类的原型,则第i 类样本的代表向置为:
其中, Ni 为第i 样本的数目, wi 表示第i 类样本的集合,总类别数为W。
当需要对一个未知模式x 进行分类时,只需分别计算x 与各个mi(i=1,2.,…,W) 的距离然后将它分配给距离最近的代表向量所代表的类别。
对于欧氏距离表示的x 与各个m1 的距离:
其中,
,表示欧几里的范数,即向量的模。我们在W 个Di (x)
中找到最小的一个,不妨设为Di(x) ,则x 属于第j
%最小距离分类器,交互式选取图像样本分类数据,进行最小距离分类(实现欧式距离,马氏距离,计程距离)
function re=mindis()
[filename,pathname]=uigetfile({'*.jpg;*.bmp;*.tif;*.png;*.gif','All Image Files';'*.*','All Files'});%动态打开文件
image = imread([pathname,filename]);%读取
figure(1);imshow(image);
image=double(image);
[m,n,bands]=size(image);
k=input('请输入要分类的个数: ');%输入要选取的样本类别数
aver=zeros(k,bands);%申请矩阵空间存储样本数据各类别各波段均值
%对所选取样本数据进行处理求得各类别均值
for i=1:k%对选中类别循环
str=['请在屏幕图像上选择第',num2str(i),'种分类样本,选择完毕请回车确定'];
disp(str);
[y,x]=getpts;%从图像上获取数据点
A=[round(y),round(x)];
for band=1:bands%对图像每个波段进行计算,求取指定类别每个波段均值
Sum=0;
for count=1:size(A,1)%对取得点循环
temp=image(:,:,band);
Sum=Sum+temp(A(count,2),A(count,1));
end
aver(i,band)=Sum/size(A,1);%求均值
end
end
image=reshape(image,m*n,bands);%将图像数据重塑成为一列为一个波段数据的形式,便于计算
dis=zeros(k,m*n);%申请矩阵空间存储每个类别图像各个点数据分别到各波段均值的距离的和
type=input('请输入要选择的分类类型: 1.欧式距离 2.马氏距离 3.计程距离 : ');
switch type%分别代入不同公式
case 1
%对每个类别进行循环,求出各个类别的距离,后面进行比较
for t=1:k
tem=image-aver(t,:);%图像数据与样本每个类别每个波段均值分别求差值
dis(t,:)=sqrt(sum((tem.*tem).')); %和的平方根
end
case 2
%申请矩阵存储样本数据均值协方差
T=zeros(bands,bands,k);
for t=1:k
T(:,:,t)=cov(aver);%求取协方差
tem=image-aver(t,:);
dis(t,:)=sqrt(sum((tem*T(:,:,t).*tem).')); %同上
end
case 3
for t=1:k
tem=image-aver(t,:);
dis(t,:)=sum(abs(tem.'));%绝对值之和
end
end
[~,index]=min(dis);%求各距离最小值
index=reshape(index,m,n);%重塑回原图像排列
re=index/k;%给各类别赋值指定灰度值便于区分,也可赋值其他
figure(2),imshow((re));%显示
end
参数输入主要通过命令窗口:
运行截图:
选取样本过程:(图中是选取第三类样本,每个类别样本个数不固定,可以根据需要选取。如第一类可以选三个,第二类可以选10个,等等)。
欧式距离分类结果:
马氏距离分类结果:
计程距离分类结果: