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日

相关文章

  • Java8排序stream.sorted()的使用

    当我们需要对一个List或数组等集合进行排序时,我们可以使用Java8中的Stream.sorted()方法进行排序。下面就详细讲解一下Java8排序Stream.sorted()的使用攻略。 一、Stream的sorted()方法 Stream.sorted()方法是一个中间操作,它返回一个排序好的流,可以对元素进行自然排序或指定Ordering排序。 下…

    Java 2023年5月26日
    00
  • Spring-Security对HTTP相应头的安全支持方式

    Spring Security 提供了许多机制来增强 Web 应用程序的安全性。其中一个是它支持将标准 HTTP 相应头设置为提高 Web 应用程序的安全性。这包括常见的头,如 X-Content-Type-Options、X-XSS-Protection、X-Frame-Options、Strict-Transport-Security 等。在本文中,我们…

    Java 2023年5月20日
    00
  • 减少代码开发工作的Java库lombok及注解的使用学习

    这里是使用Lombok库和注解以减少Java代码开发工作的完整攻略: 1. 什么是Lombok库? Lombok是一个Java库,可以通过注解简化开发人员的代码编写量,减少样板代码的重复,从而提高代码的可读性和可维护性。使用Lombok,开发人员可以通过注解的方式自动生成getter和setter方法、构造器、日志、equals、HashCode和toStr…

    Java 2023年5月23日
    00
  • Linux下PHP+MYSQL+APACHE配置过程 (摘)第1/2页

    针对“Linux下PHP+MYSQL+APACHE配置过程”这一话题,我会提供一个完整的攻略,并在过程中举两个实例说明,内容如下: Linux下PHP+MYSQL+APACHE配置过程 安装apache 在Linux系统下,Apache是一款非常流行的Web服务器软件,可以通过以下步骤进行安装: 更新包管理器 sudo apt update 安装apache…

    Java 2023年6月2日
    00
  • 详解springSecurity之java配置篇

    关于“详解springSecurity之java配置篇”完整攻略,我们来详细说一下。 简介 SpringSecurity是基于Spring框架的安全框架,主要解决的是在应用程序中如何安全地进行身份认证和授权。本篇文档主要讲解如何使用Java配置的方式来进行SpringSecurity的配置。 步骤 1. 添加spring-security配置依赖 在 pom…

    Java 2023年5月20日
    00
  • Java基于ShardingSphere实现分库分表的实例详解

    Java基于ShardingSphere实现分库分表的实例详解 ShardingSphere是一款开源的分布式数据库中间件,支持对MySQL、Oracle、SQLServer等关系型数据库进行分库分表。本文将详细讲解在Java项目中如何基于ShardingSphere实现分库分表的方法。 步骤一:引入依赖 在Java项目的pom.xml文件中引入Shardi…

    Java 2023年5月20日
    00
  • Spring Security 强制退出指定用户的方法

    下面是关于“Spring Security 强制退出指定用户的方法”的攻略: 一、背景知识 首先需要了解一下Spring Security的基础知识。 Spring Security是一个基于Spring框架的安全框架,主要用于保护Web应用程序中的安全性。它提供了诸如身份验证、授权、攻击防护等安全功能,可以轻松添加到现有的Spring应用程序中。 在Spr…

    Java 2023年5月20日
    00
  • struts2拦截器_动力节点Java学院整理

    Struts2 拦截器攻略 简介 Struts2 拦截器是一种非常重要的 Struts2 框架的组成部分,可以用来拦截请求并对请求进行处理,比如对请求的参数进行过滤和验证,或记录日志等。通过自定义拦截器,可以实现更加灵活和自定义的业务逻辑处理。 Struts2 拦截器的框架 Struts2 拦截器框架是由三个主要部分组成的: 拦截器接口(Intercepto…

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