Java实现的KNN算法示例
本文实例讲述了Java实现的KNN算法。分享给大家供大家参考,具体如下:
提起KNN算法大家应该都不会陌生,对于数据挖掘来说算是十大经典算法之一。
算法的思想是:对于训练数据集中已经归类的分组,来对于未知的数据进行分组归类。其中是根据该未知点与其训练数据中的点计算距离,求出距离最短的点,并将其归入该点的那一类。
看看算法的工程吧:
1.准备数据,对数据进行预处理
2.选用合适的数据结构存储训练数据和测试元组
3.设定参数,如k
4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列
5.遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L与优先级队列中的最大距离Lmax
6.进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L7.遍历完毕,计算优先级队列中k个元组的多数类,并将其作为测试元组的类别。
8.测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k值。
根据算法的过程我们进行java语言实现:
packageKNN; /** *点的坐标x、y *@authorAdministrator * */ publicclassPointBean{ intx; inty; publicintgetX(){ returnx; } publicvoidsetX(intx){ this.x=x; } publicintgetY(){ returny; } publicvoidsetY(inty){ this.y=y; } publicPointBean(intx,inty){ super(); this.x=x; this.y=y; } publicPointBean(){ super(); } @Override publicStringtoString(){ return"PointBean[x="+x+",y="+y+"]"; } }
KNN算法
packageKNN; importjava.util.ArrayList; /** *KNN实现的方法 *@authorAdministrator * */ publicclassKnnMain{ publicdoublegetPointLength(ArrayListlist,PointBeanbb){ intb_x=bb.getX(); intb_y=bb.getY(); doubletemp=(b_x-list.get(0).getX())*(b_x-list.get(0).getX())+ (b_y-list.get(0).getY())*(b_y-list.get(0).getY()); //找出最小的距离 for(inti=1;i list1,ArrayList list2, ArrayList list3,PointBeanbb){ doubleA=getPointLength(list1,bb); doubleB=getPointLength(list2,bb); doubleC=getPointLength(list3,bb); //做出比较 if(A>B){ if(B>C){ System.out.println("这个点:"+bb.getX()+","+bb.getY()+""+"属于C"); }else{ System.out.println("这个点:"+bb.getX()+","+bb.getY()+""+"属于B"); } }else{ if(A>C){ System.out.println("这个点:"+bb.getX()+","+bb.getY()+""+"属于C"); }else{ System.out.println("这个点:"+bb.getX()+","+bb.getY()+""+"属于A"); } } } }
主函数
packageKNN; importjava.util.ArrayList; /* *主函数KNN */ publicclassTestJava{ staticArrayListlistA; staticArrayList listB; staticArrayList listC; staticArrayList listD; publicstaticvoidmain(String[]args){ //创佳Arraylist listA=newArrayList (); listB=newArrayList (); listC=newArrayList (); listD=newArrayList (); //写入数据 setDate(); getTestResult(); } /** *得到结果 */ privatestaticvoidgetTestResult(){ //创建对象 KnnMainkm=newKnnMain(); for(inti=0;i 测试的结果:
这个点:3,1属于A
这个点:3,5属于B
这个点:0,0属于A
这个点:5,1属于C到此简单的KNN算法已经实现对于未知点的划分,有助于大家对于KNN算法的理解。对于改进KNN的一些算法JAVA实现会在后面进行贴出。共同学习共同进步!
更多关于java算法相关内容感兴趣的读者可查看本站专题:《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总》
希望本文所述对大家java程序设计有所帮助。