KNN分类算法及MATLAB程序与结果

KNN 分类算法及MATLAB 程序与结果
太阳能恒温器KNN 算法的决策过程
K 邻近算法
  k-Nearest Neighbor algorithm
  右图中,绿⾊圆要被决定赋予哪个类,是红⾊三⾓形还是蓝⾊四⽅形?如果K=3,由于红⾊三⾓形所占⽐例
为2/3,绿⾊圆将被赋予红⾊三⾓形那个类,如果K=5,由于蓝⾊四⽅形⽐例为3/5,因此绿⾊圆被赋予蓝⾊四⽅
形类。
  K 最近邻(k-Nearest Neighbor ,KNN)分类算法,是⼀个理论上⽐较成熟的⽅法,也是最简单的算法之⼀。该
⽅法的思路是:如果⼀个样本在特征空间中的k 个最相 似(即特征空间中最邻近)的样本中的⼤多数属于某⼀个类
别,则该样本也属于这个类别。KNN 算法中,所选择的邻居都是已经正确分类的对象。该⽅法在定类决 策上只
依据最邻近的⼀个或者⼏个样本的类别来决定待分样本所属的类别。 KNN ⽅法虽然从原理上也依赖于极限定
理,但在类别决策时,只与极少量的相邻样本有关。由于KNN ⽅法主要靠周围有限的邻近的样本,⽽不是靠判别
类域的⽅ 法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN ⽅法较其他⽅法更为
适合。
  KNN 算法不仅可以⽤于分类,还可以⽤于回归。通过出⼀个样本的k 个最近邻居,将这些邻居的属性的平
均值赋给该样本,就可以得到该样本的属性。更有⽤的⽅法是将不同距离的邻居对该样本产⽣的影响给予不同的
权值(weight),如权值与距离成正⽐。
  该算法在分类时有个主要的不⾜是,当样本不平衡时,如⼀个类的样本容量很⼤,⽽其他类样本容量 很⼩
时,有可能导致当输⼊⼀个新样本时,该样本的K 个邻居中⼤容量类的样本占多数。因此可以采⽤权值的⽅法
(和该样本距离⼩的邻居权值⼤)来改进。该⽅法 的另⼀个不⾜之处是计算量较⼤,因为对每⼀个待分类的⽂本农产品干燥机
都要计算它到全体已知样本的距离,才能求得它的K 个最近邻点。⽬前常⽤的解决⽅法是事先对已知样 本点进⾏
剪辑,事先去除对分类作⽤不⼤的样本。该算法⽐较适⽤于样本容量⽐较⼤的类域的⾃动分类,⽽那些样本容量
较⼩的类域采⽤这种算法⽐较容易产⽣误 分。
小型地源热泵相⽐于之前介绍的SVM 及BP 算法,KNN 算法思想⽐较简单,它没有训练出模板model ,然后利⽤model 进⾏测试的过程,⽽是直接就是训练,利⽤已知的有标记的样本,进来⼀个样本就计算它与这些已知样本的距离,然后对这些距离中挑K 个最⼩的进⾏投票,看K 个最接近的样本中哪⼀个样本所
占的个数多,就判断为哪⼀类。
前⾯也提到了KNN 算法的⼀个当样本不平衡时,如⼀个类的样本容量很⼤,⽽其他类样本容量 很⼩时,有可能导致当输⼊⼀个新样本时,该样本的K 个邻居中⼤容量类的样本占多数,为此我觉得可以在每类中随机抽取相同的样本数进⾏重组成新的样本,然后再进⾏KNN 算法,记为改进⽅法1,或者调节距离的权重,距离越⼩的投票时的权重值就越⼤,记为改进⽅法2。下⾯是KNN 算法的MATLAB 代码,及没有⽤随机抽样的⽅法进⾏的试验结果(三类数据分别为150 50
50),和改进⽅法1,及改进⽅法2的结果对⽐。未改进的结果,由于其中⼀类样本是150个,其他两类是50,所以数据有偏斜,结果为:
整体分类精度为:0.90476
类别1的分类精度为:0.94118
类别2的分类精度为:0.58824
类别3的分类精度为:1
改进⽅法⼀,随机抽样组成新的样本,新样本中,各类的样本数相同。结果为:
整体分类精度为:0.94048
类别1的分类精度为:0.94118
类别2的分类精度为:0.76471
类别3的分类精度为:1
改进⽅法⼆,增⼤最⼩距离的投票权重,当然也可能是我的权重选的不合适,结果为:
整体分类精度为:0.90476
类别1的分类精度为:0.94118
类别2的分类精度为:0.58824隐私保护通话
类别3的分类精度为:1
可见和没加权重的未改进结果相同,当然我也试过好多数值,如果不当,精度还会下降。
把改进⽅法⼀和改进⽅法⼆相结合的结果:
整体分类精度为:0.90476
类别1的分类精度为:0.94118
类别2的分类精度为:0.76471
类别3的分类精度为:0.94
只是类别三的精度相对于改进⽅法⼀有所下降,所以看来还是样本数据的分均匀程度对分类的结果影响⽐较⼤。
下⾯是程序的源代码:
close all;
clc;
load D:\硕⼠学习资料3\硕⼠毕设资料\区域⽣长等分割算法程序\遗传分割\MYGAseg\特征选择\traindata.mat load D:\硕⼠学习资料3\硕⼠毕设资料\区域⽣长等分割算法程序\遗传分割\MYGAseg\特征选择\testdata.mat load D:\硕⼠学习资料3\硕⼠毕设资料\区域⽣长等分割算法程序\遗传分割\MYGA
seg\特征选择\trainlabel.mat load D:\硕⼠学习资料3\硕⼠毕设资料\区域⽣长等分割算法程序\遗传分割\MYGAseg\特征选择\testlabel.mat  traindata=traindata(1:99,:);
trainlabel=trainlabel(1:99,1);
[predictlabel,acc]=myKNN(traindata,trainlabel,testdata,testlabel,15);
function [predictlabel,acc]=myKNN(traindata,trainlabel,testdata,testlabel,K)
[mtrain,ntrain]=size(traindata);
[mtest,ntest]=size(testdata);
juli=zeros(mtest,mtrain);%每⼀⾏存储的是⼀个样本与所有训练样本的距离
sortjuli=zeros(mtest,mtrain);
zuobiaojuli=zeros(1,mtest);
num1=0;
num2=0;
num3=0;
rightnum=0;%记录整体分类正确的个数
rightnum1=0;
rightnum2=0;
rightnum3=0;
for i=1:mtest
for j=1:mtrain
juli(i,j)=sqrt((sum(testdata(i,:)-traindata(j,:)).^2));%计算每个测试样本与每个训练样本的oushi距离
粘扣end
end
for i=1:mtest
[ sortjuli,zuobiaojuli]=sort(juli(i,:));%sort函数默认返回的是由⼩到⼤的排序结果
sorttrainlabel=trainlabel(zuobiaojuli);%标签也相应的改变顺序
ksortjuli(1,:)=sortjuli(1,1:K);%取距离和坐标的前k个
ksorttrainlabel=sorttrainlabel(1:K,1);
for j=1:K%统计前K个结果中那个的数⽬多
if j==1%如果是排在第⼀位的,也就是距离最⼩的,那么投票权重加⼤4
if  ksorttrainlabel(j,1)==1
num1=num1+5;
end
if  ksorttrainlabel(j,1)==2
num2=num2+5;
end
if  ksorttrainlabel(j,1)==3
num3=num3+5;
end
elseif j==2%排在第⼆位的权重加⼤2,当然也可以⾃⾏改变
if  ksorttrainlabel(j,1)==1
num1=num1+2;
end
if  ksorttrainlabel(j,1)==2
num2=num2+2;
end
if  ksorttrainlabel(j,1)==3
num3=num3+2;
end
if  ksorttrainlabel(j,1)==1
num1=num1+1;
end
if  ksorttrainlabel(j,1)==2
num2=num2+1;
end
if  ksorttrainlabel(j,1)==3
num3=num3+1;
end
end
end
A=[num1 num2 num3];
Xsort=sort(A);%按照从⼩到⼤排序
if Xsort(1,end)==num1
predictlabel(i,1)=1;
elseif Xsort(1,end)==num2
predictlabel(i,1)=2;羽毛球发球机
elseif Xsort(1,end)==num3
predictlabel(i,1)=3;
end
if predictlabel(i,1)==testlabel(i,1)
rightnum=rightnum+1;
end
if predictlabel(i,1)==testlabel(i,1)&&testlabel(i,1)==1            rightnum1=rightnum1+1;
end
if predictlabel(i,1)==testlabel(i,1)&&testlabel(i,1)==2            rightnum2=rightnum2+1;
end
if predictlabel(i,1)==testlabel(i,1)&&testlabel(i,1)==3            rightnum3=rightnum3+1;
end
num1=0;%清0
num2=0;
num3=0;
end
leibie1=size(find(testlabel==1),1);%出测试样本1的个数leibie2=size(find(testlabel==2),1);
leibie3=size(find(testlabel==3),1);
acc1=rightnum1/leibie1;
acc2=rightnum2/leibie2;
acc3=rightnum3/leibie3;
acc=rightnum/mtest;%总体分类精度
disp(['整体分类精度为:',num2str(acc)]);
disp(['类别1的分类精度为:',num2str(acc1)]);
disp(['类别2的分类精度为:',num2str(acc2)]);
disp(['类别3的分类精度为:',num2str(acc3)]);
K最邻近密度估计技术是⼀种分类⽅法,不是聚类⽅法。
不是最优⽅法,实践中⽐较流⾏。
通俗但不⼀定易懂的规则是:
1.计算待分类数据和不同类中每⼀个数据的距离(欧⽒或马⽒)。
2.选出最⼩的前K数据个距离,这⾥⽤到选择排序法。
3.对⽐这前K个距离,出K个数据中包含最多的是那个类的数据,即为待分类数据所在的类。
不通俗但严谨的规则是:
给定⼀个位置特征向量x和⼀种距离测量⽅法,于是有:
1.在N个训练向量外,不考虑类的标签来确定k邻近。在两类的情况下,k选为奇数,⼀般不是类M的倍数。
2.在K个样本之外,确定属于wi,i=1,2,...M类的向量的个数ki,显然sum(ki)=k。
3.x属于样本最⼤值ki的那⼀类wi。

本文发布于:2024-09-22 03:33:20,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/97973.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:样本   分类   距离   精度
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议