近邻算法详解:原理、Java实现及应用场景

摘要

近邻算法(Nearest Neighbor Algorithm)是一类基于实例的学习方法,广泛应用于分类和回归问题中。最常见的近邻算法是K近邻算法(K-Nearest Neighbors, KNN),其基本思想是通过计算待分类样本与训练样本的距离,选择最近的K个样本,依据它们的类别信息来决定待分类样本的类别。本文将详细介绍近邻算法的原理、代码实现及其应用场景,并给出Java实现代码及测试方法。

近邻算法原理

近邻算法的核心思想是“相似的样本具有相似的类别”。具体步骤如下:

  1. 计算距离:对待分类样本与训练集中每个样本计算距离(通常使用欧氏距离)。
  2. 选择最近的K个样本:根据计算出的距离,选择距离最近的K个样本。
  3. 投票:在K个样本中,选择出现频率最高的类别作为待分类样本的预测类别。

KNN算法的数学表示

假设有一个样本空间 𝑋={𝑥1,𝑥2,…,𝑥𝑛},对应的标签集合为 𝑌={𝑦1,𝑦2,…,𝑦𝑛}。对于一个新的待分类样本 𝑥,算法通过计算 𝑥 与所有训练样本 𝑥𝑖 的距离,选择距离最近的K个样本,并根据它们的标签通过投票或平均来预测 𝑥 的标签。

公式

其中, 𝑚是特征的维度。

KNN算法的Java实现

数据点类

首先,定义一个表示数据点的类:

public class DataPoint {
    private double[] features;
    private String label;

    public DataPoint(double[] features, String label) {
        this.features = features;
        this.label = label;
    }

    public double[] getFeatures() {
        return features;
    }

    public String getLabel() {
        return label;
    }

    public double distanceTo(DataPoint other) {
        double sum = 0;
        for (int i = 0; i < features.length; i++) {
            sum += Math.pow(this.features[i] - other.features[i], 2);
        }
        return Math.sqrt(sum);
    }
}

KNN算法类

接下来,定义KNN算法的实现类:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class KNN {
    private int k;  // K值
    private List<DataPoint> dataPoints;  // 训练数据点列表

    public KNN(int k) {
        this.k = k;
        this.dataPoints = new ArrayList<>();
    }

    public void addDataPoint(DataPoint point) {
        dataPoints.add(point);
    }

    public String classify(DataPoint newPoint) {
        List<DataPointDistance> distances = new ArrayList<>();
        for (DataPoint point : dataPoints) {
            double distance = newPoint.distanceTo(point);
            distances.add(new DataPointDistance(point, distance));
        }

        // 按距离排序
        Collections.sort(distances, Comparator.comparingDouble(DataPointDistance::getDistance));

        // 投票
        return vote(distances.subList(0, k));
    }

    private String vote(List<DataPointDistance> neighbors) {
        int maxCount = 0;
        String majorityLabel = null;
        for (DataPointDistance neighbor : neighbors) {
            String label = neighbor.getDataPoint().getLabel();
            int count = (int) neighbors.stream().filter(n -> n.getDataPoint().getLabel().equals(label)).count();
            if (count > maxCount) {
                maxCount = count;
                majorityLabel = label;
            }
        }
        return majorityLabel;
    }

    private class DataPointDistance {
        private DataPoint dataPoint;
        private double distance;

        public DataPointDistance(DataPoint dataPoint, double distance) {
            this.dataPoint = dataPoint;
            this.distance = distance;
        }

        public DataPoint getDataPoint() {
            return dataPoint;
        }

        public double getDistance() {
            return distance;
        }
    }
}

测试方法

最后,编写一个测试方法来验证KNN算法的实现:

public class KNNTest {
    public static void main(String[] args) {
        KNN knn = new KNN(3);

        // 添加训练数据点
        knn.addDataPoint(new DataPoint(new double[]{1.0, 2.0}, "A"));
        knn.addDataPoint(new DataPoint(new double[]{2.0, 3.0}, "A"));
        knn.addDataPoint(new DataPoint(new double[]{3.0, 3.0}, "B"));
        knn.addDataPoint(new DataPoint(new double[]{6.0, 7.0}, "B"));
        knn.addDataPoint(new DataPoint(new double[]{7.0, 8.0}, "B"));
        knn.addDataPoint(new DataPoint(new double[]{8.0, 9.0}, "A"));

        // 待分类数据点
        DataPoint newPoint = new DataPoint(new double[]{4.0, 4.0}, null);

        // 分类
        String label = knn.classify(newPoint);

        // 输出分类结果
        System.out.println("The new point is classified as: " + label);
    }
}

应用场景

  1. 图像识别:KNN可用于手写数字识别、人脸识别等领域,通过计算图像特征向量之间的距离进行分类。
  2. 文本分类:在自然语言处理领域,KNN可以用于垃圾邮件检测、情感分析等任务。
  3. 推荐系统:KNN可用于协同过滤推荐,通过计算用户之间的相似度,推荐相似用户喜欢的物品。
  4. 医疗诊断:在医疗领域,KNN可用于疾病预测,通过患者的症状和体征数据进行分类预测。

结论

本文详细介绍了KNN算法的原理、步骤及其Java实现,包括数据点类、KNN算法类及测试方法。KNN算法是一种简单但有效的分类方法,广泛应用于各个领域。通过本文的讲解和代码示例,读者可以更好地理解KNN算法,并在实际项目中应用该算法进行分类任务。

 感谢您阅读本文,欢迎“一键三连”。作者定会不负众望,按时按量创作出更优质的内容。
❤️ 1. 毕业设计专栏,毕业季咱们不慌,上千款毕业设计等你来选。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/674054.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

内网渗透-详解代理逻辑及隧道

写在前面 红蓝对抗过程中打点以后往往需要进行内网渗透和横向移动&#xff0c;因此大家都需要扎实掌握代理和隧道知识&#xff0c;一款优秀的代理工具也可以给内网渗透带来很大的收益。 1.正向代理&#xff1a; 代理客户端&#xff0c;帮助客户端完成所需请求。 举例&#x…

系统架构设计师【第6章】: 数据库设计基础知识 (核心总结)

文章目录 6.1 数据库基本概念6.1.1 数据库技术的发展6.1.2 数据模型6.1.3 数据库管理系统6.1.4 数据库三级模式 6.2 关系数据库6.2.1 关系数据库基本概念6.2.2 关系运算6.2.3 关系数据库设计基本理论 6.3 数据库设计6.3.1 数据库设计的基本步骤6.3.2 数据需求分析6…

梵几 x TapData:如何高效落地实时数据中台,助力家居企业优化数字营销

使用 TapData&#xff0c;化繁为简&#xff0c;摆脱手动搭建、维护数据管道的诸多烦扰&#xff0c;轻量代替 OGG、DSG 等同步工具&#xff0c;「CDC 流处理 数据集成」组合拳&#xff0c;加速数据流转&#xff0c;帮助企业将真正具有业务价值的数据作用到实处&#xff0c;将“…

【FISCO BCOS 3.0】一、新版本搭链介绍

目录 一、区块链种类的变化 二、搭链演示 1.单群组区块链&#xff08;Air版本&#xff09; 2.多群组区块链&#xff08;Pro版本&#xff09; 3.可扩展区块链&#xff08;Max版本&#xff09; FISCO BCOS的发展速度如日中天&#xff0c;对于稳定的2.0版本而言&#xff0c;偶…

【【手把手教你实现Risc-V装载至FPGA】】

RiscV实现教程 参考来源 tinyriscv: https://gitee.com/liangkangnan/tinyriscv 平台实现 &#xff1a; Linux ubuntu 实现介绍 环境 &#xff1a; 需要 iverilog (切换到 v11或以上的版本&#xff09; 1.下载iverilog源码 git clone https://github.com/steveicarus/iverilog.…

zookeeper启动(一)

1.zookeeper启动入口 在zkServer.sh的启动命令中,我们可以找到zookeeper启动的关键类org.apache.zookeeper.server.quorum.QuorumPeerMain QuorumPeerMain#main 我们可以直接看org.apache.zookeeper.server.quorum.QuorumPeerMain中的main方法,从下面的main方法中,我们可以…

收银系统源码-千呼新零售2.0【线上商城商品详情页细节优化】

千呼新零售2.0系统是零售行业连锁店一体化收银系统&#xff0c;包括线下收银线上商城连锁店管理ERP管理商品管理供应商管理会员营销等功能为一体&#xff0c;线上线下数据全部打通。 适用于商超、便利店、水果、生鲜、母婴、服装、零食、百货等连锁店使用。 详细介绍请查看下…

媳妇面试了一家公司,期望月薪20K,对方没多问就答应了,只要求3天内到岗,可我总觉得哪里不对劲。

“20k&#xff01;明天就来上班吧&#xff01;” 听到这句话&#xff0c;你会不会两眼放光&#xff0c;激动得差点跳起来&#xff1f; 朋友媳妇小丽&#xff0c;最近就经历了这样一场“梦幻面试”。然而&#xff0c;事情的发展却远没有想象中那么美好…… “这公司也太好了吧…

python udp双向通信

import json import socket import threading import loggingthislist [] thisneednum {}class ChatUdpMain:def __init__(self):#其他原有逻辑 begin#其他原有逻辑 end# 1.创建socket套接字 收self.udp_socket_receive socket.socket(socket.AF_INET, socket.SOCK_DGRAM…

Cocos入门2:软件安装

Cocos Creator的安装教程如下&#xff0c;按照步骤进行&#xff0c;可以帮助您顺利安装Cocos Creator&#xff1a; 一、下载Cocos Dashboard 访问Cocos官网&#xff1a;前往Cocos Creator的官方网站&#xff08;https://www.cocos.com/creator/&#xff09;。 下载Cocos Dash…

arco design表单label和输入框的空间分布

表单空间分布 arco利用的栅格系统来实现label、input的大小分布 <a-form :model"formData.form" :label-col-props"{ span: 6 }" :wrapper-col-props"{ span: 18 }" >// 其它...... </a-form>栅格系统中&#xff0c;默认空间总量2…

ES6-01-简介

一、什么是ES6&#xff1f; 每年一个版本o(╥﹏╥)o。 二、javaScript新特性的特点 1、语法简洁&#xff0c;功能丰富&#xff1b; 2、框架开发应用。 3、岗位需求&#xff01; 三、let关键字 3-1、声明变量 let a;let a,b;let e100;let f521, gmilk-love, h[]; 3-2、声明的…

6FC5357-0BB22-0AE0处理器CPU模块单价

6FC5357-0BB22-0AE0处理器CPU模块单价 6FC5357-0BB22-0AE0处理器CPU模块单价 6FC5357-0BB22-0AE0处理器CPU模块单价 6FC5357-0BB22-0AE0处理器CPU模块中文说明书 6FC5357-0BB22-0AE0处理器CPU模块工作原理图 商品编号(市售编号) 6FC5357-0BB22-0AE0 产品说明 ***备件**…

高中数学:解三角形-三角变换法

一、三角变换法 三角变换法&#xff0c;就是&#xff0c;在解三角形的过程中&#xff0c;将正弦定理和余弦定理结合两角和与差公式来解答题目 二、练习 例题1 解析 题目中的第二个等式&#xff0c;我们应该是一眼看出来&#xff0c;用余弦定理&#xff0c;求出cosA的值。从…

深入分析 Android BroadcastReceiver (二)

文章目录 深入分析 Android BroadcastReceiver (二)1. 深入理解 BroadcastReceiver 的高级使用和优化2. 有序广播&#xff08;Ordered Broadcasts&#xff09;2.1 实现有序广播 3. 粘性广播&#xff08;Sticky Broadcasts&#xff09;3.1 使用粘性广播 4. 本地广播&#xff08;…

国产QX320F280049,双核对比TI的 C28X+CLA,谁的处理能力更强

国产QX320F280049&#xff0c;独立双核32位CPU&#xff0c;主频150MHz 每个核都有TMU&#xff0c;FPU&#xff0c;VCU等运算 16个高分辨率HRPWM&#xff08;150PS&#xff09; 3个12位ADC&#xff0c;采样率3MSPS TI的 TMS320F280049采用C28XCLA协处理器模式&#xff0c;主频只…

C++:list模拟实现

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《C&#xff1a;list模拟实现》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#xf…

音视频开发10 FFmpeg 内存模型-AVPacket, AVFrame

从现有的 Packet 拷贝一个新 Packet 的时候&#xff0c;有两种情况&#xff1a; • ①两个 Packet 的 buf 引用的是 同一数据缓存空间 &#xff0c;这时 候要注意数据缓存空间的释放问题&#xff1b; • ②两个 Packet 的 buf 引用不同的数据缓存空间 &#xff0c;每个 Pac…

移动机器人定位与导航实训记录

本次实训主要学习ros-tf的使用、slam使用、机器人自主导航&#xff0c;我先简单发出来&#xff0c;等我整理完再重新编辑一边。

AI图书推荐:结合ChatGPT的Java编程实用指南

《结合ChatGPT的Java编程实用指南》&#xff08;Practical Java Programming with ChatGPT&#xff09;是一本具有变革性意义的书籍&#xff0c;通过展示针对各种问题的多样化调查&#xff0c;挑战了传统软件开发的速度。这本书旨在通过集成OpenAI API、利用生成式人工智能和大…