2024年KNN算法实验报告_第1页
2024年KNN算法实验报告_第2页
2024年KNN算法实验报告_第3页
2024年KNN算法实验报告_第4页
2024年KNN算法实验报告_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

KNN算法试验汇报一试验原理K近来邻(k-NearestNeighbor,KNN)分类算法,是一种理论上比较成熟的措施,也是最简朴的机器學习算法之一。该措施的思绪是:假如一种样本在特性空间中的k個最相似(即特性空间中最邻近)的样本中的大多数属于某一种类别,则该样本也属于這個类别。KNN算法中,所选择的邻居都是已經對的分类的對象。该措施在定类决策上只根据最邻近的一种或者几种样本的类别来决定待分样本所属的类别。KNN措施虽然從原理上也依赖于极限定理,但在类别决策時,只与很少許的相邻样本有关。由于KNN措施重要靠周围有限的邻近的样本,而不是靠鉴别类域的措施来确定所属类别的,因此對于类域的交叉或重叠较多的待分样本集来說,KNN措施较其他措施更為适合。KNN算法不仅可以用于分类,還可以用于回归。通過找出一种样本的k個近来邻居,将這些邻居的属性的平均值赋給该样本,就可以得到该样本的属性。更有用的措施是将不一样距离的邻居對该样本产生的影响予以不一样的权值(weight),如权值与距离成正比。该算法在分类時有個重要的局限性是,當样本不平衡時,如一种类的样本容量很大,而其他类样本容量很小時,有也許导致當输入一种新样本時,该样本的K個邻居中大容量类的样本占多数。该算法只计算“近来的”邻居样本,某一类的样本数量很大,那么或者此类样本并不靠近目的样本,或者此类样本很靠近目的样本。無论怎样,数量并不能影响运行成果。可以采用权值的措施(和该样本距离小的邻居权值大)来改善。该措施的另一种局限性之处是计算量较大,由于對每一种待分类的文本都要计算它到全体已知样本的距离,才能求得它的K個近来邻點。目前常用的处理措施是事先對已知样本點進行剪辑,事先清除對分类作用不大的样本。该算法比较合用于样本容量比较大的类域的自動分类,而那些样本容量较小的类域采用這种算法比较轻易产生误分。二试验环节那么根据以上的描述,我把結合使用反余弦匹配和kNN結合的過程提成如下几种环节:1.计算出样本数据和待分类数据的距离2.為待分类数据选择k個与其距离最小的样本3.记录出k個样本中大多数样本所属的分类4.這個分类就是待分类数据所属的分类数學体現:目的函数值可以是离散值(分类問題),也可以是持续值(回归問題).函数形势為f:n维空间R—〉一维空间R。第一步:将数据集分為训练集(DTrn)和测试集(DTES)。第二步:在测试集給定一种实例Xq;在训练集(DTrn)中找到与這個实例Xq的K-近来邻子集{X1、、、、XK},即:DKNN。第三步:计算這K-近来邻子集得目的值,通過加权平均:^f(Xq)=(f(X1)+...+f(XK))/k作為f(Xq)的近似估计。改善的地方:對kNN算法的一种明显的改善是對k個近来邻的奉献加权,将较大的权值赋給较近的近邻,對应的算法称為距离加权kNN回归算法,则公式1则修改為:^f(Xq)=(w1*f(X1)+...+wk*f(XK))/(w1+...wk)一般地距离权值wi和距离成反比关系,例如,wi近似=1/d(xq;xi).K值的选择:需要消除K值過低,预测目的轻易产生变動性,同步高k值時,预测目的有過平滑現象。推定k值的有益途径是通過有效参数的数目這個概念。有效参数的数目是和k值有关的,大体等于n/k,其中,n是這個训练数据集中实例的数目。缺陷:(1)在大训练集寻找近来邻的時间是难以忍受的。(2)在训练数据集中规定的观测值的数目,伴随维数p的增長以指数方式增長。這是由于和近来邻的期望距离伴随维数p的增多而急剧上升,除非训练数据集的大小伴随p以指数方式增長。這种現象被称為“维数劫难”。处理措施有下面几种:(1)通過降维技术来減少维数,如主成分分析,因子分析,变量选择(因子选择)從而減少计算距离的時间;(2)用复杂的数据构造,如搜索树去加速近来邻确实定。這個措施常常通過公式2公式1设定“几乎是近来邻”的目的去提高搜索速度;(3)编辑训练数据去減少在训练集中的冗余和几乎是冗余的點,從而加速搜索近来邻。在個别例子中去掉在训练数据集中的某些观测點,對分类效果没有影响,原因是這些點被包围属于同类的观测點中。三注意事项KNN算法的实現要注意:1.用TreeMap<String,TreeMap<String,Double>>保留测试集和训练集。2.注意要以"类目_文献名"作為每個文献的key,才能防止同名不一样内容的文献出現。3.注意设置JM参数,否则會出現JAVAheap溢出錯误。4.本程序用向量夹角余弦计算相似度。四代码//KNN.javapackagecqu.KNN;importjava.util.ArrayList;importjava.util.Comparator;importjava.util.HashMap;importjava.util.List;importjava.util.Map;importjava.util.PriorityQueue;//KNN算法主体类publicclassKNN{/***设置优先级队列的比较函数,距离越大,优先级越高*/privateComparator<KNNNode>comparator=newComparator<KNNNode>(){publicintcompare(KNNNodeo1,KNNNodeo2){if(o1.getDistance()>=o2.getDistance()){ return-1;}else{ return1;}}};/***获取K個不一样的随机数*@paramk随机数的個数*@parammax随机数最大的范围*@return生成的随机数数组*/publicList<Integer>getRandKNum(intk,intmax){List<Integer>rand=newArrayList<Integer>(k);for(inti=0;i<k;i++){inttemp=(int)(Math.random()*max);if(!rand.contains(temp)){rand.add(temp);}else{i--;}}returnrand;}/***计算测试元组与训练元组之前的距离*@paramd1测试元组*@paramd2训练元组*@return距离值*/publicdoublecalDistance(List<Double>d1,List<Double>d2){doubledistance=0.00;for(inti=0;i<d1.size();i++){distance+=(d1.get(i)-d2.get(i))*(d1.get(i)-d2.get(i));}returndistance;}/***执行KNN算法,获取测试元组的类别*@paramdatas训练数据集*@paramtestData测试元组*@paramk设定的K值*@return测试元组的类别*/publicStringknn(List<List<Double>>datas,List<Double>testData,intk){PriorityQueue<KNNNode>pq=newPriorityQueue<KNNNode>(k,comparator);List<Integer>randNum=getRandKNum(k,datas.size());for(inti=0;i<k;i++){intindex=randNum.get(i);List<Double>currData=datas.get(index);Stringc=currData.get(currData.size()-1).toString();KNNNodenode=newKNNNode(index,calDistance(testData,currData),c);pq.add(node);}for(inti=0;i<datas.size();i++){List<Double>t=datas.get(i);doubledistance=calDistance(testData,t);KNNNodetop=pq.peek();if(top.getDistance()>distance){pq.remove();pq.add(newKNNNode(i,distance,t.get(t.size()-1).toString()));}}returngetMostClass(pq);}/***获取所得到的k個近来邻元组的多数类*@parampq存储k個近来近邻元组的优先级队列*@return多数类的名称*/privateStringgetMostClass(PriorityQueue<KNNNode>pq){Map<String,Integer>classCount=newHashMap<String,Integer>();intpqsize=pq.size();for(inti=0;i<pqsize;i++){KNNNodenode=pq.remove();Stringc=node.getC();if(classCount.containsKey(c)){classCount.put(c,classCount.get(c)+1);}else{classCount.put(c,1);}}intmaxIndex=-1;intmaxCount=0;Object[]classes=classCount.keySet().toArray();for(inti=0;i<classes.length;i++){if(classCount.get(classes[i])>maxCount){maxIndex=i;maxCount=classCount.get(classes[i]);}}returnclasses[maxIndex].toString();}}//KNNNode.javapackagecqu.KNN;publicclassKNNNode{privateintindex;//元组標号privatedoubledistance;//与测试元组的距离privateStringc;//所属类别publicKNNNode(intindex,doubledistance,Stringc){super();this.index=index;this.distance=distance;this.c=c;}publicintgetIndex(){returnindex;}publicvoidsetIndex(intindex){this.index=index;}publicdoublegetDistance(){returndistance;}publicvoidsetDistance(doubledistance){this.distance=distance;}publicStringgetC(){returnc;}publicvoidsetC(Stringc){this.c=c;}}//TestKNN.javapackagecqu.KNN;importjava.io.BufferedReader;importjava.io.File;importjava.io.FileReader;importjava.util.ArrayList;importjava.util.List;//KNN算法测试类publicclassTestKNN{/***從数据文献中讀取数据*@paramdatas存储数据的集合對象*@parampath数据文献的途径*/publicvoidread(List<List<Double>>datas,Stringpath){try{BufferedReaderbr=newBufferedReader(newFileReader(newFile(path)));Stringreader=br.readLine();while(reader!=null){Stringt[]=reader.split("");ArrayList<Double>list=newArrayList<Double>();for(inti=0;i<t.length;i++){list.add(Double.parseDouble(t[i]));}datas.add(list);reader=br.readLine();}}catch(Exceptione){e.printStackTrace();}}/***程序执行入口*@paramargs*/publicstaticvoidmain(String[]args){TestKNNt=newTestKNN();Stringdatafile=newFile("").getAbsolutePath()+File.separator+"cqudata\\datafile.txt";Stringtestfile=newFile("").getAbsolutePath()+File.separator+"cqudata\\testfile.txt";try{List<List<Double>>datas=newArrayList<List<Double>>();List<List<Double>>testDatas=newArrayList<List<Double>>();t.read(datas,datafile);t.read(testDatas,testfile);KNNknn=newKNN();for(inti=0;i<testDatas.size();i++){List<Double>test=testDatas.get(i);System.out.print("测试元组:");for(intj=0;j<test.size();j++){System.out.print(test.get(j)+"");}System.out.print("类别為:");System.out.println(Math.round(Float.parseFloat((knn.knn(datas,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论