机器学习--KNN算法

news2024/11/15 9:11:54

目录

一、实验目的

二、实验的软、硬件平台

三、实验内容概述

四、实验设计方案

五、实验内容


一、实验目的

通过本实验掌握kNN算法的原理,熟悉kNN算法。

二、实验的软、硬件平台

python 3.6.5

CourseGrading在线实验环境

三、实验内容概述

1.kNN算法简介

k近邻法(k-nearest neighbor, kNN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

  所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时,只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,kNN方法较其他方法更为适合

  上图中,绿色圆要被决定赋予哪个类,是红色三角形还是蓝色四方形?如果K=3,由于红色三角形所占比例为2/3,绿色圆将被赋予红色三角形那个类,如果K=5,由于蓝色四方形比例为3/5,因此绿色圆被赋予蓝色四方形类。

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理,但在类别决策时,只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合。

KNN算法不仅可以用于分类,还可以用于回归。通过找出一个样本的k个最近邻居,将这些邻居的属性的平均值赋给该样本,就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight),如权值与距离成反比。

2.kNN计算流程

计算已知类别数据集中的点与当前点之间的距离;

按照距离递增次序排序;

选取与当前点距离最小的k个点;

确定前k个点所在类别的出现频率;

返回前k个点所出现频率最高的类别作为当前点的预测分类。

根据上述流程实现KNN核心算法

四、实验设计方案

如前所述,kNN算法流程如下:

a.计算已知类别数据集中的点与当前点之间的距离;

b.按照距离递增次序排序;

c.选取与当前点距离最小的k个点;

d.确定前k个点所在类别的出现频率;

e.返回前k个点所出现频率最高的类别作为当前点的预测分类。

在kNN.py中,添加一个函数classify0作为kNN算法的核心函数,该函数的完整形式为:

def classify0(inX, dataSet, labels, k):

其中各个参数的含义如下:

inX - 用于要进行分类判别的数据(来自测试集)

dataSet - 用于训练的数据(训练集)

lables - 分类标签

k - kNN算法参数,选择距离最小的k个点

在上述参数列表中,dataSet为所有训练数据的集合,也就是表示所有已知类别数据集中的所有点,dataSet为一个矩阵,其中每一行表示已知类别数据集中的一个点。inX为一个向量,表示当前要判别分类的点。按照上述算法流程,我们首先应该计算inX这个要判别分类的点到dataSet中每个点之间的距离。dataSet中每个点也是用一个向量表示的,点与点之间的距离怎么计算呢?没错,就是求两向量之间的距离,数学上,我们知道有很多距离计算公式,包括但不限于:

欧氏距离

曼哈顿距离

切比雪夫距离

闵可夫斯基距离

标准化欧氏距离

马氏距离

夹角余弦

汉明距离

杰卡德距离& 杰卡德相似系数

信息熵

这里,我们选择最简单的欧式距离计算方法。设p和q为两向量,则两向量间的欧氏距离为:

在算法流程,输入参数含义,以及距离计算公式都明确了以后,按照kNN算法的流程,我们就可以实现kNN算法了。

五、实验内容

1、KNN算法原理介绍

K-最近邻(K-Nearest Neighbors,KNN)算法是一种基于距离的简单而有效的分类和回归方法。KNN算法的核心思想是:如果一个样本在特征空间中的K个最相似(即K个最近邻)的样本中的大多数属于某个类别,则该样本也很可能属于这个类别。

2、操作步骤详细描述

计算已知类别数据集中的点与当前点之间的距离;

按照距离递增次序排序;

选取与当前点距离最小的k个点;

确定前k个点所在类别的出现频率;

返回前k个点所出现频率最高的类别作为当前点的预测分类。

import numpy as np
import sys

def classify0(inX,dataSet,labels,k):
    num = len(dataSet)
    n=num-1
    ans=np.asarray(inX)
    tmp=np.asarray(inX)
    while n!=0:
        ans = np.append(ans,tmp)
        n-=1
    ans = np.reshape(ans,[num,2])
    ans = ans-dataSet
    ans = ans*ans
    dis = np.zeros([num,1],dtype=int)
    for i in range(num):
        dis[i] = ans[i][0]+ans[i][1]
    ans = np.reshape(dis,[1,num])

    y = np.argsort(ans)
    y=list(y[0])

    dic  =  dict.fromkeys(list(set(labels)), 0)

    for i in range(k):
        dic[labels[y[i]]]+=1

    dic = sorted(dic.items(),key =lambda item:item[1],reverse=True)

    return dic[0][0]
    

dataSet=np.array([[250,100],[270,120],[111,230],[130,260],[200,80],[70,190]])
labels=["理科生","理科生","文科生","文科生","理科生","文科生"]
inX=[105,210]
print(classify0(inX,dataSet,labels,3))


if __name__ == "__main__":
    sys.stdout.encoding = 'utf-8'
    dataSet = np.array([[250, 100], [270, 120], [111, 230], [130, 260], [200, 80], [70, 190]])
    labels = ["理科生", "理科生", "文科生", "文科生", "理科生", "文科生"]
    inX = [105, 210]
    print(classify0(inX, dataSet, labels, 3))
  1. 记录实验结果

  1. 实验现象描述

运行结果显示“文科生”,输出符合预期

5、实验结果分析

kNN算法的指导思想是“近朱者赤,近墨者黑”,由你的邻居来推断出你的类别。先计算待分类样本与已知类别的训练样本之间的距离,找到距离与待分类样本数据最近的k个邻居;再根据这些邻居所属的类别来判断待分类样本数据的类别。用空间内两个点的距离来度量。距离越大,表示两个点越不相似。距离的选择有很多,通常用比较简单的欧式距离。

六、实验反思

根据这次实验实现了一个基本的K-最近邻(K-NN)分类器。K-NN是一种简单的机器学习算法,它根据测试数据点与训练数据集中的点之间的距离来预测测试数据点的类别。以下是对这段代码和K-NN算法的一些思考:

其优点在于:

简单,易于理解,易于实现,无需估计参数,无需训练;

适合对稀有事件进行分类;

特别适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。

缺点:

懒惰算法,对测试样本分类时的计算量大,内存开销大,评分慢;

当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数;

可解释性较差,无法给出决策树那样的规则。

对于K值的设定:

k值选择过小,得到的近邻数过少,会降低分类精度,同时也会放大噪声数据的干扰;而如果k值选择过大,并且待分类样本属于训练集中包含数据数较少的类,那么在选择k个近邻的时候,实际上并不相似的数据亦被包含进来,造成噪声增加而导致分类效果的降低。

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

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

相关文章

企智汇软件:专业项目管理系统,一体化PaaS平台!快速落地项目!

在快速变化的市场环境中,项目管理不再是简单的任务分配和时间跟踪,它更是一门需要精准决策、高效沟通和智能协作的管理工具。然而,面对日益复杂的项目需求、跨部门的协作挑战以及海量的信息数据,传统的项目管理方式往往显得力不从…

mmdeploy环境部署过程中遇到的巨坑

之前已经写了一篇mmdeploy环境部署流程,在使用中却发现了很多问题,特此记录。 注意一: echo "export LD_LIBRARY_PATH/root/TensorRT-8.6.1.6/lib:/root/cudnn/lib:$LD_LIBRARY_PATH" >> ~/.bashrc && \ source ~/…

【AI大模型】ChatTTS——颠覆传统,赋能未来的文本到语音技术

文章目录 一、项目介绍二、代码解释三、从技术角度进行分析四、技术细节与实现五、优缺点分析六、应用场景分析七、未来展望八、结论 一、项目介绍 随着人工智能技术的不断进步,语音合成(TTS)技术得到了飞速发展。ChatTTS项目作为一个开源的…

零基础如何制作一个GIS可视化大屏?免费无难度!

一.GIS是什么? GIS(地理信息系统)开发是一种利用计算机技术对地理信息进行处理、分析、存储和展示的技术。GIS开发可以应用在很多领域,如城市规划、环境保护、交通管理、农业生产等。 二.如何将GIS与数字孪生结合起来&#xff1f…

C++并发之阻塞队列(block,queue)

目录 1 概述2 实现3 测试3 运行 1 概述 最近研究了C11的并发编程的线程/互斥/锁/条件变量,利用互斥/锁/条件变量实现一个支持多线程并发的阻塞队列,队列大小没有限制。 阻塞队列是一个模板类,有两个模块参数,参数1是元素类型&…

小红书营销:解锁企业增长新引擎,与小红书集成实现精准获客

在数字化营销的新时代,小红书以其独特的社区文化和精准的用户定位,成为了品牌和企业争相入驻的热门平台。今天将探讨如何通过小红书平台进行营销获客,并强调与企业集成的重要性,以实现更高效的品牌增长。 一、小红书营销的独特优…

API的优势及应用场景(淘宝API测试的详细步骤)

一、API的优势 API的出现为应用程序间的通信提供了一种新的方式,它有以下优势: 1、降低开发难度 开发者可以通过API访问其他应用程序的数据和功能,避免了重复开发,降低了开发难度。 2、提高开发效率 API提供了一种标准化的通…

JavaWeb系列十一: Web 开发会话技术(Cookie, Session)

韩sir Cookie技术Cookie简单示意图Cookie常用方法Cookie创建Cookie读取JSESSIONID读取指定Cookie Cookie修改Cookie生命周期Cookie的有效路径Cookie作业布置Cookie注意事项Cookie中文乱码问题 Session技术Session原理示意图Session常用方法Session底层机制Session生命周期Sessi…

山洪灾害无线预警广播系统解决方案

一、国家政策 2021年水利部印发了《全国山洪灾害防治项目实施方案(2021-2023年)》,提出“到2023年,山洪灾害防治体系进一步健全,监测预警能力进一步提升,努力补齐山洪灾害防治当前存在的明显短板”的建设目…

ArcGIS Desktop使用入门(四)——ArcMap软件闪退无法打开问题

系列文章目录 ArcGIS Desktop使用入门(一)软件初认识 ArcGIS Desktop使用入门(二)常用工具条——标准工具 ArcGIS Desktop使用入门(二)常用工具条——编辑器 ArcGIS Desktop使用入门(二&#x…

【前端项目笔记】5 分类管理

分类管理 效果展示: 创建商品管理的子分支 git代码回顾 git branch 查看所有分支(*代表当前所处分支) git checkout -b goods_cate 新建分支goods_cate git push -u origin goods_cate 将当前分支保存到云端origin命名为goods_cate&#x…

CVPR24新作:教你网络“影分身术”,半小时生成专属数字人的GaussianAvatar

论文标题: GaussianAvatar: Towards Realistic Human Avatar Modeling from a Single Video via Animatable 3D Gaussians 论文作者: Liangxiao Hu, Hongwen Zhang, Yuxiang Zhang, Boyao Zhou, Boning Liu, Shengping Zhang, Liqiang Nie 项目地址&…

如何运用Midjourney探究新中式美学?

新中式美学最近真是越来越火了,把传统中式元素和现代设计结合起来,不仅看着舒服,还特别有文化韵味。 1. 研究和准备 首先,得先弄清楚什么是新中式美学。说白了,就是把传统中式元素和现代设计结合起来。你可以看看相关…

费控4.0全面解决方案从源头破解企业费用管理痛点

随着企业数字化变革的加速,费控报销正处于最具有发展潜力的细分赛道,且无疑是具有 “长坡厚雪”属性的投资标的。但回归企业管理视角,作为一个用于企业非生产性费用管理的管理工具,费控报销平台的评判标准只有两个:好不…

开通商家转账到零钱最简单直接的办法

想要一次性开通微信支付商家转账到零钱功能,您可以按照以下步骤进行操作: 首先,确保您的商户号主体是没有正在处罚中的公司。个体工商户目前暂不支持此功能。同时,仔细检查是否存在严重的违规处罚记录,如果只是轻微的风…

剪辑如何剪辑制作视频短视频剪辑学习怎么学,难吗?

工欲善其事必先利其器,有一个好的工具能让你的工作如鱼得水,果你想在短视频中制作精良的视频,你就考虑电脑制作软件了。果你想制作精良的视频,你就考虑电脑制作软件了。 如何找到剪辑软件了?你可以直接去软件的官方。你…

常见的排序算法【总结】

目录 排序的基本概念与分类排序的稳定性内排序与外排序简单排序冒泡排序时间复杂度: O ( n 2 ) O(n^2) O(n2) 简单选择排序排序原理:时间复杂度: O ( n 2 ) O(n^2) O(n2) 插入排序排序原理:时间复杂度: O ( n 2 ) O(n^…

MCP2515汽车CAN总线支持SPI接口的控制器芯片替代型号DPC15

器件概述 DPC15是一款独立CAN控制器,可简化需要与CAN总线连接的应用。可以完全替代兼容MCP2515 图 1-1 简要显示了 DPC15 的结构框图。该器件主要由三个部分组成: 1. CAN 模块,包括 CAN 协议引擎、验收滤波寄存 器、验收屏蔽寄存器、发送和接…

解锁最强比较工具Beyond_Compare十大功能及下载注册

Beyond Compare是一款功能强大的文件和文件夹比较工具,以下是其十大用法: 文件内容比较: Beyond Compare能够详细比较两个文件的内容,以绿色表示添加的内容,红色表示删除的内容,黄色表示修改的内容。 用户…

基线管理是什么

0、背景 作为数据开发人员,我们日常工作的一部分就是夜间值班。”夜间值班“对于没有实际工作经验的同学来说可能比较陌生。 所谓夜间值班,主要是为了保证数据可以在我们的对外承诺时间前产出。而由于日常生产任务依赖关系异常复杂,上游任务…