当前位置: 首页 > news >正文

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。

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

相关文章:

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

文章目录 前言应用场景欧几里得距离&#xff08;欧氏距离&#xff09;两类、单一属性&#xff08;1D&#xff09;两类、两种属性&#xff08;2D&#xff09;两类、两种以上属性&#xff08;>3D&#xff09; Examples in R再来一个补充一下什么是变量 什么是变量&#xff1f;…...

前端基础一:用Formdata对象来上传图片的原因

最近有人问&#xff1a;你是否能用json来传图片&#xff0c;其实应该这么理解就对了。 一、上传的数据体格式Content-Type 1.application/x-www-form-urlencoded 2.application/json 3.multipart/form-data 以上三种类型旨在告诉服务器需要接收的数据类型同事要…...

CSS的布局 Day03

一、显示模式&#xff1a; 网页中HTML的标签多种多样&#xff0c;具有不同的特征。而我们学习盒子模型、使用定位和弹性布局把内容分块&#xff0c;利用CSS布局使内容脱离文本流&#xff0c;使用定位或弹性布局让每块内容摆放在想摆放的位置&#xff0c;让网站页面布局更合理、…...

nodejs+vue+elementui养老院老年人服务系统er809

“养老智慧服务平台”是运用nodejs语言和vue框架&#xff0c;以MySQL数据库为基础而发出来的。为保证我国经济的持续性发展&#xff0c;必须要让互联网信息时代在我国日益壮大&#xff0c;蓬勃发展。伴随着信息社会的飞速发展&#xff0c;养老智慧服务平台所面临的问题也一个接…...

antd表格宽度超出屏幕,列宽自适应失效

最近遇到个诡异的问题&#xff0c;Table用的好好的&#xff0c;可就有一个页面的表格显示不全&#xff0c;超出浏览器宽&#xff0c;设定表格宽度也没用。 仔细分析了用户上传展示的数据后发现&#xff0c;不自动换行的超宽列都是url地址&#xff0c;一开始还以为是地址里有不…...

布局--QT Designer

一、在我们使用Qt做界面设计时&#xff0c;为了界面的整洁美观&#xff0c;往往需要对界面中的所有控件做一个有序的排列&#xff0c;以及设置各个控件之间的间距等等&#xff0c;为此Qt为界面设计提供了基本布局功能&#xff0c;使用基本布局可以使组件有规则地分布。 1.1 基…...

2024第八届杭州国际智慧城市博览会:建筑与智能,智慧与未来

浙江&#xff0c;中国最具活力的省份之一&#xff0c;将再次迎来一场盛大的智慧城市行业展会。2024年第八届浙江智慧城市博览会&#xff0c;由浙江省土木建筑学会发起主办&#xff0c;以“探索未来&#xff0c;智能引领”为主题&#xff0c;于2024年4月份在美丽的杭州国际博览中…...

Text-to-SQL小白入门(八)RLAIF论文:AI代替人类反馈的强化学习

学习RLAIF论文前&#xff0c;可以先学习一下基于人类反馈的强化学习RLHF&#xff0c;相关的微调方法&#xff08;比如强化学习系列RLHF、RRHF、RLTF、RRTF&#xff09;的论文、数据集、代码等汇总都可以参考GitHub项目&#xff1a;GitHub - eosphoros-ai/Awesome-Text2SQL: Cur…...

C语言联合体和枚举

C语言联合体和枚举 文章目录 C语言联合体和枚举一、联合体①联合体简介②联合体大小的计算 二、枚举 一、联合体 ①联合体简介 union Un {char c;int i; };像结构体一样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。但是编译器只为最大…...

Ubuntu 上传项目到 GitHub

一、前言 GitHub 作为时下最大的开源代码管理项目&#xff0c;广泛被工程和科研人员使用&#xff0c;本文主要介绍如何如何将自己的项目程序上传到 GitHub 上。 要上传本地项目到 GitHub 上&#xff0c;主要分为两步&#xff0c;第一步是 二、创建 SSH keys 首先登录 GitHu…...

CSS 复杂卡片/导航栏特效运用目录

主要是记录复杂卡片/导航栏相关的特效实践案例和实现思路。 章节名称完成度难度文章地址完整代码下载地址多曲面卡片实现完成复杂文章链接代码下载倒置边框半径卡片完成一般文章链接代码下载...

QT: 一种精确定时器类的实现与使用

1&#xff09;类的实现 #ifndef CPRECISETIMER_H #define CPRECISETIMER_H#include <windows.h>class CPreciseTimer { public:CPreciseTimer();bool SupportsHighResCounter();void StartTimer();void StopTimer();__int64 GetTime();private://Auxiliary Functionvoid…...

SQLite4Unity3d安卓 在手机上创建sqlite失败解决

总结 要在Unity上运行一次出现库&#xff0c;再打包进APK内 问题 使用示例代码的创建库 var dbPath string.Format("Assets/StreamingAssets/{0}", DatabaseName); #else// check if file exists in Application.persistentDataPathvar filepath string.Format…...

跨站请求伪造:揭秘攻击与防御

1、什么是CSRF 其目标是在用户不知情的情况下&#xff0c;以用户身份执行未经授权的操作。攻击者通过引诱用户访问恶意网站或点击包含恶意代码的链接&#xff0c;来伪造一个请求发送给服务器&#xff0c;来触发 CSRF 攻击。一旦用户被攻击&#xff0c;他们的登录凭据将被用于执…...

matlab 图像均值滤波

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠翻译,放入付费专栏只为防不要脸的爬虫。专栏值钱的不是本文,切勿因本文而订阅。 一、算法原理 均值滤波是一种常用的线性滤波方法,用于平滑图像并减少噪声。它的实现过程如下: 确定滤波器的大小:选择一个固定的…...

P1433 吃奶酪

#include <iostream> #include <cmath> using namespace std; #define M 15 #define S(n) ((n) * (n)) double indx[M 5], indy[M 5], ans 0, sum 0;//坐标数组&#xff0c;从下标为1开始记录 int n, vis[M 5] { 0 };//vis数组&#xff0c;选过的数字标记为1…...

c++string类的赋值问题

来看问题&#xff1a; 为什么呢&#xff1f;是因为定义string a""时候a没有占用空间&#xff0c;所以没有a[0],a[1],a[3]。如果说string a"hhhhhh"&#xff0c;那么图中a[0],a[1],a[3]就有效了。正确的做法是用连接&#xff0c;或者是定义时写成string a(6…...

服务器中了mkp勒索病毒怎么办?mkp勒索病毒特点,解密数据恢复

Mkp勒索病毒是最近比较流行的勒索病毒&#xff0c;从10月份国庆节假期结束以来&#xff0c;云天数据恢复中心陆续收到很多企业的求助&#xff0c;企业的服务器被mkp勒索病毒攻击&#xff0c;导致企业的众多软件无法正常使用&#xff0c;像用友与金蝶软件都有遭受过mkp勒索病毒的…...

深入探析网络代理与网络安全

随着互联网的快速发展&#xff0c;网络安全问题日益突出&#xff0c;而网络代理技术正成为应对安全挑战的重要工具。本文将深入探讨Socks5代理、IP代理以及它们在网络安全、爬虫开发和HTTP协议中的关键作用&#xff0c;以期帮助读者更好地理解和应用这些技术。 1. Socks5代理&…...

如何开始使用 Kubernetes RBAC

基于角色的访问控制 (RBAC) 是一种用于定义用户帐户可以在 Kubernetes 集群中执行的操作的机制。启用 RBAC 可以降低与凭证盗窃和帐户接管相关的风险。向每个用户授予他们所需的最低权限集可以防止帐户拥有过多的特权。 大多数流行的 Kubernetes 发行版都从单个用户帐户开始,…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...

Bean 作用域有哪些?如何答出技术深度?

导语&#xff1a; Spring 面试绕不开 Bean 的作用域问题&#xff0c;这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开&#xff0c;结合典型面试题及实战场景&#xff0c;帮你厘清重点&#xff0c;打破模板式回答&#xff0c…...