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程序设计有所帮助。

(0)

相关推荐

  • python使用KNN算法手写体识别

    本文实例为大家分享了用KNN算法手写体识别的具体代码,供大家参考,具体内容如下 #!/usr/bin/python #coding:utf-8 import numpy as np import operator import matplotlib import matplotlib.pyplot as plt import os ''''' KNN算法 1. 计算已知类别数据集中的每个点依次执行与当前点的距离. 2. 按照距离递增排序. 3. 选取与当前点距离最小的k个点 4. 确定前k个点所

  • Java实现走迷宫回溯算法

    以一个M×N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍.设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论. (1) 根据二维数组,输出迷宫的图形. (2) 探索迷宫的四个方向:RIGHT为向右,DOWN向下,LEFT向左,UP向上,输出从入口到出口的行走路径. 例子: 左上角(1,1)为入口,右下角(8,9)为出口. 可使用回溯方法,即从入口出发,顺着某一个方向进行探索,若能走通,则继续往前进:否则沿着原路退回,换一个方向继续探索,直至出口位置,求得一条通

  • Python实现的knn算法示例

    本文实例讲述了Python实现的knn算法.分享给大家供大家参考,具体如下: 代码参考机器学习实战那本书: 机器学习实战 (Peter Harrington著) 中文版 机器学习实战 (Peter Harrington著) 英文原版[附源代码] 有兴趣你们可以去了解下 具体代码: # -*- coding:utf-8 -*- #! python2 ''''' @author:zhoumeixu createdate:2015年8月27日 ''' #np.zeros((4,2)) #np.zero

  • 以Python代码实例展示kNN算法的实际运用

    邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表. kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别. kNN方法在类别决策时,只与极少量的相邻样本有关.由于kNN方法主

  • 使用栈的迷宫算法java版代码

    本文为大家分享了使用栈的迷宫算法java版,主要考察栈的使用,供大家参考,具体内容如下 主要思路如下: do { if(当前位置可通过) { 标记此位置已走过; 保存当前位置并入栈; if(当前位置为终点) { 程序结束; } 获取下一个位置; } else { if(栈非空) { 出栈: while(当前位置方向为4且栈非空) { 标记当前位置不可走; 出栈; } if(当前位置的方向小于4) { 方向+1; 重新入栈; 获取下一个位置; } } } } while (栈非空); java代码

  • Java实现的傅里叶变化算法示例

    本文实例讲述了Java实现的傅里叶变化算法.分享给大家供大家参考,具体如下: 用JAVA实现傅里叶变化 结果为复数形式 a+bi 废话不多说,实现代码如下,共两个class FFT.class 傅里叶变化功能实现代码 package fft.test; /************************************************************************* * Compilation: javac FFT.java Execution: java FF

  • kNN算法python实现和简单数字识别的方法

    本文实例讲述了kNN算法python实现和简单数字识别的方法.分享给大家供大家参考.具体如下: kNN算法算法优缺点: 优点:精度高.对异常值不敏感.无输入数据假定 缺点:时间复杂度和空间复杂度都很高 适用数据范围:数值型和标称型 算法的思路: KNN算法(全称K最近邻算法),算法的思想很简单,简单的说就是物以类聚,也就是说我们从一堆已知的训练集中找出k个与目标最靠近的,然后看他们中最多的分类是哪个,就以这个为依据分类. 函数解析: 库函数: tile() 如tile(A,n)就是将A重复n次

  • JAVA实现感知器算法

    简述 随着互联网的高速发展,A(AI)B(BigData)C(Cloud)已经成为当下的核心发展方向,假如三者深度结合的话,AI是其中最核心的部分.所以如果说在未来社会,每个人都必须要学会编程的话,那么对于程序员来说,人工智能则是他们所必须掌握的技术(科技发展真tm快). 这篇文章介绍并用JAVA实现了一种最简单的感知器网络,不纠结于公式的推导,旨在给大家提供一下学习神经网络的思路,对神经网络有一个大概的认识. 感知器网络模型分析 首先看一张图 如果稍微对神经网络感兴趣的一定对这张图不陌生,这张

  • Java实现五子棋AI算法

    五子棋AI算法 也算是一个典型的游戏AI算法,一些棋类的AI算法都可以参考实现,下面是Java实现代码 棋盘抽象接口 import java.util.List; public interface IChessboard { //取得棋盘最大横坐标 public int getMaxX(); //最大纵坐标 public int getMaxY(); //取得当前所有空白点,这些点才可以下棋 public List<Point> getFreePoints(); } 棋子类实现 //棋子类 p

  • Java实现Floyd算法求最短路径

    本文实例为大家分享了Java实现Floyd算法求最短路径的具体代码,供大家参考,具体内容如下 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Scanner; public class TestMainIO { /** * @param args * @throws FileNotFoundException */ public static void main(Stri

  • Java实现的朴素贝叶斯算法示例

    本文实例讲述了Java实现的朴素贝叶斯算法.分享给大家供大家参考,具体如下: 对于朴素贝叶斯算法相信做数据挖掘和推荐系统的小伙们都耳熟能详了,算法原理我就不啰嗦了.我主要想通过java代码实现朴素贝叶斯算法,思想: 1. 用javabean +Arraylist 对于训练数据存储 2. 对于样本数据训练 具体的代码如下: package NB; /** * 训练样本的属性 javaBean * */ public class JavaBean { int age; String income;

随机推荐