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;ilist1,ArrayListlist2,
ArrayListlist3,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;
staticArrayListlistB;
staticArrayListlistC;
staticArrayListlistD;
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程序设计有所帮助。