模式识别中K均值与最近邻法matlab实现.docx
《模式识别中K均值与最近邻法matlab实现.docx》由会员分享,可在线阅读,更多相关《模式识别中K均值与最近邻法matlab实现.docx(8页珍藏版)》请在冰豆网上搜索。
模式识别中K均值与最近邻法matlab实现
模式识别算法实现
——K近邻法&最近邻法
一.程序<用MATLAB做的>
1.用Iris数据集验证的程序
(1)用Iris数据集验证的M文件:
loadiris.mat;
A=randperm(50);B=randperm(50);C=randperm(50);
a1=A(1,1:
25);
a2=A(1,26:
50);
a=Iris(a1,1:
4);%%随机取第一类数据的25组
aa=Iris(a2,1:
4);
b1=50*ones(1,25)+B(1,1:
25);
b2=50*ones(1,25)+B(1,26:
50);
b=Iris(b1,1:
4);%%随机取第二类数据的25组
bb=Iris(b2,1:
4);
c1=100*ones(1,25)+C(1,1:
25);
c2=100*ones(1,25)+C(1,26:
50);
c=Iris(c1,1:
4);%%随机取第三类数据的25组
cc=Iris(c2,1:
4);
train_sample=cat(1,a,b,c);%拼接成包含75组数据的样本集
test_sample=cat(1,aa,bb,cc);
k=7;%7近邻法
cha=zeros(1,75);
sum1=0;sum2=0;sum3=0;
sum=0;
[i,j]=size(train_sample);%i=75,j=4
[u,v]=size(test_sample);%u=75,v=4
forx=1:
u
fory=1:
i
result=sqrt((test_sample(x,1)-train_sample(y,1))^2+(test_sample(x,2)-train_sample(y,2))^2+(test_sample(x,3)-train_sample(y,3))^2+(test_sample(x,4)-train_sample(y,4))^2);
cha(1,y)=result;
end;
[z,Ind]=sort(cha);%Ind用来存储排序前在cha中的下标
m1=0;
m2=0;
m3=0;
forn=1:
k
ifInd(1,n)<=25
m1=m1+1;
elseifInd(1,n)>25&&Ind(1,n)<=50
m2=m2+1;
else
m3=m3+1;
end
end
ifm1>=m2&&m1>=m3
m=1;
elseifm2>=m1&&m2>=m3
m=2;
elseifm3>=m1&&m3>=m2
m=3;
end
if(x<=25&&m==1)
sum1=sum1+1;
elseif(x>25&&x<=50&&m==2)
sum2=sum2+1;
elseif(x>50&&x<=75&&m==3)
sum3=sum3+1;
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('第一类分类正确率为%4.2f',sum1/25));
disp(sprintf('第二类分类正确率为%4.2f',sum2/25));
disp(sprintf('第三类分类正确率为%4.2f',sum3/25));
disp(sprintf('总分类正确率为%4.2f',sum/75));
(2)验证结果:
a)K近邻法:
K=7实验结果
表1.
类别
次数
第一类
第二类
第三类
总识别率
1
1.00
0.96
1.00
0.99
2
1.00
0.92
0.96
0.96
3
1.00
0.84
0.96
0.93
4
1.00
0.92
0.92
0.95
5
1.00
0.88
0.96
0.95
6
1.00
0.96
1.00
0.99
7
1.00
0.96
0.96
0.97
8
1.00
0.96
0.92
0.96
9
1.00
0.96
1.00
0.99
10
1.00
0.92
0.88
0.93
总识别率
1.00
0.92
0.96
0.96
b)最近邻法(即令K=1)实验结果
表2.
类别
次数
第一类
第二类
第三类
总识别率
1
1.00
0.88
0.96
0.95
2
1.00
0.96
0.80
0.92
3
1.00
0.96
0.92
0.96
4
1.00
0.92
0.88
0.93
5
1.00
0.96
0.98
0.95
6
1.00
0.96
0.96
0.97
7
1.00
0.96
0.80
0.92
8
1.00
1.00
1.00
1.00
9
1.00
0.88
0.96
0.95
10
1.00
0.96
0.92
0.96
总识别率
1.00
0.94
0.92
0.95
(3)数据分析
第一个表格是用K(k=7)近邻法得到的识别率,第二个表格是用最近邻法得到的识别率,可以看出对于Iris数据,两种方法的识别率都达到了95%左右。
2.用Wine数据集验证的程序
(1)用Wine数据集验证的M文件:
loadwine.mat;
A=randperm(59);B=randperm(71);C=randperm(48);
a1=A(1,1:
30);
a2=A(1,31:
59);
a=wine(a1,1:
14);
aa=wine(a2,1:
14);
b1=59*ones(1,36)+B(1,1:
36);
b2=59*ones(1,35)+B(1,37:
71);
b=wine(b1,1:
14);
bb=wine(b2,1:
14);
c1=130*ones(1,24)+C(1,1:
24);
c2=130*ones(1,24)+C(1,25:
48);
c=wine(c1,1:
14);
cc=wine(c2,1:
14);
train_sample=cat(1,a,b,c);%拼接成样本集
test_sample=cat(1,aa,bb,cc);
k=7;%7近邻法
cha=zeros(1,90);
sum1=0;sum2=0;sum3=0;sum4=0;
sum=0;
[i,j]=size(train_sample);
[u,v]=size(test_sample);
forx=1:
u
fory=1:
i
result=sqrt((test_sample(x,2)-train_sample(y,2))^2+(test_sample(x,3)-train_sample(y,3))^2+(test_sample(x,4)-train_sample(y,4))^2+(test_sample(x,5)-train_sample(y,5))^2+(test_sample(x,6)-train_sample(y,6))^2+(test_sample(x,7)-train_sample(y,7))^2+(test_sample(x,8)-train_sample(y,8))^2+(test_sample(x,9)-train_sample(y,9))^2+(test_sample(x,10)-train_sample(y,10))^2+(test_sample(x,11)-train_sample(y,11))^2+(test_sample(x,12)-train_sample(y,12))^2+(test_sample(x,13)-train_sample(y,13))^2+(test_sample(x,14)-train_sample(y,14))^2);
cha(1,y)=result;
end;
[z,Ind]=sort(cha);%Ind用来存储排序前在cha中的下标
m1=0;
m2=0;
m3=0;
forn=1:
k
ifInd(1,n)<=30
m1=m1+1;
elseifInd(1,n)>30&&Ind(1,n)<=66
m2=m2+1;
else
m3=m3+1;
end
end
ifm1>=m2&&m1>=m3
m=1;
elseifm2>=m1&&m2>=m3
m=2;
elseifm3>=m1&&m3>=m2
m=3;
end
if(x<=29&&m==1)
sum1=sum1+1;
elseif(x>29&&x<=64&&m==2)
sum2=sum2+1;
elseif(x>64&&x<=88&&m==3)
sum3=sum3+1;
end
if(x<=29&&m==1)||(x>29&&x<=64&&m==2)||(x>64&&x<=88&&m==3)
sum=sum+1;
end
end
disp(sprintf('第一类分类正确率为%4.2f',sum1/30));
disp(sprintf('第二类分类正确率为%4.2f',sum2/36));
disp(sprintf('第三类分类正确率为%4.2f',sum3/24));
disp(sprintf('总分类正确率为%4.2f',sum/90));
(2)验证结果:
a).K近邻法:
K=7实验结果
表1.
类别
次数
第一类
第二类
第三类
总识别率
1
0.90
0.69
0.38
0.68
2
0.97
0.69
0.42
0.71
3
0.90
0.67
0.50
0.70
4
0.77
0.56
0.67
0.66
5
0.87
0.61
0.46
0.66
6
0.70
0.44
0.67
0.59
7
0.97
0.72
0.54
0.76
8
0.80
0.67
0.54
0.68
9
0.93
0.58
0.58
0.70
10
0.87
0.50
0.79
0.70
总识别率
0.87
0.61
0.56
0.68
b).最近邻法(即令K=1)实验结果
表2.
类别
次数
第一类
第二类
第三类
总识别率
1
0.77
0.75
0.67
0.73
2
0.80
0.67
0.63
0.70
3
0.83
0.67
0.63
0.71
4
0.77
0.64
0.63
0.68
5
0.88
0.64
0.58
0.68
6
0.83
0.69
0.50
0.69
7
0.80
0.64
0.58
0.68
8
0.80
0.78
0.54
0.72
9
0.87
0.64
0.67
0.72
10
0.70
0.67
0.42
0.61
总识别率
0.81
0.68
0.59
0.69
(3)数据分析
这两个是对Wine数据的识别率,第一个表格是用K(k=7)近邻法得到的识别率,第二个表格是用最近邻法得到的识别率,可以看出对于Wine数据,两种方法的识别率只达到了68%~69%左右。
3.大作业收获
通过这次的大作业,我学会了用MATLAB,感觉这个软件比C好多了。
而且有一个很重要的收获,我自己刚开始写的没有随机取数的功能,后来,和同学聊了聊,才结识了randperm函数,感觉很有帮助。
而且,对于.m文件和.mat文件的调用,也更加熟悉了。
认识了UCI数据库。