KNN算法JAVA实现

本文介绍了KNN算法的基本原理,当K=3时如何进行分类,并探讨了算法的优缺点。通过Java代码展示了如何读取数据、归一化、选取测试与训练样本以及计算距离。最后,对算法进行了测试并输出了错误率。

KNN算法是一种分类算法,其实啊,KNN的原理就是当预测一个新的值x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。
在这里插入图片描述

例如当K=3的时候,也就是取最靠近样本点的三个数据,然后看这三个数据大多数是什么类型的,就将样本点归为什么类;

所以在代码中可以根据距离计算判断:例如二维数据

在这里插入图片描述

KNN算法优点

简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。预测效果好,对异常值不敏感,毕竟取多数的数据。

KNN算法缺点

对内存要求较高,因为该算法存储了所有训练数据,预测阶段可能很慢
对不相关的功能和数据规模敏感。

具体代码实现,这里使用matlab生成总数据集data.txt,有1000条数据
编程语言采用我喜欢的Java。原理都一样,语言只是工具,嘿嘿。
在这里插入图片描述

首先是肯定是读取data,txt文件,将数据保存在List集合中:
集合中用Data类封装数据.

//数据类
public class Data implements Comparable<Data>{
   
   
     // 每年获得的飞行常客里程数
    private double mile;
     // 玩视频游戏所耗时间百分比
    private double time;
     // 每周消费的冰淇淋公升数
    private double icecream;
      //   1 代表不喜欢的人
      //   2 代表魅力一般的人
      //    3 代表极具魅力的人
    private int type;
     // 两个数据距离
    private double distance;
@Override
public int compareTo(Data o) {
   
   
    if (this.distance < o.getDistance()) {
   
   
        return -1;
    }else if (this.distance  > o.getDistance()) {
   
   
        return 1;
    }
    return 0;
}
}
//省略getter 和setter方法,实现Comparable接口后可以实现compareTo方法,自定义排序规则。

接下来读取文件数据:采用BufferedReader类对文件进行读取

//解析传入的文件名对应的文件数据
private List<Data> initDataSet(String fileName) throws IOException {
   
   
    List<Data> list = new ArrayList<Data>();
    BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName));
    String line = null;
    while ((line = bufferedReader.readLine()) != null) {
   
   
        Data data = new Data();
        String[] s = line.split("\t");
        data.setMile(Double.parseDouble(s[0]));
        data.setTime(Double.parseDouble(s[1]));
        data.setIcecream(Double.parseDouble(s[2])
K近邻(K-Nearest Neighbors, KNN)是一种基于实例的学习方法,它通过比较新数据点与训练集中所有样本的距离,找出与其最相似的k个邻居,并以其类别进行预测。在Java实现KNN算法通常涉及以下几个步骤: 1. **数据预处理**:收集并清洗数据,将它们转化为可用于计算距离的形式,如数值型数据。 2. **计算距离**:选择一种度量距离的方式,比如欧氏距离、曼哈顿距离等。在Java中,可以使用`Math.pow`和`Math.sqrt`来计算平方差或欧氏距离。 3. **创建数据结构**:存储训练集和其对应的标签,常用的数据结构可以是数组或HashMap。 4. **预测函数**:对于新的输入数据点,找到K个最近的邻居,然后统计它们属于各个类别的频率,最常见的类别就是预测结果。 5. **评估模型**:使用交叉验证或测试集来评估模型性能。 以下是一个简单的Java代码片段,展示了如何实现KNN的基本流程(这里假设我们有一个包含特征值和标签的二维数组`data`): ```java import java.util.ArrayList; import java.util.Arrays; public class KNN { private int k; private double[][] data; // 训练数据 public KNN(int k, double[][] data) { this.k = k; this.data = data; } public String predict(double[] input) { ArrayList<Double> distances = new ArrayList<>(); for (double[] sample : data) { double dist = calculateDistance(input, sample); distances.add(dist); } distances.sort(Comparator.comparingDouble(Double::doubleValue)); int countForEachClass = new int[data[0].length]; for (int i = 0; i < k; i++) { countForEachClass[(int) data[distances.get(i)][data[0].length - 1]]++; } return getMaxIndex(countForEachClass) + ""; } private double calculateDistance(double[] a, double[] b) { // 实现计算距离的公式 } private int getMaxIndex(int[] array) { // 找到数组中的最大值索引 } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值