Java实现的KNN算法示例

 更新时间:2018年06月23日 02:47:07   作者:带头大哥不是我  
这篇文章主要介绍了Java实现的KNN算法,结合实例形式分析了KNN算法的原理及Java定义与使用KNN算法流程、训练数据相关操作技巧,需要的朋友可以参考下

本文实例讲述了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();
}
@Override
public 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数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

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

相关文章

  • java数组基础详解

    java数组基础详解

    下面小编就为大家带来一篇Java创建数组的几种方式总结。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能给大家带来帮助
    2021-06-06
  • 浅谈Spring如何解决循环依赖的问题

    浅谈Spring如何解决循环依赖的问题

    这篇文章主要介绍了浅谈Spring如何解决循环依赖的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • SpringBoot Mybatis批量插入Oracle数据库数据

    SpringBoot Mybatis批量插入Oracle数据库数据

    这篇文章主要介绍了SpringBoot Mybatis批量插入Oracle数据库数据,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-08-08
  • Java Synchronized的偏向锁详细分析

    Java Synchronized的偏向锁详细分析

    synchronized作为Java程序员最常用同步工具,很多人却对它的用法和实现原理一知半解,以至于还有不少人认为synchronized是重量级锁,性能较差,尽量少用。但不可否认的是synchronized依然是并发首选工具,本文就来详细讲讲
    2023-04-04
  • Java使用组件编写窗口实现网上文件下载

    Java使用组件编写窗口实现网上文件下载

    这篇文章主要为大家详细介绍了Java使用组件编写窗口实现网上文件下载的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Spring常用数据源的xml配置详解

    Spring常用数据源的xml配置详解

    这篇文章主要介绍了Spring常用数据源的xml配置详解,数据源是连接到数据库的一类路径,它包含了访问数据库的信息(地址、用户名、密码),数据源就像是排水管道,需要的朋友可以参考下
    2023-07-07
  • Java的内存分配与回收策略详解

    Java的内存分配与回收策略详解

    这篇文章主要介绍了Java的内存分配与回收策略详解,对象的内存分配,就是在堆上分配,对象主要分配在新生代的 Eden 区上,少数情况下可能直接分配在老年代,分配规则不固定,取决于当前使用的垃圾收集器组合以及相关的参数配置,需要的朋友可以参考下
    2023-08-08
  • Java如何调用TSC打印机进行打印详解

    Java如何调用TSC打印机进行打印详解

    这篇文章主要给大家介绍了关于Java如何调用TSC打印机进行打印的相关资料,文中介绍了三种方法,分别是两种后台打印以及JS打印 ,三种方法都给出了详细的示例代码,需要的朋友可以参考借鉴,下面来一起看看吧
    2018-07-07
  • Mybatis Plus 3.4.0分页拦截器的用法小结

    Mybatis Plus 3.4.0分页拦截器的用法小结

    本文主要介绍了Mybatis Plus 3.4.0分页拦截器的用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-03-03
  • spring boot整合shiro安全框架过程解析

    spring boot整合shiro安全框架过程解析

    这篇文章主要介绍了spring boot整合shiro安全框架过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论