当前位置:文档之家› 模式识别最近邻法和k近邻法MATLAB实现

模式识别最近邻法和k近邻法MATLAB实现

模式识别最近邻法和k近邻法MATLAB实现
模式识别最近邻法和k近邻法MATLAB实现

学号:02105120 姓名:吴林一. 基本概念:

最近邻法:对于未知样本x,比较x与N个已知类别的样本之间的欧式距离,并决策x与距

离它最近的样本同类。

K近邻法:取未知样本x的k个近邻,看这k个近邻中多数属于哪一类,就把x归为哪一类。K取奇数,为了是避免k仁k2的情况。

二.问题分析:

要判别x属于哪一类,关键要求得与x最近的k个样本(当k=1时,即是最近邻法),然后

判别这k 个样本的多数属于哪一类。

可采用欧式距离公式求得两个样本间的距离s=sqrt (( X1-X2)A2+(y1-y2)A2 )

三.算法分析:

该算法中任取每类样本的一半作为训练样本,其余作为测试样本。例如iris 中取每类样本

的25 组作为训练样本,剩余25 组作为测试样本,依次求得与一测试样本x 距离最近的k 个样本,并判断k 个样本多数属于哪一类,则x 就属于哪类。测试10 次,取10 次分类正确率的平均值来

检验算法的性能。

四.M ATLAB弋码:

最近邻算实现对Iris 分类

clc;

totalsum=0;

for ii=1:10

data=load( '' );

data1=data(1:50,1:4); %任取Iris-setosa 数据的25 组

rbow1=randperm(50);

trainsample1=data1(rbow1(:,1:25),1:4);

rbow1(:,26:50)=sort(rbow1(:,26:50)); %剩余的25 组按行下标大小顺序排列

testsample1=data1(rbow1(:,26:50),1:4);

data2=data(51:100,1:4); %任取Iris-versicolor 数据的25 组

rbow2=randperm(50);

trainsample2=data2(rbow2(:,1:25),1:4); rbow2(:,26:50)=sort(rbow2(:,26:50));

testsample2=data2(rbow2(:,26:50),1:4);

data3=data(101:150,1:4); %任取Iris-virginica 数据的25 组

rbow3=randperm(50);

trainsample3=data3(rbow3(:,1:25),1:4); rbow3(:,26:50)=sort(rbow3(:,26:50));

testsample3=data3(rbow3(:,26:50),1:4);

trainsample=cat(1,trainsample1,trainsample2,trainsample3); %包含75 组数据的样本

testsample=cat(1,testsample1,testsample2,testsample3);

newchar=zeros(1,75);sum=0;

[i,j]=size(trainsample); %i=60,j=4

[u,v]=size(testsample); %u=90,v=4 for x=1:u

for y=1:i result=sqrt((testsample(x,1)-tra in sample(y,1))A2+(testsample(x,2)-tra in sample(y ,2))A2+(testsample(x,3)-trai nsample(y,3))A2+(testsample(x,4)-trai nsample(y,4))A

2); %欧式距离

newchar(1,y)=result;

end;

[new,Ind]=sort(newchar);

class1=0;

class2=0;

class3=0;

if Ind(1,1)<=25

class1=class1+1;

elseif Ind(1,1)>25&&Ind(1,1)<=50 class2=class2+1;

else

class3=class3+1;

end

if class1>class2&&class1>class3

m=1;

ty= 'Iris-setosa' ;

elseif class2>class1&&class2>class3

m=2;

ty= 'Iris-versicolor' ;

elseif class3>class1&&class3>class2

m=3;

ty= 'Iris-virginica' ;

else

m=0;

ty= 'none' ;

end

if x<=25&&m>0

disp(sprintf( '第%4组数据分类后为elseif x<=25&&m==0

disp(sprintf( '第%4组数据分类后为end

if x>25&&x<=50&&m>0

disp(sprintf( '第%4组数据分类后为elseif x>25&&x<=50&&m==0

disp(sprintf( '第%4组数据分类后为end

if x>50&&x<=75&&m>0

disp(sprintf( '第%4组数据分类后为elseif x>50&&x<=75&&m==0%$类',rbow1(:,x+25),ty));

%$类',rbow1(:,x+25), 'none')) %$类',50+rbow2(:,x),ty));

%$类',50+rbow2(:,x), 'none')) %$类',100+rbow3(:,x-25),ty));

disp(sprintf( '第%4组数据分类后为%$类’,100+rbow3(:,x-25), 'none'));

end

if (x<=25&&m==1)||(x>25&&x<=50&&m==2)||(x>50&&x<=75&&m==3) sum=sum+1;

end

end

disp(sprintf( '第%畝分类识别率为%',ii,sum/75));

totalsum=totalsum+(sum/75);

end

disp(sprintf( '10 次分类平均识别率为%',totalsum/10));

测试结果:

第 3 组数据分类后为第 5 组数据分类后为第 6 组数据分类后为第7 组数据分类后为第10组数据分类后为第11 组数据分类后为第12组数据分类后为第14 组数据分类后为第16 组数据分类后为第18 组数据分类后为第19 组数据分类后为第20 组数据分类后为第23 组数据分类后为第24 组数据分类后为第26 组数据分类后为第28 组数据分类后为第30 组数据分类后为第31 组数据分类后为第34 组数据分类后为第37 组数据分类后为第39 组数据分类后为第41 组数据分类后为第44 组数据分类后为第45 组数据分类后为第49 组数据分类后为第51 组数据分类后为Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-setosa 类

Iris-versicolor 类

Iris-第53 组数据分类后为第54 组

数据分类后为第55 组数据分类

后为第57 组数据分类后为第

58 组数据分类后为第59 组数据

分类后为第60 组数据分类后为

第61 组数据分类后为第62 组

数据分类后为第68 组数据分类

后为第70 组数据分类后为第

71 组数据分类后为第74 组数据

分类后为第75 组数据分类后为

第77 组数据分类后为第79 组

数据分类后为第80 组数据分类

后为第84 组数据分类后为第

85 组数据分类后为第92 组数据

分类后为第95 组数据分类后为

第97 组数据分类后为第98 组

数据分类后为第99 组数据分类

后为第102 组数据分类后为第

103 组数据分类后为第105 组数

据分类后为第106 组数据分类后

为第107 组数据分类后为第108

组数据分类后为第114 组数据分

类后为第118 组数据分类后为

第119 组数据分类后为第124

组数据分类后为第125 组数据分

类后为第126 组数据分类后为

第127 组数据分类后为第128

组数据分类后为第129 组数据分

类后为第130 组数据分类后为

第133 组数据分类后为第135

组数据分类后为第137 组数据分

类后为第138 组数据分类后为类类类类类类类类类类类类类类类类类

类类类类类类类类类类类

类类

类类类类类类类类类类类类类

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-virginica Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-virginica Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-

versicolor

Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-versicolor Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica Iris-virginica

第142 组数据分类后为第144 组数据分类后为第148 组数据分类后为第149 组数据分类后为第150 组数据分类后为■ ????、」/??Iris-virginica 类

■ ????、」/??Iris-virginica 类■ ????、」

/??

Iris-virginica 类■ ????、」

/??

Iris-virginica 类■ ????、」

/??

Iris-virginica 类

k 近邻法对wine 分类:

clc;

otalsum=0;

for ii=1:10 %循环测试10 次

data=load( '' ); %导入wine 数据data1=data(1:59,1:13); %任取第一类数据的30 组

rbow1=randperm(59);

trainsample1=data1(sort(rbow1(:,1:30)),1:13);

rbow1(:,31:59)=sort(rbow1(:,31:59)); %剩余的29 组按行下标大小顺序排列

testsample1=data1(rbow1(:,31:59),1:13);

data2=data(60:130,1:13); %任取第二类数据的35 组

rbow2=randperm(71);

trainsample2=data2(sort(rbow2(:,1:35)),1:13); rbow2(:,36:71)=sort(rbow2(:,36:71)); testsample2=data2(rbow2(:,36:71),1:13); data3=data(131:178,1:13); %任取第三类数据的24 组rbow3=randperm(48);

trainsample3=data3(sort(rbow3(:,1:24)),1:13); rbow3(:,25:48)=sort(rbow3(:,25:48)); testsample3=data3(rbow3(:,25:48),1:13);

train_sample=cat(1,trainsample1,trainsample2,trainsample3); %包含89 组数据的样本集

test_sample=cat(1,testsample1,testsample2,testsample3);

k=19; %19近邻法newchar=zeros(1,89);

sum=0;

[i,j]=size(train_sample); %i=89,j=13

[u,v]=size(test_sample); %u=89,v=13

for x=1:u

for y=1:i

相关主题
文本预览
相关文档 最新文档