经典深度学习算法【1】:K-近邻算法(KNN)概述

news2024/12/25 9:03:15

最简单最初级的分类器是将全部的训练数据所对应的类别都记录下来,当测试对象的属性和某个训练对象的属性完全匹配时,便可以对其进行分类。但是怎么可能所有测试对象都会找到与之完全匹配的训练对象呢,其次就是存在一个测试对象同时与多个训练对象匹配,导致一个训练对象被分到了多个类的问题,基于这些问题呢,就产生了KNN。

KNN是通过测量不同特征值之间的距离进行分类。它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别,其中K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。

下面通过一个简单的例子说明一下:如下图,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

在这里插入图片描述
由此也说明了KNN算法的结果很大程度取决于K的选择。
在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:
在这里插入图片描述
同时,KNN通过依据k个对象中占优的类别进行决策,而不是单一的对象类别决策。这两点就是KNN算法的优势。
接下来对KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

1)计算测试数据与各个训练数据之间的距离;

2)按照距离的递增关系进行排序;

3)选取距离最小的K个点;

4)确定前K个点所在类别的出现频率;

5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。

Python实现

 1. #coding:utf-8
 2.  
 3. from numpy import *
 4. import operator
 5.  
 6. ##给出训练数据以及对应的类别
 7. def createDataSet():
 8.     group = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
 9.     labels = ['A','A','B','B']
10.     return group,labels
11.  
12. ###通过KNN进行分类
13. def classify(input,dataSe t,label,k):
14.     dataSize = dataSet.shape[0]
15.     ####计算欧式距离
16.     diff = tile(input,(dataSize,1)) - dataSet
17.     sqdiff = diff ** 2
18.     squareDist = sum(sqdiff,axis = 1)###行向量分别相加,从而得到新的一个行向量
19.     dist = squareDist ** 0.5
20.     
21.     ##对距离进行排序
22.     sortedDistIndex = argsort(dist)##argsort()根据元素的值从大到小对元素进行排序,返回下标
23.  
24.     classCount={}
25.     for i in range(k):
26.         voteLabel = label[sortedDistIndex[i]]
27.         ###对选取的K个样本所属的类别个数进行统计
28.         classCount[voteLabel] = classCount.get(voteLabel,0) + 1
29.     ###选取出现的类别次数最多的类别
30.     maxCount = 0
31.     for key,value in classCount.items():
32.         if value > maxCount:
33.             maxCount = value
34.             classes = key
35.  
36.     return classes    

参考: OpenCV中文官方文档

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

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

相关文章

【Java】线程池的创建

目录 ​编辑 一、什么是线程池 二、创建和使用 导入必要的包: 创建线程池: 提交任务给线程池执行: 自定义Runnable和Callable任务: 关闭线程池: 我的其他博客 一、什么是线程池 在Java中,线程池是…

phpy 连接 PHP与Python生态 跨界合作 PHPY搭建 已解决

目录 需求介绍 安装 windows版本 文件地址 运行效果 需求介绍 在日常功能开发中,难免会使用python的计算库,同时自己要是一名PHP开发工程师。就在最近有相应的需求,索性使用phpy来进行功能开发 安装 windows版本 phpy 是识沃团队最新推出…

系列三、DDL

一、DDL 1.1、概述 DDL是英文单词Data Definition Language的缩写,中文意思为数据定义语言,是用来定义数据库对象(数据库,表,字段)的。 1.2、数据库操作 1.2.1、查询所有数据库 show databases; 1.2.2、创建数据库 # 语法 cre…

TrustZone之安全虚拟化

在Armv7-A首次引入虚拟化时,它仅在非安全状态中添加。在Armv8.3之前,Armv8也是如此,如下图所示: 如前所述在切换安全状态时,EL3用于托管固件和安全监视器。安全EL0/1托管受信任的执行环境(TEE),由受信任的服务和内核组成。 在安全状态下,没有对多个虚拟机的需…

IntelliJ IDEA无公网环境远程访问Linux服务器进行开发

文章目录 1. 检查Linux SSH服务2. 本地连接测试3. Linux 安装Cpolar4. 创建远程连接公网地址5. 公网远程连接测试6. 固定连接公网地址7. 固定地址连接测试 本文主要介绍如何在IDEA中设置远程连接服务器开发环境,并结合Cpolar内网穿透工具实现无公网远程连接&#xf…

01-进程和线程的概述

进程和线程的相关概念 概述 进程是一个运行中的应用程序,一个进程是一个执行中的软件 每打开一个软件就相当于启动了一个进程 , 操作系统就会为该进程分配一个内存空间, 进程A和进程B的内存独立不共享 线程是由进程创建的,一个进程可以启动多个线程,线程是一个进程中的执行…

AI 在智能制造:推动创新与效率的提升

AI在智能制造中的应用,正在不断推动着智能制造的发展,为制造业带来巨大的创新和变革。 随着AI科技的不断创新发展,人工智能(AI)在许多领域都取得了显著的进步,其中之一就是智能制造。智能制造是指通过集成…

Vue3-17-ref 模板引用的基本使用

什么是模板引用 简单来说,就是在 js 代码中 获取到 html 中的dom元素的完整信息, 从而实现直接操作dom元素的效果。模板引用的语法 1、给 dom 元素添加 ref名称 属性,指定一个独有的名称; 2、js 中 声明一个 与 dom 元素的 ref 同…

Linux--fork创建子进程详解

目录 一.初识fork函数 二.fork的返回值 三.fork原理 1.fork是如何创建子进程的? 2.为什么fork会有两个返回值? 3.为什么父进程的返回值是子进程的pid,子进程返回值是0? 4.fork之后,父子进程谁先运行?…

SpringBoot2初始入门

适配器 任务调度 父项目、webstarter、bulid 版本管理 自动配置 Spring、SpringMVC 扫描包:主程序及其子包 底层注解: Configuration、Bean 单实例 proxyBeanMethodstrue,组件依赖 Import Conditioal(name"")条件…

访问修饰符

1.java提供四种访问控制修饰符号,用于控制方法和属性(成员变量)的访问权限(范围)。 1.公开级别:用public修饰,对外公开 2.受保护级别:用protected修饰,对子类和同一个包中的类公开 3.默认级别:没用修饰符,向同一个包的类公开 4.私有级别:用private修饰,只有本类可以访问,不…

智能优化算法应用:基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于模拟退火算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.模拟退火算法4.实验参数设定5.算法结果6.…

如何处理好面试中的“压力测试”?

作为一名求职者,在面试时有时遇到的是压力测试,有时则遇到的是一些无良企业单位,究竟如何把握忍耐的限度,才合格当一个能经受压力的员工,才能避免对无良单位的一味隐忍! 压力面试是指有意制造紧张,以了解求…

VR播控系统深耕VR教学领域,助力开启未来新课堂

作为提升教育质量的技术之一,VR技术已经逐渐成为培养新一代人才、提升教学质量的重要方式,相比于传统教育,VR技术在教学方面的应用,所带来的变化和效果提升都是非常明显的,尤其是VR播控系统的上线,作为VR教…

MATLAB图解傅里叶变换(初学者也可以理解)

1、概述 相信很多人对于傅里叶变换可能觉得比较复杂和有点难懂,其实不难,它只是一种积分变换。 傅里叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。也就是说&qu…

gRPC框架

1、gRPC 与 Protobuf 介绍 微服务架构中,由于每个服务对应的代码库是独立运行的,无法直接调用,彼此间 的通信就是个大问题gRPC 可以实现微服务, 将大的项目拆分为多个小且独立的业务模块, 也就是服务, 各服…

DSP280049C初学(4)-FLASH烧录以及部分程序转移至RAM运行

DSP280049C初学(4)-FLASH烧录以及部分程序转移至RAM运行 实现目的:代码在RAM中调试完成后,就需要将其固化下载到FLASH中,但是FLASH中运行所有程序的话会存在计算或程序运行时间过长的问题,故还需要将部分代…

【C语言初阶】什么操作符你还没搞懂?试试这篇文章让你彻底理解各种操作符!

🎬 鸽芷咕:个人主页 🔥 个人专栏:《C语言初阶篇》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 文章目录 一、 算术操作符:1.1 加减乘除 二、 移位操作符:2.1 计算机中整数的存储2.2 >> 右…

arp欺骗原理以及实现方式

我们知道了arp的作用,那么此时我们怎么可以用他来进行攻击呢?在一个局域网中,我们怎么实现呢? 原理: 这样B就可以做到中间人了,可以接受到两个主机的数据了。换句话来说,在同一个局域网内&…

JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)

目录 JVM 详解(JVM组成部分、双亲委派机制、垃圾回收算法、回收器、回收类型、了解调优思路)1、概念:什么是 JVM ?JVM 的作用? 2、JVM 的主要组成部分?类加载器(Class Loader):简单…