Java实现的KNN算法示例

下面是Java实现KNN算法的完整攻略:

什么是KNN算法?

KNN(K-Nearest Neighbors)算法是一种经典的机器学习算法,属于分类算法。该算法基于样本之间的距离(通常用欧式距离),将测试样本与训练样本进行相似度比较,选取距离最近的K个训练样本,通过少数服从多数的投票方式,确定测试样本的类别。

KNN算法可以用于分类和回归问题,本文仅介绍分类问题。

KNN算法实现流程

  1. 准备数据集:KNN算法需要数据集,其包含输入数据和输出数据。输入数据是已知类别的数据集,输出数据是待分类的数据。通常将数据集切分成训练集和测试集,其中训练集用于构建KNN模型,测试集用于评估模型的准确性。

  2. 特征提取:对于每个数据样本,需要将其转换成可用于计算距离的特征向量。

  3. 计算距离:使用欧式距离等距离度量方法,计算测试集中的每个数据样本与训练集中样本之间的距离。

  4. 选择K值:选择距离测试集最近的前K个训练集样本。

  5. 投票决策:统计前K个训练集样本中出现最多的类别,作为测试集样本的预测输出。

KNN算法Java实现示例

示例一

下面是一个简单的KNN算法Java实现示例:

// 计算欧式距离
public static double euclideanDistance(int[] a, int[] b) {
    double sum = 0;
    for (int i = 0; i < a.length; i++) {
        sum += Math.pow(a[i] - b[i], 2);
    }
    return Math.sqrt(sum);
}

// 预测测试数据的类别
public static int predictCategory(int[][] trainData, int[] testData, int k) {
    // 计算所有训练数据与测试数据之间的距离
    Map<Double, Integer> distanceMap = new TreeMap<>();
    for (int i = 0; i < trainData.length; i++) {
        double distance = euclideanDistance(trainData[i], testData);
        distanceMap.put(distance, trainData[i][trainData[i].length - 1]);
    }
    // 选择距离最近的前K个训练样本
    int[] category = new int[k];
    int index = 0;
    for (Map.Entry<Double, Integer> entry : distanceMap.entrySet()) {
        if (index == k) {
            break;
        }
        category[index++] = entry.getValue();
    }
    // 统计出现次数最多的类别,并返回
    int maxCategory = 0;
    int maxCount = 0;
    for (int i = 0; i < category.length; i++) {
        int count = 0;
        for (int j = 0; j < category.length; j++) {
            if (category[i] == category[j]) {
                count++;
            }
        }
        if (count > maxCount) {
            maxCount = count;
            maxCategory = category[i];
        }
    }
    return maxCategory;
}

public static void main(String[] args) {
    // 训练集数据
    int[][] trainData = {{1, 1, 1}, {2, 2, 2}, {3, 3, 1}, {4, 4, 1}, {5, 5, 2}, {6, 6, 2}};
    // 测试集数据
    int[] testData = {2, 3};
    // 预测测试数据的类别
    int k = 3;
    int category = predictCategory(trainData, testData, k);
    System.out.println("测试数据的类别为:" + category);
}

在该示例中,假设训练集数据有两个特征和一个类别,测试集数据有两个特征。通过计算欧式距离来比较测试集样本和训练集样本之间的相似度,并使用前K个距离最近的训练样本的类别进行投票决策,最终得到测试集样本的预测类别。

示例二

下面是一个利用KNN算法实现鸢尾花分类的Java示例代码:

public class KNN {
    private static final double TRAIN_DATA_RATIO = 0.8;
    private static final int K = 3;
    private static final String[] CATEGORY = {"setosa", "versicolor", "virginica"};

    public static void main(String[] args) throws Exception {
        // 导入数据,分割训练集和测试集
        Instances data = DataSource.read("iris.arff");
        data.setClassIndex(data.numAttributes() - 1);
        int trainSize = (int) Math.round(data.numInstances() * TRAIN_DATA_RATIO);
        Instances trainData = new Instances(data, 0, trainSize);
        Instances testData = new Instances(data, trainSize, data.numInstances() - trainSize);

        // 构建模型,预测测试集
        IBk model = new IBk(K);
        model.buildClassifier(trainData);
        Evaluation eval = new Evaluation(trainData);
        eval.evaluateModel(model, testData);
        System.out.println(eval.toSummaryString());

        Instance testInstance = testData.firstInstance();
        double predictedClass = model.classifyInstance(testInstance);
        System.out.println("Predicted class: " + CATEGORY[(int) predictedClass]);
        System.out.println("Actual class: " + CATEGORY[(int) testInstance.classValue()]);
    }
}

在该示例中,利用Weka库导入鸢尾花数据集,分割出训练集数据和测试集数据。使用IBk算法构建KNN模型,并使用Evaluation类对模型进行评估。最终通过classifyInstance()方法对测试集样本进行分类预测,并与实际类别进行比较。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现的KNN算法示例 - Python技术站

(0)
上一篇 2023年5月18日
下一篇 2023年5月18日

相关文章

  • java 使用readLine() 乱码的解决

    Java中的readLine()方法是读取文件或者从标准输入流中读取数据的常用方法之一,在读取中文字符时有可能出现乱码的问题,下面讲解如何使用Java来解决readLine()乱码的问题。 问题描述 在Java中使用readLine()方法读取文件或者从标准输入流中读取数据时,如果输入的数据中含有中文字符,使用String类型读取的时候常常出现乱码的问题。 …

    Java 2023年5月20日
    00
  • Java_Spring之基于注解的 AOP 配置

    下面是关于Java Spring基于注解的AOP配置的完整攻略: 什么是基于注解的AOP配置 AOP,全称为Aspect Oriented Programming,即面向切面编程,是一种编程思想,用于解决通用业务逻辑和系统模块化的问题。在Java Spring框架中,AOP属于其核心模块,提供了一些注解,用于声明切点和对应的切面,从而实现对代码的拦截和增强。…

    Java 2023年5月31日
    00
  • Java的Struts框架报错“ServletException”的原因与解决办法

    当使用Java的Struts框架时,可能会遇到“ServletException”错误。这个错误通常由以下原因之一起: 配置错误:如果配置文件中没有正确配置,则可能会出现此错误。在这种情况下,检查文件以解决此问题。 代码错误:如果代码中存在错误,则可能会出现此错误。在这种情况下,需要检查代码以解决此问题。 以下是两个实例: 例 1 如果配置文件中没有正确配置…

    Java 2023年5月5日
    00
  • kafka运维consumer-groups.sh消费者组管理

    Kafka运维:consumer-groups.sh消费者组管理 什么是消费者组 Kafka中的消费者组是由一组消费者共同消费一个或多个主题(topics)的机制。消费者组可以有效地提高消息的吞吐量,同时还提供了在消费者之间分摊相同数量的分区以实现负载均衡的机制。 consumer-groups.sh命令 consumer-groups.sh是Kafka提供…

    Java 2023年5月20日
    00
  • java用户名密码验证示例代码分享

    下面我将为您详细讲解“java用户名密码验证示例代码分享”的完整攻略。 一、前置条件 在进行用户名密码验证时,需要满足以下前置条件: 已经创建了用于存储用户名和密码的数据库或其他数据源; 已经学习了Java JDBC编程,掌握了连接数据库和执行SQL语句的基础知识。 二、编写示例代码 下面是一个简单的Java示例代码,用于实现基于数据库的用户名密码验证: i…

    Java 2023年5月23日
    00
  • IDEA 格式化SQL代码技巧分享

    下面我将详细讲解“IDEA 格式化 SQL 代码技巧分享”的完整攻略。 格式化 SQL 代码的重要性 在使用 IDEA 进行 SQL 开发时,代码的格式化是非常重要的。优秀的代码格式化可以让我们的代码更加易读、易维护、易扩展,从而提高我们的开发效率。 IDEA 格式化 SQL 代码的几种方式 1.使用快捷键 在 IDEA 中,我们可以使用快捷键来格式化 SQ…

    Java 2023年5月20日
    00
  • Java下SpringBoot创建定时任务详解

    下面我将为您详细讲解“Java下SpringBoot创建定时任务详解”的完整攻略。 SpringBoot定时任务详解 什么是定时任务 定时任务指定在特定的时间段执行的一种操作,比如每天凌晨1点执行一次数据库备份操作、每分钟执行一次数据同步操作等。在开发中,经常使用定时任务来完成一些需要定期执行的任务。 SpringBoot中创建定时任务 SpringBoot…

    Java 2023年5月19日
    00
  • Sprint Boot @ControllerAdvice使用方法详解

    Spring Boot的@ControllerAdvice的作用与使用方法 在Spring Boot中,@ControllerAdvice注解用于定义全局异常处理器。通过使用@ControllerAdvice注解,可以方便地处理应用程序中的异常,并提供自定义的异常处理逻辑。在本文中,我们将详细介绍@ControllerAdvice注解的作用和使用方法,并提供…

    Java 2023年5月5日
    00
合作推广
合作推广
分享本页
返回顶部