K近邻分类数据模拟和实例分析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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