knn k的选取_KNN - 初窥K近邻算法

1>算法概述

KNN: 全名K-NearestNeighbor,K近邻算法,简单讲就是每个样本都可以用最接近的k个邻居表示,或者说共享同一个标签。KNN是一种分类(classification)算法,它输入基于实例的学习(instance-based learning),属于懒惰学习(lazy learning),也就是说没有学习过程,而是事先就已经准备好分类和特征值,可以直接对新样本进行处理分类。

如图所示,绿点为测试样本,我们需要判断它是属于红色标签还是蓝色标签(r/b)。如果k=1,r:b = 2:1,测试样本为红色;如果k=2,r:b=2:3,测试样本为蓝色; 如果k=3,r:b=6:5,测试样本为红色。很显然k的取值对样本影响重大,下文将提及k值选取。

f0074ffd263e0daf26fd26b699801a9b.png

2>算法流程

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

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

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

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

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

3>算法实现

3.1准备数据

0b0190ed5f2d62a47f6bc1056230ec82.png

#scatter详解链接如下:

CSDN-专业IT技术社区-登录

a5df3d2bb95efbff8ac99a49d784d899.png

数据可视化后生成的图如上,其中横轴是肿块大小,纵轴是发现时间。每个点代表不同病人的肿瘤大小和发病时间,根据颜色判断肿瘤是良性还是恶性。

现给出测试样本,判断点x = [8.90933607318, 3.365731514]属于哪种情况。

3.2计算距离

距离可以采用欧氏距离或马氏距离计算,此处采用欧几里得距离计算。

√(∑_(i=1)^n▒(x_i-y_i )^2 )

e36d7bdadb69a1232d239572258326d1.png

使用函数argsort对数组distances进行排序,距离由近到远,返回值为索引。

03fe15d020d4a84cb2e3f22dcc4e602c.png

3.3选取k值

k值选取要适宜,k过大会导致模型简化而失去意义,k值过小则会将模型复杂化并产生过拟合现象。且k最好为奇数,以免出现结果相等的尴尬情况。

在实际应用中,K值一般取一个比较小的数值,例如采用交叉验证法(简单来说,就是一部分样本做训练集,一部分做测试集)来选择最优的K值。有点复杂,此处跳过。

暂且选择k值为6,找出最近的6个点,并记录他们的标签值。

62b821bebf39e82ff128ce4ddfb940a6.png

3.3决策

统计所选点的标签,得到多的一个标签值是多少,即为测试点x的标签。

386cc42e811de8dcf9c0a17fa661c076.png

输出一个字典,“:”前面是数组中的值,后面是统计的数量;我们可以用most_common()方法找出预测值。

40b528d9a66a1ba2e0c1284e2ed2b335.png

至此我们得到了测试点x的标签值为1。

4>自实现完整工程代码

d4169cacbb0f5498fa6b61590c452d22.png

5>算法优缺点

KNN的主要优点有:

  1. 理论成熟,思想简单,既可以用来做分类也可以用来做回归
  2. 天然解决多分类问题,也可用于回归问题
  3. 和朴素贝叶斯之类的算法比,对数据没有假设,准确度高,对异常点不敏感
  4. 由于KNN方法主要靠周围有限的邻近的样本,而不是靠判别类域的方法来确定所属类别的,因此对于类域的交叉或重叠较多的待分样本集来说,KNN方法较其他方法更为适合

KNN的主要缺点有:

  1. 计算量大,效率低。即使优化算法,效率也不高。
  2. 高度数据相关,样本不平衡的时候,对稀有类别的预测准确率低
  3. 相比决策树模型,KNN模型可解释性不强
  4. 维度灾难:随着维度的增加,“看似相近”的两个点之间的距离越来越大,而knn非常依赖距离

#参考链接:

机器学习的敲门砖:kNN算法(上)​mp.weixin.qq.com
0f10161a4fc5b18b7030802841b07551.png
机器学习-KNN算法 - 数月亮 - 博客园​www.cnblogs.com
e0be3d748b16297219efc7e6da1dd8ea.png

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

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

相关文章

前端学习(535):多列布局2

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>css多列布局</title><style>.parent{co…

前端学习(536):多列布局3列得间距

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>css多列布局</title><style>.parent{co…

scp会覆盖同名文件吗_你会Hypermesh一键式完成几何文件到求解文件的输出吗?

前不久&#xff0c;我在仿真秀APP更新了2篇Hypermesh二次开发的文章&#xff0c;介绍了《Hypermesh二次开发之电子产品跌落全流程开发讲解》和《前处理软件Hypermesh二次开发如何从入门到精通》&#xff1b;同步推出了《Hypermesh 二次开发高级培训11讲》线上视频课程&#xff…

前端学习(537):多列布局4横跨多列

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>css多列布局</title><style>.parent,.p…

前端学习(539):全屏布局得实现

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>全屏布局</title><style>html,body{mar…

【翻译】Pro.Silverlight.5.in.CSharp.4th.Edition - 第三章 布局 03

目录&#xff1a;点击这里 上一篇&#xff1a;【翻译】Pro.Silverlight.5.in.CSharp.4th.Edition - 第三章 布局 02 使用Canvas基于坐标布局 到目前为止我们还剩下Canvas没有学习到。Canvas可以让我们使用精确坐标给元素设置位置。对于设计一个以数据为主导的窗体和标准对话框来…

python三级联动菜单_VUE+element三级联动或树形菜单获取最后一项,并加入到表格中...

如下图,要实现的功能如下,勾选三级联动的材料,勾选最后一级的材料,把勾选的材料信息动态添加到下面表格中1 data数据return {options:[], // 三级联动 数据optionsObj : {} //{id: item} 材料id键值对clList: [], // 选中的材料}2 从后台获取三级联动数据getDataTrees(){this.s…

前端学习(542):node得环境搭建

进入官网下载 node.js 建立一个文件夹 直接下一步&#xff0c;下一步 安装完成以后 winr 安装完成 建立一个js文件 找到路径 运行

python语言是非跨平台语言吗_python是跨平台的语言吗

Python是跨平台的&#xff0c;免费开源的一门计算机编程语言。是一种面向对象的动态类型语言&#xff0c;最初被设计用于编写自动化脚本(shell)&#xff0c;随着版本的不断更新和语言新功能的添加&#xff0c;越来越多被用于独立的、大型项目的开发。支持常见的主流平台&#x…

前端学习(544):node的全局模块

//console.log(process.env);let num1parseInt(process.argv[2]) let num2parseInt(process.argv[3])console.log(num1num2);运行

C#笔记(五):文件和流

我们可以知道&#xff0c;在System.IO 命名空间下提供了一系列的类&#xff0c;我们可以通过相应的类进行文件、目录、数据流的操作。System.IO 命名空间 原理&#xff1a;.NET Framework封装了一系列底层的方法&#xff0c;有些直接与Windows API打交道。那么例如创建文件&…

前端学习(545):node的系统模块require

let path require(path);console.log(path.dirname(/node/a/b/c/1.jpg)); console.log(path.basename(/node/a/b/c/1.jpg)); console.log(path.extname(/node/a/b/c/1.jpg)); 运行结果

PHPUnit安装、用法、测试(三)

首先我装的是phpunit 3.6.12 上代码吧&#xff1a; <?php class DataTest extends PHPUnit_Framework_TestCase{public static function provider(){return array(array(0,0,0),array(0,1,1),array(1,0,1),array(1,1,2)); }/***dataProvider provider**/public function te…

oracle使用 union all 用自增序列_值得收藏的Oracle数据库性能优化

值得收藏的Oracle数据库性能优化年尾了&#xff0c;新的一波面试军又要开始了&#xff0c;被问到最多的可能就是性能优化&#xff0c;尤其是数据库性能优化&#xff0c;这个面试题不管是初中高级工程师都会被问到。因此我觉得下面31点ORACLE优化还是值得调几个去面试。也方便以…

java mysql blob 存储图片_Java操作mysql存储图片

http://bbs.chinaunix.net/archiver/tid-2289421.html1把图片当成一个二进制流就可以了。mysql中有可以存储很大的2进制流文件。用的类型是&#xff1a;我们要做的是将一张图片存入Mysql中,在Mysql中用Blob来存储图片和音频等大的数据项.Blob 按其容量可分为四种,分别为:tinybl…

前端学习(547):node的系统模块fs

let fs require(fs);fs.readFile(./a.txt,(err,data)>{if(err){console.log(err);}else{console.log(data.toString());} })fs.writeFile(b.txt,月薪2元,{flag:"a"},(err)>{if(err){throw err} })运行结果