k-近邻算法

2023-11-16

k-近邻算法


k-近邻算法概述

k-近邻算法(k-NearestNeighor Algorithm)是采用测量不同特征值之间的距离方法进行分类,简称kNN。

这里用到的距离计算是欧几里德距离。

工作原理:存在一个样本数据集合(x_{1}^{i},x_{2}^{i},...,x_{k}^{i},y^{i})i\rightarrow(0,n),也称作训练样本集,并且样本集中每条数据都存在标签y^{i},即我们知道样本集中每一数据与所属分类的对应关系。输入没有标签的新数据后(x_{1},x_{2},...,x_{k}),将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。

距离计算如下:

  

然后把d按照从小到大排序,选择k个最相似数据中出现次数中最多的分类,作为新数据的分类。

kNN除了做分类任务,还可以做回归任务,在后面的章节中会讲到。


k-近邻算法的一般流程

(1)收集数据:方法不限

(2)准备数据:距离计算所需要的数值,最好是结构化的数据格式

(3)分析数据:方法不限

(4)训练算法:此步骤不适用于k-近邻算法(不需要训练,直接计算距离,找出距离最近的k个

(5)测试算法:计算错误率

(6)使用算法:首先需要输入样本数据和结构化的输出结果,然后运行k-近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理


代码实现

所有代码实现都是在python集成的IDLE上完成,创建名为kNN.py的python模块,本节使用的代码都在这个文件中。

1.导包

'''
KNN是一种最简单最有效的算法,但是KNN必须保留所有的数据集,
如果训练数据集很大,必须使用大量的存储空间,
此外,需要对每一个数据计算距离,非常耗时
另外,它无法给出任何数据的基础结构信息(无法给出一个模型)
'''
from numpy import *
import operator
import matplotlib
import matplotlib.pyplot as plt
from os import listdir
import numpy as np
import matplotlib as mpl
import matplotlib.lines as mlines

2.导入数据

#使用python导入数据,创建数据集和标签
def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels

#每次使用数据,调用该函数即可

3.实施kNN分类算法

'''
伪代码
对未知类别属性的数据集中的每个点依此执行以下操作
1、计算已知类别数据集中的点与当前点之间的距离;
2、按照距离递增次序排序;
3、选取与当前点距离最小的k个点;
4、确定前k个点所在的类别的出现频率;
5、返回前k个点出现频率最高的类别作为当前点的预测分类。
'''

#实施kNN分类算法
def classify0(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]#查看矩阵的维度
    diffMat = tile(inX,(dataSetSize,1)) - dataSet
    #tile(数组,(在行上重复次数,在列上重复次数))
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    #sum默认axis=0,是普通的相加,axis=1是将一个矩阵的每一行向量相加
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    #sort函数按照数组值从小到大排序
    #argsort函数返回的是数组值从小到大的索引值
    classCount={}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
        #get(key,k),当字典dic中不存在key时,返回默认值k;存在时返回key对应的值
    sortedClassCount = sorted(classCount.items(),
           key=operator.itemgetter(1),reverse=True)
    #python2中用iteritems,python3中用items代替;operator.itemgetter(k),返回第k个域的值
    return sortedClassCount[0][0]

4、测试

#测试KNN
#>>> import KNN
#>>> group,labels = KNN.createDataSet()
#>>> KNN.classify0([0,0],group,labels,3) # B
#>>> KNN.classify0([1.2,1.5],group,labels,3) # A

自行测试~


总结

本节实现了比较简单的k-近邻算法,相信看完会加深对kNN的理解!

欢迎交流~

下一节将会结合一个实例-手写数字识别系统来加深对kNN的理解!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

k-近邻算法 的相关文章

随机推荐

  • 微服务-API网关-权限控制

    权限控制介绍 权限控制是一个古老的话题 你可能会想有没有什么权限设计方案可以满足所有的应用场景呢 答案是没有 就像几乎所有问题一样 没有一种系统可以解决所有情况的 我们需要根据不同的场景和需求来设计不同的系统 权限控制主要设计用户 角色 组
  • CCIE面试题

    前言 这里是几个月前在网上转载很多的CCIE面试题 题虽然不难 但如果没有在电信或cisco代理商工作过 仅仅凭书面的知识还是回答不全的 下面是网上的参考答案加上我的一点点补充 以后有时间再补充 先贴出来供大家参考 也让从事相关技术的人自我
  • YOLOV5更换轻量级的backbone:mobilenetV2

    目录 简洁概要 修改主干网络 一 添加自己主干网络 二 在yolo py中添加common中的两个函数 三 制作mobilenetv2的yaml配置文件 四 制作数据集VOC的yaml配置文件 五 启用训练 六 性能检测 简洁概要 Mobi
  • Elasticsearch 8.8.0 发布

    Elasticsearch 是一个基于 Lucene 库的搜索引擎 它提供了一个分布式 支持多租户的全文搜索引擎 具有 HTTP Web 接口和无模式 JSON 文档 Elasticsearch 基于 Java 开发 并在 SSPL Ela
  • 使用mongo命令工具操作集合数据

    与 MongoDB 建立连接 mongo 如果设置了密码 使用这行命令 mongo port 27017 u admin p xxxxxx authenticationDatabase admin 以操作八月创建的历史数据为例 确认操作集合
  • docker 启动时错误docker: Cannot connect to the Docker daemon

    在学习docker的时候遇到一个错误docker Cannot connect to the Docker daemon at unix var run docker sock Is the docker daemon running 如下
  • make[1]: [persist-settings] Error 2 (ignored) CC adlist.o /bin: cc: command not found make[1]: *

    Linux系统安装Redis执行Make编译时报错 make 1 persist settings Error 2 ignored CC adlist o bin cc command not found make 1 adlist o E
  • 微信小程序 scroll-view的滚动条设置

    小程序的scroll view用的比较多了 列表页一般也没管它的滚动条 最近突然发现在android与ios中横向滑动的时候表现不一样 不一样在哪呢 ios上直接就不显示啊 也是没谁了 深入想了一下 这滚动条能不能换一颜色或者换个样式 有这
  • 基于AIOT技术的智慧校园空调集中管控系统设计与实现

    AIOT技术的智慧校园空调集中管控系统设计与实现本科毕业论文 I 引言 本文旨在探讨基于AIOT技术的智慧校园空调集中管控系统的设计和实现 首先 综述当前AIOT技术发展状况和智慧校园空调集中管控系统在当前应用领域中的重要性 其次 分析相关
  • 原理图符号(原理图库)创建流程及注意事项

    参考资料 电巢EMEA体验营二期 1 原理图符号创建流程 1 0 元器件属性 以一款压力传感器芯片LPS22HH为例 来讲解原理图符号的创建流程 LPS22HH的引脚描述如下所示 1 1 创建工程 1 2 创建原理图符号文件 创建完成原理图
  • Xilinx BUFGMUX使用注意事项

    Xilinx BUFGMUX使用注意事项 最近使用Xilinx FPGA的时候 需要用到一个外部时钟和一个PLL产生的时钟 可以通过外部SWICH进行时钟的切换 觉得这种方式可以通过原语例化完成 原语 果不其然 在原语示例中找到了类似的模块
  • java基础:浅谈泛型

    1 为什么要使用泛型 给一段代码 import java util ArrayList import java util List public class GenericList error public static void main
  • 解决“The method XXXXXX of type XXXXXXXXX must override a superclass method”

    我的Eclipse版本是3 6 1 Override 时出现以下错误 The method XXXXXX of type XXXXXXXXX must override a superclass method 上网搜索原来原因是 实现类里面
  • Docker 部署Streamlit项目

    文章目录 前言 关于streamlit Docker 部署Streamlit项目 Streamlit如何部署到云服务器 1 安装docker 2 拉取python镜像 2 1 什么是DockerHub 2 2 配置docker加速器 2 3
  • SpringMVC增删改查(CRUD)的实现

    目录 前言 一 前期准备 1 pom xml 依赖与插件的导入 2 jdbc properties 数据库连接 3 log4j2 xml 日志文件 4 spring mybatis mybatis与spring整合文件 5 spring c
  • 解决AttributeError: module 'tensorflow' has no attribute 'ConfigProto'

    使用CUDA10 1加上Tensorflow 2 0会出现AttributeError module tensorflow has no attribute ConfigProto 这个问题 这个是由于现在新版本中一些1 0版本的函数被和2
  • Android自动化测试中操作技巧合集(建议收藏)

    Android自动化测试中短信验证码的操作技巧 一 内容提供器机制简介 Android 系统采用了内容提供器 ContentProvider 机制来管理不同应用的数据访问 内容提供器为不同应用间的数据共享提供了接口 它们像是一个中央数据仓库
  • 快速中值求取算法

    中值 顾名思义 就是指一个从小到大的序列的中间的那一个数 一般的讲 中值比平均值还要更加稳定 如一个序列中的某一个值被误乘以了100 平均值则会有很大的波动 但是中位数则不会发生太大的变化 但是如果对数据先排序 然后再进行取中值 则比较耗时
  • Spring3与安全框架apache shiro的整合

    shiro是一个很不错的安全框架 相对Spring security 来说要简单易用的多 使用shiro来做web的权限子系统是不错的选择 下面记录一下shiro和Spring整合的过程 Applicationcontext shiro x
  • k-近邻算法

    k 近邻算法 k 近邻算法概述 k 近邻算法 k NearestNeighor Algorithm 是采用测量不同特征值之间的距离方法进行分类 简称kNN 这里用到的距离计算是欧几里德距离 工作原理 存在一个样本数据集合 i 0 n 也称作