一 算法介绍

        K近邻(K-Nearest Neighbors, KNN)是一种基于实例的监督学习算法,适用于分类和回归任务。其核心思想是通过计算待预测样本与训练集中样本的距离,选取距离最近的K个邻居,根据这些邻居的标签进行投票(分类)或均值计算(回归)来预测结果。

二 原理

  1. 距离度量:常用欧氏距离(Euclidean Distance)计算样本间的相似性,公式为:

    ,这里表示a,b两点间的距离。其他可选距离包括曼哈顿距离、余弦相似度等。

  2. K值选择:K是用户定义的超参数,影响模型复杂度。较小的K容易过拟合,较大的K可能忽略局部特征。通常通过交叉验证确定最优K值。

  3. 决策规则

    • 分类:统计K个邻居中最多数的类别作为预测结果。
    • 回归:取K个邻居目标值的平均值作为预测输出。

三 具象化

根据上面原理我们知道主要是依据距离来判断的,可能会有点模糊,下面我来举例说明:

在图中表示有多个圈圈,每个圈圈都有各自的价格和颜色。

1 分类

        在这个中,这里我们k=4,意思就是找具体他们最近的四个元素,如何找其中一个颜色最多的那个就把我们这个未知的归为那一类,这里我们距离是按坐标算的。我们可以想一下,这里每个圈圈的坐标就是它的特征,如果是其他类型的数据,我们也可以用他们的特征之间的差距,去找临近的一个,如何去分类

2 回归 

        这个和上面差不多,在找到最近的几个,如何依据他们的值,如何去求平均,就可以得到他们的具体值了。

四 代码实现

1 分类

# 导入库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score# 加载数据
iris = load_iris()
X, y = iris.data, iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)# 创建KNN分类器(K=5)
knn_classifier = KNeighborsClassifier(n_neighbors=5)# 训练模型
knn_classifier.fit(X_train, y_train)# 预测并评估
y_pred = knn_classifier.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"分类准确率: {accuracy:.2f}")  # 示例输出:分类准确率: 0.98[4,11](@ref)
  • 使用sklearn.neighbors.KNeighborsClassifier实现分类。
  • 通过n_neighbors参数控制邻居数量(K值),默认K=5。

2 回归

# 导入库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error# 生成模拟数据
np.random.seed(0)
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])# 划分训练集和测试集
X_train, X_test = X[:80], X[80:]
y_train, y_test = y[:80], y[80:]# 创建KNN回归器(K=3)
knn_regressor = KNeighborsRegressor(n_neighbors=3, weights='distance')# 训练模型
knn_regressor.fit(X_train, y_train)# 预测并评估
y_pred = knn_regressor.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差(MSE): {mse:.4f}")  # 示例输出:均方误差(MSE): 0.0123[6,7](@ref)

 我们会发现,python的sklearn包封装的特别好,我们几乎可以不用了解内部计算过程,只需要他是解决什么问题,有个大致了解就可以使用了。

扩展

我们从sklearn的官网上查看这个,有很多参数,下面我们拓展的讲几项。

KNeighborsClassifiern_neighbors=5, *, weights='uniform', algorithm='auto', leaf_size=30 p=2, metric='minkowski', metric_params=, n_jobs=)[来源]

1 weights权重

这个就是,在我们计算的过程中,某些东西可能影响比较大,那么就会对最终结果印象较大。

用于预测的权重函数。可能的值:

  • 'uniform' :统一的权重。每个邻域中的所有点 权重相等。

  • 'distance' :按距离的倒数加权点。 在这种情况下,查询点的更近邻居将有一个 比距离较远的邻居具有更大的影响力。

  • [callable] :一个用户定义的函数,它接受 距离数组,并返回相同形状的数组 包含权重。

不要与最近邻搜索、最近邻插值或 k 均值聚类混淆。

在统计学中,k-最近邻算法k-NN)是一种非参数监督学习方法。它最初由 Evelyn Fix 和 Joseph Hodges 于 1951 年开发,[1]后来由 Thomas Cover 扩展。[2]大多数情况下,它用于分类,作为 k-NN 分类器,其输出是类成员资格。对象通过其邻居的多个投票进行分类,该对象被分配给其 k 个最近邻中最常见的类(k 是正整数,通常很小)。如果 k = 1,则对象被简单地分配给该单个最近邻的类。

k-NN 算法也可以推广用于回归。在 k-NN 回归(也称为最近邻平滑)中,输出是对象的属性值。该值是 k 个最近邻值的平均值。如果 k = 1,则输出将简单地分配给该单个最近邻的值,也称为最近邻插值

对于分类和回归,一种有用的技术是为邻居的贡献分配权重,以便较近的邻居比远邻对平均值的贡献更大。例如,常见的加权方案包括为每个邻居提供 1/d 的权重,其中 d 是到邻居的距离。[3]

输入由数据集中最接近的 k 个训练示例组成。 邻居取自一组对象,其类(用于 k-NN 分类)或对象属性值(用于 k-NN 回归)已知。这可以被认为是算法的训练集,尽管不需要显式训练步骤。

k-NN 算法的一个特点(有时甚至是一个缺点)是它对数据的局部结构敏感。 在 k-NN 分类中,函数仅在局部近似,所有计算都推迟到函数评估。由于该算法依赖于距离,如果特征代表不同的物理单位或尺度差异很大,那么对训练数据进行特征归一化可以大大提高其准确性。[4]

参数选择

k 的最佳选择取决于数据;通常,较大的 k 值会降低噪声对分类的影响,[8]但使类之间的边界不那么明显。可以通过各种启发式技术选择一个好的 k(参见超参数优化)。该类被预测为最接近训练样本的类(即当 k = 1 时)的特殊情况称为最近邻算法。

k-NN 算法的准确性可能会因存在嘈杂或不相关的特征,或者如果特征尺度与其重要性不一致而严重下降。在选择或缩放特征以改进分类方面投入了大量研究工作。一种特别流行的[需要引用]方法是使用进化算法来优化特征缩放。[9]另一种流行的方法是通过训练数据与训练类的互信息来缩放特征。[需要引用]

在二元(两类)分类问题中,选择 k 作为奇数是有帮助的,因为这可以避免平局投票。在此设置中选择经验最优 k 的一种流行方法是通过引导方法。[10]

 距离计算方法

1. 欧氏距离(Euclidean Distance)

2. 曼哈顿距离(Manhattan Distance)

3. 闵可夫斯基距离(Minkowski Distance)

4. 切比雪夫距离(Chebyshev Distance)

5. 马氏距离(Mahalanobis Distance)

6. 余弦相似度(Cosine Similarity)

7. 汉明距离(Hamming Distance)

8. 杰卡德距离(Jaccard Distance)

9. 布雷叶距离(Bray-Curtis Distance)

10. 马氏重合距离(Mahalanobis–Ovchinnikov Distance)

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

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

相关文章

医疗器械:DFEMA和PFEMA

在医疗器械行业,DFMEA(Design FMEA,设计失效模式及影响分析)和 PFMEA(Process FMEA,过程失效模式及影响分析)是核心的风险管理工具,旨在通过系统性识别潜在风险、分析影响并采取预防…

Qt 与 SQLite 嵌入式数据库开发

Qt 与 SQLite 的结合是开发轻量级、跨平台嵌入式数据库应用的理想选择。SQLite 作为一种零配置、文件型数据库,无需独立的服务器进程,非常适合集成到 Qt 应用中。本文将深入探讨 Qt 与 SQLite 的嵌入式数据库开发,包括基础操作、高级特性、性…

Oracle OMF 非OMF 文件 转化 不需要重建 file#.incarnation#

不需要重建就要重启, alter database datafile move 就可以在线 file#.incarnation# 是 incarnation 不是dbid Goal How to convert non OMF files to OMF files with ASM storage Datafiles are not deleted at dropping tablespace if files are non-OMF and …

大型微服务项目:听书——11 Redisson分布式布隆过滤器+Redisson分布式锁改造专辑详情接口

11 Redisson分布式布隆过滤器Redisson分布式锁改造专辑详情接口 11.1 缓存穿透解决方案&布隆过滤器 缓存穿透解决方案: 布隆过滤器: 布隆过滤器的使用: 11.2 远程调用查询所有的专辑id集合 修改: /*** 查询所有的专辑…

STM32与ADS1220实现多通道数据采集的完整分析和源程序

以下是基于STM32与ADS1220实现多通道数据采集的完整分析和源程序,结合硬件设计、通信协议及软件优化,提供高精度采集解决方案: 一、系统设计关键要点 ADS1220特性 24位高精度ΔΣ ADC,支持4路单端或2路差分输入 集成PGA(增益1~128)、基准电压和可编程电流源 多通道限制:…

百特搭AI低代码平台助力企业国际化业务敏捷拓展

在全球化浪潮下,企业扬帆出海或服务全球客户已成为重要战略。然而,开拓国际市场面临多重挑战:语言文化差异显著、本地化需求复杂多变、智能化应用需求激增、各国IT基础设施与合规要求各异。企业亟需一个能够快速响应、灵活适应,并…

epoll_event数据结构及使用案例详解

epoll_event 数据结构详解 在 Linux 的 I/O 多路复用机制 epoll 中&#xff0c;epoll_event 是关键的数据结构&#xff0c;用于描述文件描述符&#xff08;fd&#xff09;上的事件和关联数据。其定义在头文件 <sys/epoll.h> 中&#xff1a; struct epoll_event {uint32_t…

C++11STL容器map和set简单介绍

一、引言map和set底层结构比较复杂&#xff0c;我认为我们先谈基本介绍再谈C11&#xff0c;最后再谈map和set底层以及map和set封装。二、简单介绍一下map和setmap和set底层都是红黑树&#xff0c;是二叉搜索树的一种&#xff0c;查找非常快。不像数组、链表一样一个一个对比&am…

Java线程基础面试复习笔记

1. 线程与进程的区别进程是正在运行程序的实例&#xff0c;线程是进程中的执行单元。主要区别&#xff1a; 内存空间&#xff1a;不同进程使用不同的内存空间&#xff0c;同一进程下的线程共享内存空间资源开销&#xff1a;线程更轻量&#xff0c;线程上下文切换成本比进程上下…

面试题(技术面+hr面)

面试技术面HR面后端HR面常见问题*稳定性&#xff0c;上进心&#xff0c;目标感&#xff0c;抗压能力&#xff0c;学习能力*回答问题时注意体现上面五点&#xff0c;即使瞎扯也尽量往上靠。面经项目相关介绍一下你收获最大的一个项目你们团队有多少人&#xff0c;怎么分工的开发…

本地部署Dify教程

克隆 Dify 代码仓库克隆 Dify 源代码至本地。git clone hts://github.com/langgenius/dify.git启动 Dify进入 Dify 源代码的 docker 目录&#xff0c;执行一键启动命令:cd dify/docker #切换到指定目录 cp .env.example .env #修改文件名 docker compose up -d #启动

Android Kotlin 协程全面指南

协程是 Kotlin 提供的一套简化异步编程的轻量级线程操作框架&#xff0c;特别适合 Android 开发中的异步任务处理。以下是 Android 开发中需要掌握的协程核心知识点&#xff1a;1. 协程基础概念1.1 协程是什么轻量级线程&#xff1a;比线程更高效&#xff0c;可以在单个线程中运…

【Linux】进程切换与优先级

前言&#xff1a; 上文我们讲到了操作系统与Linux中进程的状态【Linux】进程状态-CSDN博客 本文我们来讲进程的优先级、以及进程的切换 进程优先级 什么是优先级&#xff1f; CPU中资源是有限的&#xff0c;而进程的数量一定是远大于CPU资源的&#xff0c;所以优先级是进程得…

首发即开源!DAWorkBench数据可视化分析软件正式发布!(附源码下载网址)

1 系统介绍DAWorkBench是一款面向科研实验和工程测试场景的数据可视化分析开源软件&#xff0c;支持实现数据清洗、信号处理和交互式可视化等功能。系统集成文件IO、数据处理以及可视化交互三大模块&#xff0c;支持多维数据分析与高质量图表生成&#xff0c;助力用户高效完成从…

Android Studio历史版本快速下载(二次修改记录)

原版&#xff1a;Android Studio历史版本快速下载_android studio 历史版本下载-CSDN博客 一. 最新版本 https://developer.android.com/studio?hlzh-cn 二. 历史版本 中国官网的历史版本为何不能下载&#xff1f;&#xff08;https://developer.android.com/studio/archi…

The Missing Semester of Your CS Education 学习笔记以及一些拓展知识(六)

文章目录The Missing Semester of Your CS Education 学习笔记以及一些拓展知识版本控制Git笔记部分Git的基本工作原理Git 的核心工作原理&#xff1a;快照而非差异Git 的三大工作区域Git的核心对象Git的四个对象对象之间的关系与工作流程&#xff1a;对象的引用Git的安装和基础…

嵌入式与 Linux 系统中的核心图形库全解析

嵌入式与 Linux 系统中的核心图形库全解析 图形库在嵌入式系统与 Linux 桌面系统中扮演着重要角色。从最底层的 GPU 驱动接口&#xff0c;到上层的图形渲染与 GUI 工具包&#xff0c;共同构成了完整的图形显示栈。本文将系统整理图形相关的核心组件&#xff0c;按功能分层分类&…

深度学习模块实践手册(第十二期)

56、Ghost 模块论文《GhostNet: More Features from Cheap Operations》1、作用&#xff1a; Ghost 模块是一种轻量级的特征提取模块&#xff0c;旨在通过廉价操作生成更多特征图&#xff0c;减少计算量的同时保持模型性能。传统卷积神经网络在生成特征图时存在大量冗余计算&am…

自己动手造轮子:如何创建JAR并通过Maven在Spring Boot中引用

让代码复用变得简单优雅——3分钟学会封装专属工具库作为Java开发者&#xff0c;你是否遇到过这些痛点&#xff1f;多个项目重复编写相同工具类工具代码分散难以统一维护团队协作缺乏标准化工具库本文将手把手教你创建自己的JAR包&#xff0c;并优雅地集成到Spring Boot项目中&…

使用dea工具 给vue 里面的ts打断点

在 Vue 项目中使用 TypeScript 时&#xff0c;我们通常会在 IDE&#xff08;如 JetBrains 的 IntelliJ IDEA 或 WebStorm&#xff09;中设置断点进行调试。以下是详细步骤&#xff1a; 准备工作 确保项目已配置 source maps&#xff08;Vue CLI 创建的项目默认已配置&#xff0…