模式识别中K均值与最近邻法matlab实现.docx

上传人:b****5 文档编号:11676954 上传时间:2023-03-30 格式:DOCX 页数:8 大小:17.31KB
下载 相关 举报
模式识别中K均值与最近邻法matlab实现.docx_第1页
第1页 / 共8页
模式识别中K均值与最近邻法matlab实现.docx_第2页
第2页 / 共8页
模式识别中K均值与最近邻法matlab实现.docx_第3页
第3页 / 共8页
模式识别中K均值与最近邻法matlab实现.docx_第4页
第4页 / 共8页
模式识别中K均值与最近邻法matlab实现.docx_第5页
第5页 / 共8页
点击查看更多>>
下载资源
资源描述

模式识别中K均值与最近邻法matlab实现.docx

《模式识别中K均值与最近邻法matlab实现.docx》由会员分享,可在线阅读,更多相关《模式识别中K均值与最近邻法matlab实现.docx(8页珍藏版)》请在冰豆网上搜索。

模式识别中K均值与最近邻法matlab实现.docx

模式识别中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数据库。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工作范文 > 演讲主持

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1