kNN算法及python实现

kNN算法是一种基于实例的学习,用于分类和回归。它通过计算待测样本与训练集中样本的距离,选取最近的k个样本,依据这些样本的类别决定新数据的类别。算法关键包括选择合适的距离度量(如欧氏距离)、确定合适的k值,并考虑训练集大小和计算效率。k值的选择至关重要,通常使用交叉验证确定。尽管kNN算法简单,但计算复杂度高,适用于小规模数据集和多分类问题。
摘要由CSDN通过智能技术生成

kNN算法

算法概述

kNN算法又称为k近邻分类(k-nearest neighbor classification)算法,可以解决分类和回归的问题。kNN算法主要是通过距离判定出训练集中离待测样本最近的k个样本,然后统计这k个样本的类别,次数最多的类别或加权后距离最小的点的类别为新数据的类别。距离越近,类别判定的准确度越高。

算法原理

kNN算法有3个主要因素:训练集、距离衡量、k值。
训练集少且种类少的时候算法有效,训练集大的时候要使用KD树和球树的方法建立模型。
距离衡量的方法有多种,目的都是搜索最近邻,最常用的是欧氏距离。
k值决定了最后确定类别时所参考的样本数量,k值过大则训练误差增大,选取的临近点中包含错误种类的可能性增大,导致结果不准确;k值过小则泛化误差增大,模型容易受到噪声干扰,容易过度拟合。因此k值的选取非常重要,一般先选取一个很小的值,再使用交叉检验确定最优的k值,一般都低于训练样本的平方根。

算法步骤如下所示:

  1. 计算距离:给出训练集数据和待测样本数据,计算待测样本离训练集中每个样本的距离
    计算距离的方法有很多,常用的有欧氏距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离和余弦距离等,其中对于数字类型的样本来说最常用的是欧式距离,文本分类时最常用余弦距离。
    欧氏距离:也称欧几里得度量,是最常用的距离表示的方法,即在n维空间中,两点
    在这里插入图片描述

    在这里插入图片描述
    之间的距离为:在这里插入图片描述
    当每个维度的度量不相同时会导致结果的不准确,例如将第一维度为某一条微博的转发量,第二维度为其评论量,第三维度为其点赞量时,因为点赞量一般比转发量、评论量大很多倍,因此计算过程中转发评论量显示出的类别差异可能会被点赞量所掩盖,因此当维度度量差异大时我们会先分别针对每个维度进行标准化消除这种差异带来的误差。
    在这里插入图片描述

  2. 找k个最近样本:给定k值,根据求出的距离选定距离最近的k个样本
    利用交叉检验确定最优的k值,即将数据临时分为训练集和测试集,从k=1开始测试,最大不能超过样本数据的平方根,从中选出效果最好的k值。

  3. 定类别:根据最近的k个样本的类别,确定待测样本的类别
    一般有两种方法确定类别:第一,类别定为k个样本中出现次数最多的类别;第二,距离加权法,在k个样本中,权重为距离平方的倒数,每个点都赋值为1,对相同种类的点进行加权求和,最后值最大的种类为待测样本的种类。

当数据量非常大或特征特别多时,一般使用KD树或球树法建模。

优缺点

1、 优点
简单易懂,易于实现,无需估计参数和反腐训练;适合对稀有事件进行分类;
特别适合于多分类问题(multi-modal,对象具有多个类别标签),例如根据基因特征来判断其功能分类,kNN比SVM的表现要好

2、缺点
kNN是懒惰算法,没有提前训练,输入待测样本时才选定k个最近样本,对测试样本分类时的计算量大,要从头开始计算每个样本离待测样本的距离,速度慢;可解释性较差,无法给出决策树那样的规则。

应用

在文件data111.txt中我们有40个点的坐标,其分别属于0,1,2,3类,类别数据储存在文件data2.txt中

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值