K邻近算法

K邻近算法

1 算法介绍

1.1 什么是K-NN

K-NN(K Near Neighbor):k个最近的邻居,即每个样本都可以用它最接近的k个邻居来代表。K-NN算法属于监督学习方式的分类算法,即计算某给点到每个点的距离作为相似度的反馈。简单来讲,KNN就是“近朱者赤,近墨者黑”的一种分类算法。

1.2 K-NN的算法思想

k-NN算法的基本思想是:给定一个待分类样本,找出与其距离最近的k个训练样本(邻居),然后通过这k个邻居的类别来决定待分类样本的类别,即这K个样本的多数属于某个类,就把该输入样本分类到这个类中。(这就类似于现实生活中少数服从多数的思想)。在回归任务中,则通过这k个邻居的值来预测待测样本的值,即通过这k个邻居的目标变量值的平均值来预测待测样本的目标变量值。

【案例1】如下图:有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。我们的目标是对于这个新的数据点,确定它的类别是什么?

使用k近邻的思想来给绿色圆点进行分类:

(1)如果K=3,绿色圆点的最邻近的3个点是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。

(2)如果K=5,绿色圆点的最邻近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。

【案例2】

假设我们对男性身高的判断为:矮【150.154.158】,中【170,175,178】,高【180.185,188】,而小明的身高为152,我们人类一眼就可以判断出小明的身高属于矮,因为152离150和154最近。这是我们人为的判断,而knn算法呢,就是通过一些算法告诉计算机,让计算机来判断小明的身高属于哪个级别。

1.3 k-近邻算法三要素

k-近邻算法三要素:距离度量、k值选择和分类决策规则。

1、选择参数k:选择一个正整数k,表示选择k个邻居。K 值的选择会对算法的结果产生重大影响。K值较小意味着只有与输入实例较近的训练实例才会对预测结果起作用,但容易发生过拟合;如果 K 值较大,优点是可以减少学习的估计误差,但缺点是学习的近似误差增大,这时与输入实例较远的训练实例也会对预测起作用,使预测发生错误。

在实际应用中,K 值一般选择一个较小的数值,通常采用交叉验证的方法来选择最优的 K 值。

2、计算距离:对待预测样本和训练样本中的每一个样本计算距离。常用的距离度量方法有欧氏距离(Euclidean distance)、曼哈顿距离(Manhattan distance)等。

(1)欧氏距离

欧式距离是最常用的距离度量方法,适用于多维空间中的点。对于两个点_a_(_x_11,_x_12,…,x_1_n) 和 b(_x_21,_x_22,…,x_2_n),欧式距离定义为:

(2)曼哈顿距离在每个维度上计算绝对差值之和,适用于需要考虑方向但不考虑对角线距离的情况。对于两个点 a 和 b,曼哈顿距离定义为:

3、选择k个最近的邻居:从训练样本中选出与待预测样本距离最近的k个样本。

4、计算预测值:在分类任务中,通过投票法决定待分类样本的类别,即选择k个邻居中出现最多的类别作为结果。在回归任务中,通过取k个邻居的平均值作为预测结果。

2 算法实现

2.1 算法步骤

【案例1】给定一个点的坐标,判断该点是红点还是蓝点。

【分析】

(1)获取训练数据

训练数据格式:((x,y),label)即(位置,标签)

(2)给定一个点,如:((0.145211188,0.548882643),?)

计算该点到所有点的距离,然后对距离排序,取K个最近距离的点。再根据多数原则,得出该点的分类(标签)。

根据上例,K邻近算法的步骤:

(1)计算测试数据与各个训练数据之间的距离;

(2)按照距离的递增关系进行排序;

(3)选取距离最小的K个点;

(4)确定前K个点所在类别的出现频率;

(5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

2.2 算法实现

1、案例1代码实现

public static void main(String[] args) throws IOException {

    // 1 创建训练集// 1.1 获取训练集数据: 0.559159703 0.098352957    0String filePath = "d:\\user\\input\\train.txt";List<String> lines = FileUtils.readLines(new File(filePath));// 2.2 将训练数据转换成元组:((0.559159703,0.098352957),0)List<Tuple2<Double[],Object>> trains = new ArrayList<>();for(String line : lines){String[] split = line.split("(\\s+|\t)");// 分割数据Double[] coordinate = {Double.valueOf(split[0]),Double.valueOf(split[1])};Tuple2 train = Tuple2.of(coordinate,split[2]);trains.add(train);}// 2 训练// 2.1 获取测试数据Double[] center = {0.160564179,0.427239984};// 2.2 预测String label = Knn.predic(trains,center);System.out.println(Arrays.asList(center) + "\t" + label);    }

2、创建Knn类

(1)计算测试数据与各个训练数据之间的距离

 /*** 计算欧式距离* @param a 中心点* @param b 测试点* @return*/public static Double euclidDistance(Double[] a, Double[] b){double result = 0;double tmp = 0;for (int i = 0; i < a.length ; i++) {tmp = tmp + Math.pow(a[i]-b[i],2);}result = Math.sqrt(tmp);return result;}

(2)按照距离的递增关系进行排序

 /*** 按照距离的递增关系进行排序* @param tmpList 距离集合*/public static void sort(List<Tuple2<Object,Double>> tmpList) {Collections.sort(tmpList, new Comparator<Tuple2< Object, Double>>() {@Overridepublic int compare(Tuple2< Object, Double> o1, Tuple2< Object, Double> o2) {if(o1.f1 > o2.f1){return 1;}else if(o1.f1 < o2.f1){return -1;}else {return 0;}}});}

(3)选取距离最小的K个点

/**

 * 选取最近的k个点(特征集合)* @param tmpList 距离集合* @param k* @return*/public static List<Tuple2< Object,Double>> setK(List<Tuple2< Object,Double>> tmpList,int k) {List<Tuple2< Object,Double>> labels = tmpList.subList(0, k);return labels;}

(4)确定前K个点所在类别的出现频率

  /*** 确定前K个点所在类别的出现频率* @param labels 特征集合* @return*/public static Map<String,Integer> count(List<Tuple2< Object,Double>>  labels) {// 计算每个分类包含的点的个数Map<String,Integer> rates = new HashMap<>();for (Tuple2< Object,Double> t : labels) {String type = (String)t.f0;// 当key存在时,old+value,否则key的值为1rates.merge(type,1,Integer::sum);}return rates;}

(5)返回前K个点中出现频率最高的类别作为测试数据的预测分类

/**

 * 返回前K个点中出现频率最高的类别作为测试数据的预测分类* @param rates* @return*/public static String result(Map<String,Integer> rates) {// 找出最大频率double value = 0.0;String type = "";for (Map.Entry<String, Integer> entry : rates.entrySet()) {if (entry.getValue() > value) {type = entry.getKey();value = entry.getValue();}}return type;}

(6)算法步骤封装

/**

 * 预测结果* @param trains* @param tests* @return*/public static String predic(List<Tuple2<Double[],Object>> trains,Double[] tests){// 1 计算测试数据与各个训练数据之间的距离,并将距离封装到元组(标签,距离)List<Tuple2< Object,Double>> tmpList = new ArrayList<>();for(Tuple2<Double[],Object> train:trains){Double d = Knn.euclidDistance(tests, train.f0);Tuple2 t = Tuple2.of(train.f1,d);tmpList.add(t);}// 2 按照距离的递增关系进行排序Knn.sort(tmpList);// 3 选取最近的k个点List<Tuple2< Object,Double>> labels = Knn.setK(tmpList, 7);// 4 确定前K个点所在类别的出现频率Map<String, Integer> rates = Knn.count(labels);// 5 返回前K个点中出现频率最高的类别作为测试数据的预测分类return  Knn.result(rates);}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

晋升系列4:学习方法

每一个成功的人&#xff0c;都是从底层开始打怪&#xff0c;不断的总结经验&#xff0c;一步一步打上来的。在这个过程中需要坚持、总结方法论。 对一件事情长久坚持的人其实比较少&#xff0c;在坚持的人中&#xff0c;不断的总结优化的更少&#xff0c;所以最终达到高级别的…

LoRA,DoRA,RSLoRA,LoRA+ 是什么

LoRA,DoRA,RSLoRA,LoRA+ 是什么 一、LoRA(Low-Rank Adaptation,低秩适应) 核心原理:冻结预训练模型参数,仅在每层插入两个低秩矩阵(A∈R^{rd}, B∈R^{dr}),通过分解权重增量ΔW=BA近似全秩更新,参数量仅为全量微调的0.01%-1%。 举例:在GPT-2(774M参数)的注意力…

HTTP发送POST请求的两种方式

1、json String json HttpRequest.post(getUrl(method, "v1", url, userId, appKey)).header("Content-type", "application/json") // 设置请求头为 JSON 格式.body(JSONUtil.toJsonStr(params)) // 请求体为 JSON 字符串.execute().body(); …

TCP并发服务器

单循环服务器&#xff1a;服务器在同一时刻只能响应一个客户端的需求。 并发服务器&#xff1a;服务器在同一时刻可以响应多个客户端的需求。 构建TCP服务器的方法&#xff1a; IO多路复用的函数接口[select() poll() epoll()] 1.多进程实现TCP并发服务器 #include <s…

【大模型统一集成项目】如何封装多个大模型 API 调用

&#x1f31f; 在这系列文章中&#xff0c;我们将一起探索如何搭建一个支持大模型集成项目 NexLM 的开发过程&#xff0c;从 架构设计 到 代码实战&#xff0c;逐步搭建一个支持 多种大模型&#xff08;GPT-4、DeepSeek 等&#xff09; 的 一站式大模型集成与管理平台&#xff…

Linux基础开发工具—vim

目录 1、vim的概念 2、vim的常见模式 2.1 演示切换vim模式 3、vim命令模式常用操作 3.1 移动光标 3.2 删除文字 3.3 复制 3.4 替换 4、vim底行模式常用命令 4.1 查找字符 5、vim的配置文件 1、vim的概念 Vim全称是Vi IMproved&#xff0c;即说明它是Vi编辑器的增强…

数据结构与算法效率分析:时间复杂度与空间复杂度详解(C语言)

1. 算法效率 1.1 如何衡量一个算法的好坏&#xff1f; 在计算机程序设计中&#xff0c;衡量算法优劣的核心标准是效率。但效率不仅指运行速度&#xff0c;还需要综合以下因素&#xff1a; 时间因素&#xff1a;算法执行所需时间 空间因素&#xff1a;算法运行占用的内存空间…

使用arm嵌入式编译器+makefile编译管理keil项目

目录 # arm嵌入式编译器-知识 # arm嵌入式编译器-知识 --- arm嵌入式编译器&#xff08;百度云盘&#xff09;下载&#xff1a;arm嵌入式编译器 keil&#xff0c; 链接 提取码: 8a6c arm官方使用教程&#xff1a; Arm Compiler 6 User Guide linux 安装完了有个非常重要的一步…

SwiftUI学习笔记day1---Stanford lecture1

SwiftUI学习笔记day1—Stanford lecture1 课程链接&#xff1a;Lecture 1 | Stanford CS193p 2023课程大纲&#xff1a;代码仓库&#xff1a;github/iOS 文章目录 SwiftUI学习笔记day1---Stanford lecture11.在Xcode中创建一个swiftUI的工程2.简单认识Xcode这个IDE3.尝试理解示…

vanna+deepseekV3+streamlit本地化部署

文章目录 1、vanna介绍1.1、基本介绍1.2、工作原理1.3、优点 2、vannadeepseekV3mysqlstreamlit本地化部署2.1、创建conda环境&#xff0c;安装依赖2.2、Mysql数据准备2.3、新建pycharm项目2.4、封装deepseek大模型2.5、定义MyVanna2.6、构建streamlit的app2.7、app演示 1、van…

【LangChain接入阿里云百炼deepseek】

这是目录 前言阿里云百炼注册账号使用代码执行结果 前言 大模型爆火&#xff0c;现在很多教程在教怎么使用大模型来训练Agent智能体&#xff0c;但是大部分教程都是使用的OpenAI。 最近阿里云推出DeepSeek-R1满血版&#xff0c;新用户可享100万免费Token额度。 今天就教大家怎…

【优选算法】二分法(总结套路模板)

目录 1. 题目一 &#xff1a;二分查找 解题思路&#xff1a; 模板总结&#xff08;简单版&#xff0c;不适用所有情况&#xff09; 代码实现&#xff1a; 2. 题目二 解题思路&#xff1a; 模板总结&#xff08;几乎万能&#xff09; 代码实现&#xff1a; 3. 题目…

Qt开源控件库(qt-material-widgets)的编译及使用

项目简介 qt-material-widgets是一个基于 Qt 小部件的 Material Design 规范实现。 项目地址 项目地址&#xff1a;qt-material-widgets 本地构建环境 Win11 家庭中文版 VS2019 Qt5.15.2 (MSVC2019) 本地构建流程 克隆后的目录结构如图&#xff1a; 直接使用Qt Crea…

游戏引擎学习第147天

仓库:https://gitee.com/mrxiao_com/2d_game_3 上一集回顾 具体来说&#xff0c;我们通过隐式计算来解决问题&#xff0c;而不是像数字微分分析器那样逐步增加数据。我们已经涵盖了这个部分&#xff0c;并计划继续处理音量问题。不过&#xff0c;实际上我们现在不需要继续处理…

uni-app打包成H5使用相对路径

网上找了一圈&#xff0c;没用&#xff0c;各种试&#xff0c;终于给试出来了&#xff0c;主要是网络上的没有第二步&#xff0c;只有第一步&#xff0c;导致打包之后请求的路径没有带上域名 运行的基础路径设置为./ config.js文件里面的baseUrl路径改成空字符&#xff0c;千万…

知识社区:打破传统知识传播的壁垒

知识社区的诞生 当今&#xff0c;知识库的上传与下载已无法满足现代用户对知识获取的多样化需求。随着信息量的爆炸式增长和用户需求的日益复杂化&#xff0c;传统的、静态的知识库显得力不从心。用户渴望能够实时互动、即时反馈、多维度探索知识的平台。正是在这样的背景下&am…

洛谷 P5534 【XR-3】等差数列 python

这题不用向下取整//就会错&#xff0c;不太能理解为什么...感觉对结果好像没什么影响啊 a1, a2, n map(int,input().split()) d a2 - a1 an a1 d * (n-1) s (a1an)*n//2 print(s)

机器人路径规划、轨迹优化系列课程

机器人路径规划、轨迹优化课程-第一讲-轨迹规划导论_哔哩哔哩_bilibili 机器人路径规划、轨迹优化课程-第二讲-Dijkstra算法原理讲解_哔哩哔哩_bilibili 机器人路径规划、轨迹优化课程-第四讲-A*算法原理和代码讲解_哔哩哔哩_bilibili 机器人路径规划、轨迹优化课程-第五讲-…

qemu-kvm源码解析-内存虚拟化

内存虚拟化介绍 宿主机上的程序地址转换时为 HVA&#xff08;宿主机虚拟地址&#xff09;--MMU-->HPA(宿主机物理地址) 而宿主机上的虚拟机面临两层转化需求: GVP(虚拟机虚拟地址)--MMU-->GPA(虚拟机物理地址) GPA(虚拟机物理地址)--VMM-->HPA(宿主机物理地址) 虚…

WireShark自动抓包

背景 异常流量检测是当前保护网络空间安全的重要检测方法。 对流量的研究&#xff0c;首先需要在系统中进行抓包&#xff0c;并对包进行分析。 这里对WireShark自动抓包进行简要介绍。 操作步骤 1、选择“捕获”>“选项”。 2、在Input下&#xff0c;选择要抓包的网络接…