人工智能|机器学习——k-近邻算法(KNN分类算法)
1.简介

k-最近邻算法,也称为
kNN或k-NN,是一种非参数、有监督的学习分类器,它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题,但它通常用作分类算法,假设可以在彼此附近找到相似点。
对于分类问题,根据比重分配类别标签,即使用在给定数据点周围最多表示的标签。虽然这在技术上被认为是
plurality voting(多数表决),但majority vote一词在书面语中更常用。这些术语之间的区别在于,majority voting在技术上需要超过 50% ,这主要适用于只有两个类别的情况。当您有多个类别时 - 例如四个类别,您不一定需要 50% 才能对一个类别做出结论;您可以分配一个占比超过 25% 的类别标签。Wisconsin-Madison大学用了一个例子很好地总结了这一点。

回归问题使用与分类问题类似的概念,但在这种情况下,取 k 个最近邻的平均值来对分类进行预测。主要区别是分类用于离散值,而回归用于连续值。但是,在进行分类之前,必须定义距离。欧几里得距离是最常用的,我们将在下面深入研究。
值得注意的是,
kNN算法也是lazy learning模型家族的一部分,这意味着所有计算都发生在进行分类或预测时。由于它严重依赖内存来存储其所有训练数据,因此也称为基于实例或基于内存的学习方法。
Evelyn Fix 和 Joseph Hodges 在 1951 年的这篇论文中提出了围绕
kNN模型的最初想法,而 Thomas Cover 在他的研究中扩展了他们的概念,“Nearest Neighbor Pattern Classification”。虽然它不像以前那么受欢迎,但由于其简单性和准确性,它仍然是人们在数据科学中学习的首批算法之一。然而,随着数据集的增长,kNN变得越来越低效,影响了模型的整体性能。它通常用于简单的推荐系统、模式识别、数据挖掘、金融市场预测、入侵检测等。
2. 距离度量
kNN距离指标计算
回顾一下,k-最近邻算法的目标是识别给定查询点的最近邻,以便我们可以为该点分配一个类标签。为了做到这一点,kNN 有几个要求:
- 确定距离度量
为了确定哪些数据点最接近给定查询点,需要计算查询点与其他数据点之间的距离。这些距离度量有助于形成决策边界,将查询点划分为不同的区域。您通常会看到使用 Voronoi 图可视化的决策边界。
虽然您可以选择多种距离度量,但本文仅涵盖以下内容:
欧几里得距离(p=2):这是最常用的距离度量,仅限于实值( real-valued )向量。使用下面的公式,它测量查询点和被测量的另一个点之间的直线。

曼哈顿距离(p=1):这也是另一种流行的距离度量,它测量两点之间的绝对值。它也被称为出租车(taxicab)距离或城市街区(city block)距离,因为它通常用网格可视化,说明人们如何通过城市街道从一个地址导航到另一个地址。

闵可夫斯基(Minkowski)距离:该距离度量是欧几里得和曼哈顿距离度量的广义形式。下面公式中的参数 p 允许创建其他距离度量。当 p 等于 2 时,这个公式表示欧几里得距离,p 等于 1 表示曼哈顿距离 。

汉明(Hamming)距离:这种技术通常与布尔或字符串向量一起使用,识别向量不匹配的点。因此,它也被称为重叠度量。可以用以下公式表示:

例如,如果您有以下字符串,Hamming距离将为 2,因为只有两个值不同。

3.K的选择
k-NN算法中的 k 值定义了将检查多少个邻居以确定查询点的分类。例如,如果 k=1,实例将被分配到与其单个最近邻相同的类。定义 k 是一种平衡行为,因为不同的值可能会导致过拟合或欠拟合。
- 较低的 k 值可能具有较高的方差,但较低的偏差,较大的 k 值可能导致较高的偏差和较低的方差。
- k 的选择将很大程度上取决于输入数据,因为有许多异常值或噪声的数据可能会在 k 值较高时表现更好。总之,建议 k 使用奇数以避免分类歧义,交叉验证策略可以帮助您为数据集选择最佳 k。
4.K-近邻算法伪代码:
①计算已知类别数据集中的点与当前点之间的距离
②按照距离递增次序排序
③选择与当前点距离最小的k个点
④确定前k个点所在类别(标签)的出现频率
⑤返回前k个点出现频率最高的类别作为当前点的预测分类
5.K-近邻算法程序清单:
希望深入研究,可以通过使用Python 和 scikit-learn 来了解有关 k-NN 算法的更多信息。以下代码是如何使用 kNN 模型创建和预测的示例:
from sklearn.neighbors import KNeighborsClassifiermodel_name = ‘K-Nearest Neighbor Classifier’`kNN`Classifier = KNeighborsClassifier(n_neighbors = 5, metric = ‘minkowski’, p=2)`kNN`_model = Pipeline(steps=[(‘preprocessor’, preprocessorForFeatures), (‘classifier’ , `kNN`Classifier)])`kNN`_model.fit(X_train, y_train)y_pred = `kNN`_model.predict(X_test)
6. 应用
k-NN算法已在各种问题中得到应用,主要是在分类中。其中一些用例包括:
- 数据预处理
数据集经常有缺失值,但
kNN算法可以在缺失数据插补的过程中估计这些值。
- 推荐问题
使用来自网站的clickstream(点击流)数据,
kNN算法已用于向用户提供有关其他内容的自动推荐。这项研究表明,用户被分配到特定组,并根据该组的用户行为,为他们提供推荐。然而,考虑到kNN的应用规模,这种方法对于较大的数据集可能不是最优的。
- 金融
它还用于各种金融和经济用例。例如,一篇论文展示了如何在信用数据上使用
kNN可以帮助银行评估向组织或个人提供贷款的风险。它用于确定贷款申请人的信用状况。
- 生命健康
kNN还应用于医疗保健行业,预测心脏病发作和前列腺癌的风险。该算法通过计算基因的表达来工作。
- 模式识别
kNN还有助于识别模式,例如文本和数字分类。这对于识别在表格或邮寄信封上的手写数字特别有帮助。
7. 优缺点
就像任何机器学习算法一样,
k-NN也有其优点和缺点。根据实际情况,它可能是也可能不是最优的选择。
7.1. 优势
- 易于实现
鉴于算法的简单性和准确性,它是新数据科学家将学习的首批分类器之一。
- 适应性强
随着新训练样本的添加,算法会根据任何新数据进行调整,因为所有训练数据都存储在内存中。
- 超参数少:
kNN只需要一个 k 值和一个距离度量,与其他机器学习算法相比,参数是很少的。
7.2. 不足
- 数据规模
由于
kNN是一种惰性算法,与其他分类器相比,它占用了更多的内存和数据存储。从时间和金钱的角度来看,这可能是昂贵的。更多的内存和存储将增加业务开支,而更多的数据可能需要更长的时间来计算。虽然已经创建了不同的数据结构(例如 Ball-Tree)来解决计算效率低下的问题,但根据业务问题,采用其他的分类器可能更好。
- 维度
kNN算法往往会成为维度灾难的受害者,这意味着它在高维数据输入时表现不佳。这有时也称为峰值现象,在算法达到最佳特征数量后,额外的特征会增加分类错误的数量,尤其是当样本尺寸更小。
- 过拟合
由于“curse of dimensionality”(维度灾难),
kNN更容易出现过拟合。虽然利用特征选择和降维技术可以防止这种情况发生,但 k 的值也会影响模型的行为。较低的 k 值可能会过度拟合数据,而较高的 k 值往往会“平滑”预测值,因为它是对更大区域或邻域的值进行平均。但是,k 值太高,模型可能会欠拟合。
相关文章:
人工智能|机器学习——k-近邻算法(KNN分类算法)
1.简介 k-最近邻算法,也称为 kNN 或 k-NN,是一种非参数、有监督的学习分类器,它使用邻近度对单个数据点的分组进行分类或预测。虽然它可以用于回归问题,但它通常用作分类算法,假设可以在彼此附近找到相似点。 对于分类…...
乐得瑞 1C to 2C快充线:引领充电数据线新潮流,高效快充解决接口难题
随着科技的不断进步,数据线的接口种类也日渐繁多,但在早些时候,三合一和二合一的数据线因其独特的设计而备受欢迎。这类数据线通常采用USB-A口作为输入端,并集成了Micro USB、Lightning以及USB-C三种接口,满足了当时市…...
O2OA(翱途)开发平台如何在流程表单中使用基于Vue的ElementUI组件?
本文主要介绍如何在O2OA中进行审批流程表单或者工作流表单设计,O2OA主要采用拖拽可视化开发的方式完成流程表单的设计和配置,不需要过多的代码编写,业务人员可以直接进行修改操作。 在流程表单设计界面,可以在左边的工具栏找到Ele…...
0 OpenHarmony开源鸿蒙NEXT星河版内核嵌入式编程
开源鸿蒙NEXT星河版内核嵌入式编程 作者将狼才鲸创建日期2024-03-08 CSDN文章阅读地址Gitee文章下载地址 一、前景提要 2024年1月18日,华为放出HarmonyOS NEXT 鸿蒙星河版开发者预览版本(不是HarmonyOS NEXT版,是HarmonyOS NEXT星河版&…...
Vue | 基于 vue-admin-template 项目的跨域问题解决方法
目录 一、现存问题 二、解决方法 2.1 修改的第一个地方 2.2 修改的第二个地方 2.3 修改的第三个地方 自存 一、现存问题 报错截图如下: 二、解决方法 2.1 修改的第一个地方 在 .env.development 文件中: # base api # VUE_APP_BASE_API /d…...
mutex 和 channel 哪一个工作效率更高?
关于Rust中mutex和channel哪一个工作效率更高的问题,实际上并没有一个绝对的答案,因为效率的高低取决于具体的使用场景和需求。 互斥锁(mutex)主要用于保护共享资源,确保一次只有一个线程可以访问它。当需要多个线程同…...
Elasticsearch 通过索引阻塞实现数据保护深入解析
Elasticsearch 是一种强大的搜索和分析引擎,被广泛用于各种应用中,以其强大的全文搜索能力而著称。 不过,在日常管理 Elasticsearch 时,我们经常需要对索引进行保护,以防止数据被意外修改或删除,特别是在进…...
备考银行科技岗刷题笔记(持续更新版)
银行考试计算机部分复习 IEEE 802.11的帧格式 1.1 IEEE 802.11是什么? 802.11是国际电工电子工程学会(IEEE)为无线局域网络制定的标准。目前在802.11的基础上开发出了802.11a、802.11b、802.11g、802.11n、802.11ac。并且为了保证802.11更…...
代码随想录算法训练营第五十五天|583. 两个字符串的删除操作、72. 编辑距离。
583. 两个字符串的删除操作 题目链接:两个字符串的删除操作 题目描述: 给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。 每步 可以删除任意一个字符串中的一个字符。 解题思路: 1、确定dp数组&#x…...
Softmax 回归 + 损失函数 + 图片分类数据集【动手学深度学习v2】李沐动手学深度学习课程笔记
目录 Softmax回归 损失函数 图片分类数据集 Softmax回归从零开始实现 Softmax回归简洁实现 Softmax回归 回归和分类的区别 回归问题举例上节课的预测房价问题,分类问题就是对样本进行分类 回归和分类的具体区别 假设真实的类别为第i个类别(值为1&#x…...
git 初始化项目并上传到github
如果还没配置过,需要配置账号信息 git config --global user.name "baymax-collab" git config --global user.email "baymax-collabtest.com"创建一个新的存储库 git clone gitgithub.com:xxxx cd test git switch --create main touch READ…...
前端javascript的DOM对象操作技巧,全场景解析
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 所属的专栏:前端泛海 景天的主页:景天科技苑 文章目录 1.js的DOM介绍2.节点元素层级关系3.通过js修改,清空节点…...
TCP包头、TCP为什么安全可靠、UDP和TCP的区别、http协议
我要成为嵌入式高手之3月8日Linux高编第十八天!! __________________________________________________ 学习笔记 TPC包头 1、序号 发送端发送数据包的编号 2、确认号 已经确认接收到的数据的编号,只有当ACK为1时,该位才有用 …...
Android使用WebView打开内嵌H5网页
Android打开外部网页链接请参考上一篇文章 https://public.blog.csdn.net/article/details/136384559 继上篇,新建assets文章夹,将H5的网页资源放到此文件夹下 把H5的资源文件都拷进来 这个时候,将添加打开本地网页的代码: //打…...
UDP实现文件的发送、UDP实现全双工的聊天、TCP通信协议
我要成为嵌入式高手之3月7日Linux高编第十七天!! ———————————————————————————— 回顾 重要程序 1、UDP实现文件的发送 发端: #include "head.h"int main(void) {int sockfd 0;struct sockaddr_i…...
Yocto - Project Quick Build
欢迎光临! 这篇简短的文档将向您介绍使用 Yocto 项目构建典型镜像的过程。本文还介绍了如何为特定硬件配置构建。您将使用 Yocto Project 构建一个名为 Poky 的参考嵌入式操作系统。 Welcome! This short document steps you through the process for a typical i…...
深入探讨C++中的可变参数列表(Variadic Templates)
文章目录 导言可变参数列表的基本用法使用std::initializer_list应用场景 导言 在C编程中,处理可变数量参数的能力是一种非常有用的功能。通过可变参数列表,你可以编写更加通用和灵活的函数,从而提高代码的可读性和重用性。本文将详细介绍C中…...
MS2548 国产自动方向控制、半双工 RS-485 收发器 替代MAX13487
MS2548 国产自动方向控制、半双工 RS-485 收发器 替代MAX13487 北京冠宇铭通科技有限公司 肖小姐 产品简述 MS2548 是一个 5V 供电、半双工 RS-485 收发器。 芯片具有自动换向控制功能,可用于隔离485 端口,驱动器输入与使能信号一起配合控制芯片的状态&…...
数据库大师之路:Oracle在线学习平台全指南!
介绍数据库是由甲骨文公司开发的一款关系数据库管理系统(RDBMS),在数据库领域具有领先地位,并且以其系统可移植性而闻名。以下是对Oracle数据库的详细介绍: 市场地位:Oracle数据库是目前世界上流行的关系数…...
如何在Windows系统部署Jellyfin Server并实现公网访问内网影音文件
文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...
【Go语言基础【12】】指针:声明、取地址、解引用
文章目录 零、概述:指针 vs. 引用(类比其他语言)一、指针基础概念二、指针声明与初始化三、指针操作符1. &:取地址(拿到内存地址)2. *:解引用(拿到值) 四、空指针&am…...
uniapp 开发ios, xcode 提交app store connect 和 testflight内测
uniapp 中配置 配置manifest 文档:manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号:4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
uniapp 集成腾讯云 IM 富媒体消息(地理位置/文件)
UniApp 集成腾讯云 IM 富媒体消息全攻略(地理位置/文件) 一、功能实现原理 腾讯云 IM 通过 消息扩展机制 支持富媒体类型,核心实现方式: 标准消息类型:直接使用 SDK 内置类型(文件、图片等)自…...
