首页 > 开发 > Java > 正文

Java实现的KNN算法示例

2024-07-14 08:41:19
字体:
来源:转载
供稿:网友

本文实例讲述了Java实现的KNN算法。分享给大家供大家参考,具体如下:

提起KNN算法大家应该都不会陌生,对于数据挖掘来说算是十大经典算法之一。

算法的思想是:对于训练数据集中已经归类的分组,来对于未知的数据进行分组归类。其中是根据该未知点与其训练数据中的点计算距离,求出距离最短的点,并将其归入该点的那一类。

看看算法的工程吧:

1. 准备数据,对数据进行预处理
2. 选用合适的数据结构存储训练数据和测试元组
3. 设定参数,如k
4.维护一个大小为k的的按距离由大到小的优先级队列,用于存储最近邻训练元组。随机从训练元组中选取k个元组作为初始的最近邻元组,分别计算测试元组到这k个元组的距离,将训练元组标号和距离存入优先级队列
5. 遍历训练元组集,计算当前训练元组与测试元组的距离,将所得距离L 与优先级队列中的最大距离Lmax
6. 进行比较。若L>=Lmax,则舍弃该元组,遍历下一个元组。若L < Lmax,删除优先级队列中最大距离的元组,将当前训练元组存入优先级队                  列。
7. 遍历完毕,计算优先级队列中k 个元组的多数类,并将其作为测试元组的类别。
8. 测试元组集测试完毕后计算误差率,继续设定不同的k值重新进行训练,最后取误差率最小的k 值。

根据算法的过程我们进行java语言实现:

package KNN;/** * 点的坐标 x 、y * @author Administrator * */public class PointBean {int x;int y;public int getX() {  return x;}public void setX(int x) {  this.x = x;}public int getY() {  return y;}public void setY(int y) {  this.y = y;}public PointBean(int x, int y) {  super();  this.x = x;  this.y = y;}public PointBean() {  super();}@Overridepublic String toString() {  return "PointBean [x=" + x + ", y=" + y + "]";}}

KNN算法

package KNN;import java.util.ArrayList;/** * KNN实现的方法 * @author Administrator * */public class KnnMain {  public double getPointLength(ArrayList<PointBean> list,PointBean bb){    int b_x=bb.getX();    int b_y=bb.getY();    double temp=(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(int i=1;i<list.size();i++){      if(temp<((b_x -list.get(i).getX())*(b_x -list.get(i).getX())+          (b_y -list.get(i).getY())*(b_y -list.get(i).getY()))){        temp=(b_x -list.get(i).getX())*(b_x -list.get(i).getX())+            (b_y -list.get(i).getY())*(b_y -list.get(i).getY());      }    }    return Math.sqrt(temp);  }  /**   * 获取长度,找出最小的一个进行归类   * @param list1   * @param list2   * @param list3   * @param bb   */  public void getContent(ArrayList<PointBean> list1,ArrayList<PointBean> list2,      ArrayList<PointBean> list3,PointBean bb){    double A=getPointLength(list1,bb);    double B=getPointLength(list2,bb);    double C=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");      }    }  }}

主函数

package KNN;import java.util.ArrayList;/* * 主函数 KNN */public class TestJava {  static ArrayList< PointBean> listA;  static ArrayList< PointBean> listB;  static ArrayList< PointBean> listC;  static ArrayList< PointBean> listD;  public static void main(String[] args) {    //创佳Arraylist    listA=new ArrayList<PointBean>();    listB=new ArrayList<PointBean>();    listC=new ArrayList<PointBean>();    listD=new ArrayList<PointBean>();    //写入数据    setDate();    getTestResult();  }  /**   * 得到结果   */  private static void getTestResult() {    //创建对象    KnnMain km=new KnnMain();    for(int i=0;i<listD.size();i++){      km.getContent(listA, listB, listC, listD.get(i));    }  }  /**   * 写入数据   */  private static void setDate() {    //A的坐标点    int A_x[]={1,1,2,2,1};    int A_y[]={0,1,1,0,2};    //B的坐标点    int B_x[]={2,3,3,3,4};    int B_y[]={4,4,3,2,3};    //C的坐标点    int C_x[]={4,5,5,6,6};    int C_y[]={1,2,0,2,1};    // 测试数据    //B的坐标点    int D_x[]={3,3,3,0,5};    int D_y[]={0,1,5,0,1};    //    PointBean bA;    for(int i=0;i<5;i++){      bA=new PointBean(A_x[i], A_y[i]);      listA.add(bA);    }    //    PointBean bB ;    for(int i=0;i<5;i++){      bB=new PointBean(B_x[i], B_y[i]);      listB.add(bB);    }    //    PointBean bC ;    for(int i=0;i<5;i++){      bC=new PointBean(C_x[i], C_y[i]);      listC.add(bC);    }    //    PointBean bD ;    for(int i=0;i<5;i++){      bD=new PointBean(D_x[i], D_y[i]);      listD.add(bD);    }  }}

测试的结果:

这个点:3 , 1 属于A
这个点:3 , 5 属于B
这个点:0 , 0 属于A
这个点:5 , 1 属于C

到此简单的KNN算法已经实现对于未知点的划分,有助于大家对于KNN算法的理解。对于改进KNN的一些算法JAVA实现会在后面进行贴出。共同学习共同进步!

希望本文所述对大家java程序设计有所帮助。


注:相关教程知识阅读请移步到JAVA教程频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表