K近邻分类数据模拟和实例分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

K近邻分类数据模拟和实例分析

3.1 数据模拟

用MATLAB随机生成150组数据,类别为三类,编程如下

# 程序1:

A1=rand(50,2);

hold on

plot(A1(:,1),A1(:,2),'.')

A2=rand(50,2)+0.75;

hold on

plot(A2(:,1),A2(:,2),'.')

hold on

A3=rand(50,2)+1.5;

plot(A3(:,1),A3(:,2),'.')

再用k近邻分类算法对这150组数据进行分类,取k=15近邻,程序如下# 程序 2:

clear all

clc

y=importdata('C:\Users\adm\Desktop\test.txt');

p=y(:,2:3);

p=p';

Add=zeros(150,1);

Add(1:50,:)=ones(50,1);

Add(51:100,:)=2*ones(50,1);

Add(101:150,:)=3*ones(50,1);

figure(1),plot(y(:,1),Add,'g.');

hold on

grid on;

count=0;

for i=1:3

for j=1:50

for k=1:150

distance(k)=mse(p(:,k)-p(:,(i-1)*50+j));%保存每个向量与所有训练样本之间的距离

end

[d1 index1]=sort(distance);%对距离distance向量进行从小到大的排序

num=[0 0 0];

for m=1:20 % 考察num,存放的是排序后distance前20个属于每一类别的个数

if index1(m)<=50

num(1)=num(1)+1;

elseif index1(m)<=100

num(2)=num(2)+1;

else

num(3)=num(3)+1;

end

end

[d2 class]=max(num);%属于哪类的个数最多,就属于哪类,class 即就是该向量所属的类别

if i==class

count=count+1;

end

A((i-1)*50+j)=class;%存放判断的结果

end

end

count

rate=count/150

figure(2),plot(y(:,1),A,'r.');grid on;%画图分类

程序运行后得到

count =143 rate =0.9533

图一模拟数据原始分类

图2 K近邻方法得到的分类

实验结果分析

从图像和运行结果均可以看出,对上述模拟数据用取k=15的k近邻算法作

出的分类正确率为95.33%,分类效果不错,符合预期。

改变k值,分别取k=1,5,10,15,20,30,40,60做测试,发现k取1的取值对分类结果没有明显的规律,当k=1时,即为最近邻的特殊情况,此时分类和原分类吻合,当k从1开始逐渐增大时,分类效果呈现起伏,这说明k值得选取对分类结果有一定的影响,程序执行如下表。

表2 Iris数据集分类效果

K值正确率错误

1 1 0

5 96% 4%

10 94.67% 5.33%

15 95.33% 4.67%

20 96.67% 3.33%

30 96% 4%

40 95.33% 4.67%

60 94.67% 5.33%

3.2 实例分析

本文选取了著名的Iris数据集,Iris数据集共150组,有四个特征,分别是花萼和花瓣的长度和宽度,类别也是三类,取k=20,对前文程序代码稍作修改如下。

# 程序 3:

clear all

clc

y=importdata('C:\Users\adm\Desktop\test.txt');

p=y(:,2:5);

p=p';

Add=zeros(150,1);

Add(1:50,:)=ones(50,1);

Add(51:100,:)=2*ones(50,1);

Add(101:150,:)=3*ones(50,1);

figure(1),plot(y(:,1),Add,'g.');

hold on

grid on;

count=0;

for i=1:3

for j=1:50

for k=1:150

distance(k)=mse(p(:,k)-p(:,(i-1)*50+j));%保存每个向量与所有训练样本之间的距离

end

[d1 index1]=sort(distance);%对距离distance向量进行从小到大的排序

num=[0 0 0];

for m=1:20 % 考察num,存放的是排序后distance前20个属于每一类别的个数

if index1(m)<=50

num(1)=num(1)+1;

elseif index1(m)<=100

num(2)=num(2)+1;

else

num(3)=num(3)+1;

end

end

[d2 class]=max(num);% 属于哪类的个数最多,就属于哪类,class 即就是该向量所属的类别

if i==class

count=count+1;

end

A((i-1)*50+j)=class;%存放判断的结果

end

end

count

rate=count/150

figure(2),plot(y(:,1),A,'r.');grid on;%画图分类

程序执行后得到以下结果:

count =147 rate =0.9800

相关文档
最新文档