K邻近算法(KNN,K-nearest Neighbors Algorithm)

文章目录

    • 前言
    • 应用场景
    • 欧几里得距离(欧氏距离)
    • 两类、单一属性(1D)
    • 两类、两种属性(2D)
    • 两类、两种以上属性(>3D)
  • Examples in R
    • 再来一个
    • 补充一下什么是变量
  • 什么是变量?
  • 什么是数值、分类变量?

前言

之前看到一篇文章,方法部分提到了这个K邻近算法,正好自己不是很熟悉其原理,所以学习整理一下😑

K邻近算法(K-nearest neighbors algorithm)是一种常用的机器学习算法,用于分类和回归问题。它基于一个简单的假设:与未知样本最相似的K个已标记样本的类别可以用来预测该未知样本的类别。

在K邻近算法中,输入数据点被表示为n维空间中的向量,并且每个数据点都有一个对应的类别标签。算法的工作原理如下:

  1. 计算距离:根据给定的距离度量方法(例如欧氏距离、曼哈顿距离等),计算未知样本与训练集中所有已标记样本之间的距离。
  2. 选择最近邻:选择距离未知样本最近的K个已标记样本。
  3. 预测类别:对于分类问题,通过多数表决的方式确定未知样本的类别。即,选择K个最近邻中出现次数最多的类别作为预测结果。对于回归问题,可以使用这些最近邻的平均值作为预测结果。

K值的选择很重要,较小的K值会使模型更加敏感和复杂,可能会过拟合。较大的K值则可能导致模型过于简单,无法捕捉到数据集中的复杂模式。K邻近算法简单易懂,且适用于多种问题。然而,它也有一些限制,如对于高维数据和样本不平衡问题的处理效果可能较差。此外,由于该算法需要计算距离矩阵,对于大型数据集来说会变得计算密集。

应用场景

假设有一定数量的物体,每个物体都有其独特的属性,比如,我们有有椅子床和桌子(对象),并知道其对应的长宽高(属性)。如果有人给我们一个具有已知属性的对象,让我们猜测(预测)该对象属于什么,就是说,已知数据的维度,要求预测它是椅子、床还是桌子,就可以使用knn算法。
属性是对象的属性,每个对象都可以看作一个范畴。我们可以检查新对象的属性与任何已知类别的关系。当属性已知,可以画在图上,图形表示能让我们更易于理解并计算新对象与已知类别之间的欧几里得距离,确定新对象最接近哪个类别。

欧几里得距离(欧氏距离)

欧几里得是个人名,不要被这个名字吓倒,它只是简单地表示平面上两点之间的距离。通过简单地使用公式,可以计算两点之间的距离,不管你有多少属性,比如高度、宽度、宽度、重量等等。公式为√(x2−x1)²+(y2−y1)²+(z2−z1)²……(n2-n1)²

两类、单一属性(1D)

我们有两个类别:男性和女性,其各自的高度在下表中给出。

性别身高(cm)
178
179
163
168
181
170
183
171

在这里插入图片描述

此时出现一个新成员,并且需要确定它是男是女。已知其身高,在1D平面上画图,看新对象的属性更接近哪里。理想情况下,我们可以计算欧几里德距离,以确定最接近新对象属性的值。如果我们在身高图上画180cm这个点(新对象的属性),它更接近男性的身高。所以推测新对象更可能是男性。

两类、两种属性(2D)

现在再加入一个新的属性:体重,它也可以描述男性和女性的特征,如下表所示。

性别身高(cm)体重(kg)
17872
17981
16354
16857
18197
17059
18477
17158

在这里插入图片描述

现在,我们创建一个二维平面,并按照相同的步骤计算新对象与旧对象的距离,它与其中一个类别的距离越近,新对象属于该类别的可能性就越大。可以看到,新成员(属性:身高169cm、体重68kg)与女性更加接近。所以推测其为女性。

两类、两种以上属性(>3D)

通常情况下,有很多属性与分类对象相关联,不能简单画在二维或一维平面上。假设有5个属性:性别、身高、体重、瞳孔的颜色、头发长度和音高,只需使用欧几里德距离公式来计算新对象与给定的对象之间的距离。
( s e x 1 − s e x 2 ) 2 + ( h e i g h t 1 − h e i g h t 2 ) 2 + ( w e i g h t 1 − w e i g h t 2 ) 2 + ( e y e _ c o l o r 1 − e y e _ c o l o r 2 ) 2 + ( h a i r _ l e n g t h 1 − h a i r _ l e n g t h 2 ) 2 + ( v o i c e _ p i t c h 1 − v o i c e _ p i t c h 2 ) 2 \sqrt{(sex1-sex2)^2 +(height1-height2)^2 + (weight1-weight2)^2+(eye\_color1-eye\_color2)^2+(hair\_length1-hair\_length2)^2+(voice\_pitch1-voice\_pitch2)^2} (sex1sex2)2+(height1height2)2+(weight1weight2)2+(eye_color1eye_color2)2+(hair_length1hair_length2)2+(voice_pitch1voice_pitch2)2
其中1表示已知类别数据点,2表示要确定其类别的新数据点。相比较小,新的对象与已知某类数据的距离(和)越小,则属于该类的可能性越大。

Examples in R

在使用R进行KNN之前,需要说明几点:

  1. KNN,K邻近法中的neighbor数量要有K定义,如果K=5,那么将将会检测最近的五个neighbor以确定所属类别。如果这5个neighbor中的大部分同属于一个类别,那么可以认定新对象很大可能属于该类。
  2. 对象不同的属性会有不同的标度单位,比如:KG、CM等,所以在使用数据之前需要对每个变量进行标准化(特征缩放),比如Min-Max法。
  3. KNN算法更适用于数值变量,但不是说它不能处理分类变量,但如果混合了分类变量和数值变量,那就需要其他方法。如果所有值都是数值,KNN是最好的method。
  4. 把数据分成训练集和测试集时,数据应该已经标准化了:数据标准化 → 拆分。
  5. KNN算法不适用于R的有序Factors
  6. K-mean算法和KNN算法是不同的,K-mean用于聚类,是一种无监督的学习算法,而KNN是一种用于分类问题的监督学习算法。
df <- data(iris) 
head(iris, 2) 
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa# Min-Max方法,标准化
nor <- function(x){(x -min(x))/(max(x)-min(x))}# 生成随机数,包含数据集总行数的80%
ran <- sample(1:nrow(iris), 0.8 * nrow(iris)) # 对数据集的前4列标准化
iris_norm <- as.data.frame(lapply(iris[,c(1:4)], nor))summary(iris_norm)
# Sepal.Length     Sepal.Width      Petal.Length     Petal.Width     
# Min.   :0.0000   Min.   :0.0000   Min.   :0.0000   Min.   :0.00000  
# 1st Qu.:0.2222   1st Qu.:0.3333   1st Qu.:0.1017   1st Qu.:0.08333  
# Median :0.4167   Median :0.4167   Median :0.5678   Median :0.50000  
# Mean   :0.4287   Mean   :0.4406   Mean   :0.4675   Mean   :0.45806  
# 3rd Qu.:0.5833   3rd Qu.:0.5417   3rd Qu.:0.6949   3rd Qu.:0.70833  
# Max.   :1.0000   Max.   :1.0000   Max.   :1.0000   Max.   :1.00000  # 提取训练数据集
iris_train <- iris_norm[ran,] 
# 提取测试数据集
iris_test <- iris_norm[-ran,] 
#提取train数据集的第5列,用作knn函数中的'cl'参数。
iris_target_category <- iris[ran,5]
# 提取test数据集的第5列,衡量预测准确性
iris_test_category <- iris[-ran,5]
library(class)
## 执行KNN,预测
pr <- knn(iris_train,iris_test,cl=iris_target_category,k=13)
(tab <- table(pr,iris_test_category))
#            iris_test_category
#pr           setosa versicolor virginica
#  setosa         12          0         0
#  versicolor      0          8         1
#  virginica       0          0         9# 这个函数将正确的预测除以总预测数,告诉我们模型有多精确。
accuracy <- function(x){sum(diag(x)/(sum(rowSums(x)))) * 100}
accuracy(tab)
# [1] 96.66667

在iris数据集中,使用k近邻法,最终96.7%的准确率。首先,标准化数据集,然后,将标准化值分离为训练和测试数据集。

想象一下,将训练数据集的值绘制在一个图上,然后在运行带有所有必要参数的knn函数后,将测试数据集的值引入到图中,并计算出与图中每个已知数据点的欧氏距离。

我们将花种类的预测值存储在“pr”中,可以将预测值与原始测试数据集的值进行比较。就可以算出模型的准确性,如果有新的50个值,要求预测这50个值的类别,就可以用这个模型。

再来一个

data(diamonds,package = "ggplot2")
dia <- data.frame(diamonds)
head(dia,2)
#   carat     cut color clarity depth table price    x    y    z
# 1  0.23   Ideal     E     SI2  61.5    55   326 3.95 3.98 2.43
# 2  0.21 Premium     E     SI1  59.8    61   326 3.89 3.84 2.31
ran <- sample(1:nrow(dia),0.9 * nrow(dia))
dia_nor <- as.data.frame(lapply(dia[,c(1,5,6,7,8,9,10)], nor))
dia_train <- dia_nor[ran,]
dia_test <- dia_nor[-ran,]
##the 2nd column of training dataset because that is what we need to predict about testing dataset
##also convert ordered factor to normal factor
dia_target <- as.factor(dia[ran,2])##the actual values of 2nd couln of testing dataset to compaire it with values that will be predicted
##also convert ordered factor to normal factor
test_target <- as.factor(dia[-ran,2])
pr <- knn(dia_train,dia_test,cl=dia_target,k=20)
tb <- table(pr,test_target)
accuracy(tb)
## [1] 71.09752

在此数据集中,尝试预测“cut”变量,它是一个分类变量,KNN更适用于分类问题。有一些方法可以在包含分类变量和数值变量的混合数据集执行KNN。其余步骤与对iris数据集操作相同,71%的准确率。

Ps:如果不 set.seed() ,每次取的随机会不一样……要想结果可重复,就 set.seed()

补充一下什么是变量

什么是变量?

来自:https://m.study.163.com/article/1278429200

统计学中的变量指的是研究对象的特征,我们有时也称为属性,例如人的身高、性别等。每个变量都有变量的值和变量的类型。我们按照变量的类型对变量进行划分。统计学中的变量(variables)大致可以分为数值变量(numrical)和分类变量(categorical)。

什么是数值、分类变量?

数值型变量是值可以取一些列的数,这些值对于 加法、减法、求平均值等操作是有意义的。而分类变量对于上述的操作是没有意义的。数值变量又可以分为下面两类:

离散型变量(discrete)

值只能用自然数或整数单位计算,其数值是间断的,相邻两个数值之间不再有其他数值,这种变量的取值一般使用计数方法取得。

连续型变量(continuous)

在一定区间内可以任意取值,其数值是连续不断的,相邻两个数值可作无限分割,即可取无限个数值。如身高、绳子的长度等。和离散型变量相比,连续型变量有“真零点”的概念,所以可以进行乘除操作。分类变量又可以分为下面两类:

有序分类变量(ordinal)

描述事物等级或顺序,变量值可以是数值型或字符型,可以进而比较优劣,如喜欢的程度:很喜欢、一般、不喜欢 。

无序分类变量(nominal)

取值之间没有顺序差别,仅做分类,又可分为二分类变量和多分类变量 二分类变量是指将全部数据分成两个类别,如男、女,对、错,阴、阳等,二分类变量是一种特殊的分类变量,有其特有的分析方法。 多分类变量是指两个以上类别,如血型分为A、B、AB、O。

有序分类变量和无需分类变量的区别是:前者对于“比较”操作是有意义的,而后者对于“比较”操作是没有意义的。

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

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

相关文章

node.js+NPM包管理器+Webpack打包工具+前端项目搭建

javascript运行环境&#xff08;无需依赖html文件&#xff09; BFF&#xff0c;服务于前端的后端 官网下载安装&#xff0c;node -v查看是否安装成功 ①、创建一个01.js文件 //引入http模块 const httprequire(http)//创建服务器 http.createServer(function(request,respo…

C# Onnx GFPGAN GPEN-BFR 人像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Windows.Forms;namespace 图像修复 {public partial class Form1 : For…

传感器信息系统中的节能收集研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

SecureCRT 自动测试脚本的使用方法

脚本示例&#xff08;get_batteryifo_interval_2s.vbs&#xff09;&#xff1a; Sub Main Do While(1)crt.Screen.Send "pm_client batteryinfo" & chr(13)crt.Sleep 2000 Loop End Sub 1. 解压 SecureCRT 压缩包&#xff08;网上下载&#xff09;&#xff1b…

机器人制作开源方案 | 杠杆式6轮爬楼机器人

1. 功能描述 本文示例将实现R281b样机杠杆式6轮爬楼机器人爬楼梯的功能&#xff08;注意&#xff1a;演示视频中为了增加轮胎的抓地力&#xff0c;在轮胎上贴了双面胶&#xff0c;请大家留意&#xff09;。 2. 结构说明 杠杆式6轮爬楼机器人是一种专门用于爬升楼梯或不平坦地面…

基于JAYA优化的BP神经网络(分类应用) - 附代码

基于JAYA优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于JAYA优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.JAYA优化BP神经网络3.1 BP神经网络参数设置3.2 JAYA算法应用 4.测试结果&#xff1a;5.M…

08 | Jackson 注解在实体里面如何应用?常见的死循环问题如何解决?

我们用 Spring Boot 里面默认集成的 fasterxml.jackson 加以说明&#xff0c;这看似和 JPA 没什么关系&#xff0c;但是一旦我们和 Entity 一起使用的时候&#xff0c;就会遇到一些问题&#xff0c;特别是新手同学&#xff0c;我们这一课时详细介绍一下用法。先来跟着我了解一下…

计算机毕业设计选什么题目好?springboot 美食推荐系统

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

clickhouse数据库简介,列式存储

clickhouse数据库简介 1、关于列存储 所说的行式存储和列式存储&#xff0c;指的是底层的存储形式&#xff0c;数据在磁盘上的真实存储&#xff0c;至于暴漏在上层的用户的使用是没有区别的&#xff0c;看到的都是一行一行的表格。 idnameuser_id1闪光10266032轨道物流10265…

基于秃鹰优化的BP神经网络(分类应用) - 附代码

基于秃鹰优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于秃鹰优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.秃鹰优化BP神经网络3.1 BP神经网络参数设置3.2 秃鹰算法应用 4.测试结果&#xff1a;5.M…

性能优化-中间件tomcat调优

Tomcat作用 主要有三个: 管理Servlet应用的生命周期。Tomcat可以管理和控制Servlet应用程序的启动、停止、暂停和恢复等生命周期过程,确保Servlet应用的稳定运行和有序管理。把客户端请求的url映射到对应的servlet。Tomcat作为一个Web服务器,可以将客户端发送的HTTP请求URL…

DL Homework 3

给定训练集,将每个样本输入给前馈神经网络&#xff0c;得到网络输出为,其在数据集上的结构化风险为 首先简单解释一下这堆话&#xff0c;结构化风险经验风险正则化项,经验风险为&#xff0c;对于函数我们大多数采取的为交叉熵函数&#xff0c;,正则化项为&#xff0c;首先神经网…

C# InformativeDrawings 生成素描画

效果 项目 下载 可执行程序exe下载 源码下载

2.1、如何在FlinkSQL中读取写出到Kafka

目录 1、环境设置 方式1&#xff1a;在Maven工程中添加pom依赖 方式2&#xff1a;在 sql-client.sh 中添加 jar包依赖 2、读取Kafka 2.1 创建 kafka表 2.2 读取 kafka消息体&#xff08;Value&#xff09; 使用 format json 解析json格式的消息 使用 format csv 解析…

【从0开发】百度BML全功能AI开发平台【实操:以部署情感分析模型为例】

目录 一、全功能AI开发平台介绍二、AI项目落地应用流程&#xff08;以文本分类为例&#xff09;2-0、项目开始2-1、项目背景2-2、数据准备介绍2-3、项目数据2-4、建模调参介绍2-5、项目的建模调参2-6、开发部署2-7、项目在公有云的部署 附录&#xff1a;调用api代码总结 一、全…

百度车牌识别AI Linux使用方法-armV7交叉编译

1、获取百度ai的sdk 百度智能云-登录 (baidu.com) 里面有两个版本的armV7和armV8架构。v7架构的性能比较低往往需要交叉编译&#xff0c;v8的板子性能往往比较好&#xff0c;可以直接在板子上编译。 解压到ubuntu里面。这里介绍v7架构的。 2、ubuntu环境配置 ubuntu下安装软件…

Bootstrap-媒体类型

加上媒体查询之后&#xff0c;只有在特定的设备之下才能起作用&#xff01;&#xff01;&#xff01;

Win10找不到hosts文件的解决方案

正常情况下&#xff0c;Windows10系统的C:\Windows\System32\drivers\etc目录下应该有hosts文件&#xff0c;但偏偏有些电脑没有&#xff0c;哪怕你打开了查看“隐藏的项目”也没见到hosts文件&#xff0c;如下&#xff1a; 解决方案 1、先点击查看&#xff0c;再点击选项&…

Ant Design Form.List基础用法

使用 Form.List 使用 项目中需要在新增可以多个如图 代码如下 // An highlighted block <Card title"产品信息" bordered{false}><Form.List name"productList" >{(fields, {add, remove}) > (<>{fields.map((field) > (<Ro…

苹果放出快捷指令专题介绍页面,大大提高了 Mac 使用效率

近日&#xff0c;苹果发布 macOS Sonoma 更新的同时&#xff0c;还上线了“《快捷指令》助你效率倍增”专题页面&#xff0c;其目标是在 Mac 上让好用的 App 更强大。 快捷指令功能可以让设备自动完成常用或繁琐的操作&#xff0c;大大提升 Mac 的效率。 快捷指令能帮你在《邮…