复盘一篇浅谈KNN的文章

认识-什么是KNN

KNN 即 K-nearest neighbors, 是一个hello world级别, 但被广泛使用的机器学习算法, 中文叫K近邻算法, 是一种基本的分类和回归方法.

KNN既可用来分类, 也可用于回归, 不过我还是觉得分类好一些哦

KNN的核心思想是, 如果一个样本, 在特征空间中的K个最相邻的样本中的大多数属于某一个类别, 则该样本也属于该类别, 即"近朱者赤, 近墨者黑". 这样子兄嘚, 最通俗一点, 每个数据其实就是一个向量, 画成图就是一个点嘛, 每个样本就是一个点, 然后计算这个点到其他所有点的距离, 降序取前K个结果, 在这K个中, 看哪个占比多, 则该样本就属于哪一个类别.

所以, 一般在选取K的时候, 一般是选择奇数, 我猜这样可能是为了好投票.

如果能get到"计算距离和投票"这两个点, 则自然引出如下几个问题:

  • K该如何取值?
  • 计算距离, 距离这个词该怎么理解和计算呢?
  • 每判断一个样本,要计算其到每个点的距离, 这个量有些大, 时间复杂度如何呢?
  • 加入一个点离某个点非常之近, 此时另外2个也很近,且这两个点是一个类的, 那么投票的,它们有2票, 而我只有一票, 这该怎么办?
  • 训练数据不均衡( (Imbalance data) 咋能呢?
  • 特征维度量纲跨度大 ( 一列是整数, 一列是百分比) 如何消除量纲影响?

超参数 (Hyperparameter) K的选取

共同问题: 特征工程: 即特征选取, 样本均衡, 标准化 归一化, 编码等

其实我更喜欢翻译为操参数, 别误会, 是指需要人工去操作的参数, 好听些就是经验, 还是不够智能嘛.

超参数是在训练模型之前手动设置的参数, 而非模型训练中得到的参数数据. 比如:

  • 训练神经网络的学习速率
  • 学习速率 ( eg. 编写梯度下降原理时, 设置参数向量沿偏导数方向改变值的幅度 ,如0.2, 0.4等
  • SVM的sigma超参数
  • Knn的 k 值选取

KNN中, K越大则类与类的分界会越平缓, k越小则会越陡峭. 当k越小的时候, 就很容易过拟合了, 都搞成一团了, 这些点.

k取小了, 容易过拟合, 大了吧, 大量投票反而不准, 我好难.

交叉验证法 (Cross Validation)

为了验证模型靠不靠谱, 一般都会把数据分为训练数据和测试数据., 训练数据用来计算模型的, 测试数据用来验证的.

  • The Validation Set Approach
  • Cross-Validatioin

The Validation Set Approach (训练集+测试集), 训练数据越多,当然就越好啦, 但这里又要分出一部分做测试, 即不能充分利用样本.这是不足之处.

基于此, 有个大兄弟就是提出了交叉验证法(Cross-Validation)

k-fold cross-validation, 指把所有训练数据折成K份. 假设将训练数据分为5折. 如当k=1的时候的, 可得到5个准确率, 取平均值作为超参数K=1时候的准确率. 探后继续算k=3, k=5, k=7.. 这样就可以就可选取到一个准确最高的超参数K了.

KNN中的距离

之前说了, 一个样本写成数字就是一个向量, 画出来, 就是一个有方向的箭头, 或者一个点呗.计算向量距离, 其实就是计量两个向量的相似性.

欧式距离

平面上有两个坐标点 A(x1, y1), B(x2, y2) 则欧式距离为:
$$
d(A,B) = \sqrt{(x2-x1)^2+(y2-y1)^2}
$$
推广到高维空间的两个点(向量) a向量, (x1, x2, x3, ...), b点(向量), (y1, 12, y3, y4...)的距离为:
$$
d(a,b)=\sqrt{(y1-x1)^2+(y2-x2)^2+...(yn-xn)^2} = \sqrt{\sum_{i=1}^{n}(xi-yi)^2}
$$

曼哈顿距离

指向量在各坐标轴上投影的距离总和. 曼哈顿距离也称为城市街区距离. 好比你现在要从一个十字路口开车到另一个路口, 中间有楼挡着, 显然不能穿墙吧, 直线距离就不太适用了. 而实际上你开车绕过弯路才到的距离, 才是"曼哈顿距离".
$$
d12 = \sum_{k=1}^{n}|x_{1k}-x_{2k}|
$$

马氏距离

由印度统计学家马哈拉诺比斯(P. C. Mahalanobis)提出,表示数据的协方差距离。是一种有效的计算两个未知样本集的相似度的方法。

与欧氏距离不同的是它考虑到各种特性之间的联系(例如:一条关于身高的信息会带来一条关于体重的信息,因为两者是有关联的),并且是尺度无关的(scale-invariant),即独立于测量尺度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离。
$$
d = ((\vec x - \vec y)‘C^{-1}(\vec x - \vec y))^{\frac {1}{2}}
$$

其他

  • 切比雪夫距离
  • 闵可夫斯基距离
  • 标准欧式距离
  • 巴氏距离
  • 皮尔逊系数
  • 杰卡德相似系数
  • 余弦距离

大数据性能优化

KNN算法的时间复杂度是O(N), 这里举两个思路方向, 就不阐释了

  • K-D tree
  • LSH

样本特征

其实就是设置权重呗, 总体感觉knn还是蛮好理解的哈.

原文地址:https://www.cnblogs.com/chenjieyouge/p/11701611.html

时间: 2024-08-29 18:20:27

复盘一篇浅谈KNN的文章的相关文章

复盘一篇讲sklearn库学习文章(上)

认识 sklearn 官网地址: https://scikit-learn.gor/stable/ 从2007年发布以来, scikit-learn已成为重要的Python机器学习库, 简称sklearn, 支持包括分类, 回归, 降维和聚类等机器学习算法, 还包括了特征提取, 数据处理, 模型评估三大模块. sklearn是Scipy的扩展, 建立在Numpy, Matplotlib..等库的基础上. 拥有完善的文档, 上手容易, API丰富, 同时封装了大量的机器学习算法, 且内置了大量数据

浅谈标题对文章点击量的提升作用

http://t.qq.com/nanjingxia7551 http://t.qq.com/p/t/466214001064098 http://t.qq.com/lishuixiaojiebao http://t.qq.com/p/t/441720100016863 http://t.qq.com/wuxixiaojiebaoye http://t.qq.com/p/t/457708060557722 http://t.qq.com/jiangyinxi1705 http://t.qq.co

javaweb回顾第五篇浅谈会话

1:什么是会话 通俗来说就是客户和服务器的一次私密谈话,客户发送请求以后服务器能够识别请求是来自同一个客户,他们是1对1的关系. 了解会话以后我们就要去考虑如何去实现这些问题下面一一进行解析 2:会话的跟踪 2.1:用cookies进行会话跟踪 竟然服务器能别识别不同的用户,但是他是如何识别的呢,这里就说到了SessionId,它是Session的唯一识别,保存在cookies中存放于本地硬盘里面,每次客户请求的时候会把SessionId一起传给服务器,那么服务器就能根据SessionId来识别

浅谈linux中shell变量$#,[email protected],$0,$1,$2,$?的含义解释

浅谈linux中shell变量$#,[email protected],$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,[email protected],$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 摘抄自:ABS_GUIDE 下载地址:http://www.tldp.org/LDP/abs/abs-guide.pdf linux中shell变量$#,[email protected],$

浅谈java类集框架和数据结构(2)

继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主要有最重要的三种实现:ArrayList,Vector,LinkedList,三种List均来自AbstracList的实现,而AbstracList直接实现了List接口,并拓展自AbstractCollection. 在三种实现中,ArrayList和Vector使用了数组实现,可以认为这两个是

浅谈:SEO拼的就是高质量的原创文章

说来说去都是这个话题SEO.那么怎样能把SEO给做好呢,邵连虎信任许多兄弟都想晓得的.咱们为了把SEO学好,拼命的学习,实习.但是,有些SEO我感觉我现已做的够好了,为何网站即是没有作用呢.录入不多,关键字排行低.假如咱们换个方位思考一下的话,你就会理解啥才是真实的SEO. 换个思想思考啥是SEO 比如邵连虎搏客这个网站.我站在站长的方位思考SEO的话即是想尽一切办法度录入,让关键字排行让升.每天不断的发外链,不断的做伪自创.没事啰嗦一些自个烦躁的心里.假如我站在用户的方位上看到这样的网站文章都

浅谈Hibernate--入门篇

Hibernate是什么 Hibernate是一个轻量级的ORMapping框架 ORMapping原理(Object Relational Mapping)就是把对象里面的数据和数据库里面的数据,按照一定的规则进行映射的过程. ORMapping基本对应规则: 1:类跟表相对应 2:类的属性跟表的字段相对应 3:类的实例与表中具体的一条记录相对应 Hibernate的实现方式 Hibernate解决的问题: 通过上图我们也能发现,Hibernate主要用来实现Java对象和表之间的映射,除此之

浅谈动感歌词-歌词生成篇

1引言 在写这生成篇时,我还是在烦恼应该是先写歌词解析篇,还是先写歌词生成篇,后来我想一想,其实还是要先有歌词文件,才有解析嘛,当然,我们也可以通过现有的歌词(krc.trc和ksc等)直接跳过这一步,直接解析歌词即可. 2制作软件 这里介绍一下<小灰熊卡拉ok字幕制作软件>,我们可以通过一些专业的制作软件,来理清和弄懂歌词的制作原理.这里先上个截图: 由图和软件制作歌词的使用教程,我们可以知道如下信息: 1.歌词以行为单位制作,逐[字]制作 2.在制作歌词时,软件似乎已经把每一行歌词的[字]

浅谈 js 字符串 trim 方法之正则篇

position:static(静态定位) 当position属性定义为static时,可以将元素定义为静态位置,所谓静态位置就是各个元素在HTML文档流中应有的位置 podisition定位问题.所以当没有定义position属性时,并不说明该元素没有自己的位置,它会遵循默认显示为静态位置,在静态定位状态下无法通过坐标值(top,left,right,bottom)来改变它的位置. position:absolute(绝对定位) 当position属性定义为absolute时,元素会脱离文档流