当前位置:文档之家› K近邻分类数据模拟和实例分析

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

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
图3 原始数据的分类图像
图4 K近邻分类算法所得到的分类图像实验结果分析
上述程序运行后的结果表明k取20时对Iris数据集具有较好的分类效果,从某种意义上说,k近邻算法对花的分类可以给出一定的借鉴意义。

改变k值后,分别取k=4,6,8,10,12,14,16,18,20,22,24,30时,发现对于Iris 数据集k取8-22之间的值最为合适,分类正确率稳定,当k小于8或是大于22时,分类效果下降。

执行程序得到的结果如下表。

表2 分类正确率
K值正确率错误率
4 96% 4%
6 97.33% 2.67%
8 98% 2%
10 98% 2%
12 98% 2%
14 98% 2%
16 98% 2%
18 98% 2%
20 98% 2%
22 98% 2%
24 97.33% 2.67%
30 95.33% 4.67%。

相关主题