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.mzph.cn/news/104540.shtml

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

相关文章

React之setState

一、useState使用规则 1、useState 函数可以执行多次&#xff0c;每次执行互相独立&#xff0c;每调用一次为函数组件提供一个状态 2、useState只能出现在【函数组件】或者其他hook函数中 3、不能嵌套在if/for/其它函数中&#xff08;react按照hooks的调用顺序识别每一个hook&…

ubuntu下yolov5 tensorrt模型部署

文章目录 ubuntu下yolov5 tensorrt模型部署一、Ubuntu18.04环境配置1.1 安装工具链和opencv1.2 安装Nvidia相关库1.2.1 安装Nvidia显卡驱动1.2.2 安装 cuda11.31.2.3 安装 cudnn8.21.2.4 下载 tensorrt8.4.2.41.2.5 下载仓库TensorRT-Alpha并设置 二、从yolov5源码中导出onnx文…

力扣第108题 将有序数组转二叉搜索树 c++

题目 108. 将有序数组转换为二叉搜索树 简单 相关标签 树 二叉搜索树 数组 分治 二叉树 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 高度平衡 二叉搜索树。 高度平衡 二叉树是一棵满足「每个节点的左右两个子树…

【iOS】Mac M1安装iPhone及iPad的app时设置问题

【iOS】Mac M1安装iPhone及iPad的app时设置问题 简介一&#xff0c;设置问题二&#xff0c;适配问题 简介 由于 苹果M1芯片的Mac可用安装iPhone以及iPad应用&#xff0c;因为开发者并没有适配Mac&#xff0c;因此产生了很多奇怪问题&#xff0c;这里总结归纳Mac M1安装iPhone和…

五、OSPF动态路由实验

拓扑图&#xff1a; 基本ip的配置已经配置好了&#xff0c;接下来对两台路由器配置ospf协议&#xff0c;两台PC进行跨网段通讯 R1与R2构成单区域OSPF区域0&#xff0c;首先对R1进行配置 首先进入ospf 默认进程1&#xff0c;router id省略空缺&#xff0c;之后进入area 0区域&…

迁移学习--预训练微调

目录 1、迁移学习作用 2、迁移学习的途径 3、相关的领域 4、在计算机视觉中的应用 5、迁移学习的办法 预训练模型 微调 6、总结 1、迁移学习作用 定义&#xff1a;能在一个任务学习一个模型&#xff0c;然后用来解决相关的别的任务&#xff0c;这样我们在一个地方花…

一种用于肽图分析的烷化剂,Desthiobiotin-Iodoacetamide

中文名&#xff1a;脱硫生物素-碘乙酰胺 英文名&#xff1a;Desthiobiotin-Iodoacetamide 化学式&#xff1a;C14H25IN4O3 分子量&#xff1a;424.28 外观&#xff1a;固体/粉末 规格&#xff1a;10mg、25mg、50mg等&#xff08;接受各种规格的定制服务&#xff0c;具体可…

Elasticsearch:使用 Langchain 和 OpenAI 进行问答

这款交互式 jupyter notebook 使用 Langchain 将虚构的工作场所文档拆分为段落 (chunks)&#xff0c;并使用 OpenAI 将这些段落转换为嵌入并将其存储到 Elasticsearch 中。然后&#xff0c;当我们提出问题时&#xff0c;我们从向量存储中检索相关段落&#xff0c;并使用 langch…

C# InformativeDrawings 生成素描画

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

竞赛选题 深度学习+python+opencv实现动物识别 - 图像识别

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络3.1卷积层3.2 池化层3.3 激活函数&#xff1a;3.4 全连接层3.5 使用tensorflow中keras模块实现卷积神经网络 4 inception_v3网络5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; *…

Swagger3.0 与spring boot2.7x 整合避免swagger2.0与boot2.7冲突

注释掉2.0引入的俩包 直接引入3.0 <dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version></dependency> swagger配置文件粘贴即用哦 import org.springfram…

git多分支、git远程仓库、ssh方式连接远程仓库、协同开发(避免冲突)、解决协同冲突(多人在同一分支开发、 合并分支)

1 git多分支 2 git远程仓库 2.1 普通开发者&#xff0c;使用流程 3 ssh方式连接远程仓库 4 协同开发 4.1 避免冲突 4.2 协同开发 5 解决协同冲突 5.1 多人在同一分支开发 5.2 合并分支 1 git多分支 ## 命令操作分支-1 创建分支git branch dev-2 查看分支git branch-3 分支合…

抖音直播招聘小程序可以增加职位展示,提升转化率,增加曝光度

抖音直播招聘报白是指进入抖音的白名单&#xff0c;允许在直播间或小视频中发布招聘或找工作等关键词。否则会断播、不推流、限流。抖音已成为短视频流量最大的平台&#xff0c;但招聘企业数量较少。抖音招聘的优势在于职位以视频、直播方式展示&#xff0c;留存联系方式更加精…

伦敦银单位转换很简单

伦敦银源自于英国伦敦的电子化的白银投资方式&#xff0c;高杠杆和高收益的它的基本属性&#xff0c;但有别于国内大家所熟悉的投资品种&#xff0c;伦敦银在交易过程中有很多不一样的地方&#xff0c;需要大家地去留意。 比如伦敦银的计价单位是盎司&#xff0c;而且具体来说…

我们又组织了一次欧洲最大开源社区活动,Hugging Face 博客欢迎社区成员发帖、Hugging Chat 功能更新!...

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」。本期 Hugging News 有哪些有趣的消息&#xff0…

应用在汽车发动机温度检测中的高精度温度传感芯片

汽车发动机是为汽车提供动力的装置&#xff0c;是汽车的心脏&#xff0c;决定着汽车的动力性、经济性、稳定性和环保性。根据动力来源不同&#xff0c;汽车发动机可分为柴油发动机、汽油发动机、电动汽车电动机以及混合动力等。 常见的车用温度传感器有进气温度传感器、变速器…

Mysql数据库 1.概述

Mysql内容概述 1. Mysql概述 数据库相关概念&#xff1a; 名称 全称 简称 数据库 存储数据的仓库&#xff0c;数据是有组织的进行存储 …

云原生Kubernetes:K8S集群版本升级(v1.20.6 - v1.20.15)

目录 一、理论 1.K8S集群升级 2.集群概况 3.升级集群 4.验证集群 二、实验 1.升级集群 2.验证集群 三、问题 1.给node1节点打污点报错 一、理论 1.K8S集群升级 &#xff08;1&#xff09;概念 搭建K8S集群的方式有很多种&#xff0c;比如二进制&#xff0c;kubeadm…

Chrome插件精选 — 鼠标手势插件

Chrome实现同一功能的插件往往有多款产品&#xff0c;逐一去安装试用耗时又费力&#xff0c;在此为某一类型插件记录下比较好用的一款或几款&#xff0c;便于节省尝试的时间和精力。 下面是两款比较好用的鼠标手势插件&#xff0c;支持很多设置选项&#xff0c;可以自定义手势&…

【问题思考】为什么SCAN CSCAN会导致磁臂黏着而FCFS不会导致磁臂黏着?

问题 这道18年的真题引起了我的疑惑&#xff0c;SCAN和CSCAN我认为应该也不会导致磁臂黏着&#xff0c;因为他们对于一个访问序列&#xff0c;比如19&#xff0c;24&#xff0c;52&#xff0c;现在正往外走&#xff0c;但是来了一个12的&#xff0c;不是早晚会往回走&#xff…