认识-什么是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还是蛮好理解的哈.

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

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

    认识 sklearn 官网地址: https://scikit-learn.gor/stable/ 从2007年发布以来, scikit-learn已成为重要的Python机器学习库, 简称sklea ...

  2. 复盘一篇讲sklearn库的文章(下)

    skleran-处理流程 获取数据 以用sklearn的内置数据集, 先导入datasets模块. 最经典的iris数据集作为例子. from sklearn import datasets iris ...

  3. javaweb回顾第五篇浅谈会话

    1:什么是会话 通俗来说就是客户和服务器的一次私密谈话,客户发送请求以后服务器能够识别请求是来自同一个客户,他们是1对1的关系. 了解会话以后我们就要去考虑如何去实现这些问题下面一一进行解析 2:会话 ...

  4. 浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释

    浅谈linux中shell变量$#,$@,$0,$1,$2,$?的含义解释 下面小编就为大家带来一篇浅谈linux中shell变量$#,$@,$0,$1,$2的含义解释.小编觉得挺不错的,现在就分享给 ...

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

    继续上一篇浅谈java类集框架和数据结构(1)的内容 上一篇博文简介了java类集框架几大常见集合框架,这一篇博文主要分析一些接口特性以及性能优化. 一:List接口 List是最常见的数据结构了,主 ...

  6. 浅谈TCP IP协议栈(三)路由器简介

    读完这个系列的第一篇浅谈TCP/IP协议栈(一)入门知识和第二篇浅谈TCP/IP协议栈(二)IP地址,在第一篇中,可能我对协议栈中这个栈的解释有问题,栈在数据结构中是一种先进后出的常见结构,而在整个T ...

  7. 浅谈jvm中的垃圾回收策略

    下面小编就为大家带来一篇浅谈jvm中的垃圾回收策略.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧   java和C#中的内存的分配和释放都是由虚拟机自动管理的,此前我已 ...

  8. 浅谈cookie 和session 的区别

    具体来说 cookie 是保存在“客户端”的,而session是保存在“服务端”的 cookie 是通过扩展http协议实现的 cookie 主要包括 :名字,值,过期时间,路径和域: 如果cooki ...

  9. 浅谈JAVA中如何利用socket进行网络编程(二)

    转自:http://developer.51cto.com/art/201106/268386.htm Socket是网络上运行的两个程序间双向通讯的一端,它既可以接受请求,也可以发送请求,利用它可以 ...

随机推荐

  1. 什么是依赖注入 IoC

    设计原则:依赖注入原则 依赖倒置原则,是一种程序设计模式的原则 高层模块不应该依赖底层模块,二者都应该依赖其抽象. 抽象不应该依赖细节,细节应该依赖抽象.依赖导致原则很好的体现了“面向接口编程”的思想 ...

  2. 第一节:Python+Selenium环境搭建

    一.selenium工作原理 二.安装python Window系统下,python的安装很简单.访问python.org/download,下载最新版本,安装过程与其他windows软件类似.记得下 ...

  3. 【转】【Centos】Linux(Centos7)下搭建SVN服务器

    系统环境:centos7.2 第一步:通过yum命令安装svnserve,命令如下: yum -y install subversion 此命令会全自动安装svn服务器相关服务和依赖,安装完成会自动停 ...

  4. Spring项目读取resource下的文件

    目录 一.前提条件 二.使用ClassPathResource类读取 2.1.Controller.service中使用ClassPathResource 2.2.单元测试使用ClassPathRes ...

  5. 使用java计算数组方差和标准差

    使用java计算数组方差和标准差 觉得有用的话,欢迎一起讨论相互学习~Follow Me 首先给出方差和标准差的计算公式 代码 public class Cal_sta { double Sum(do ...

  6. IDEA中类文件显示J,IDEA Unable to import maven project: See logs for details

    今天用了下lemon清理了下垃圾后,IDEA打开项目类文件图标由C变为J,在IDEA右侧的Maven Project中点击刷新提示IDEA Unable to import maven project ...

  7. Selenium+Java(八)Selenium下拉框处理

    Selenium定位下拉框中的元素与普通元素定位有所不同,下面介绍三种定位下拉框元素的方法. 下拉款HTML代码如图所示: 一.通过text定位 //获取下拉框对象 Select city = new ...

  8. 《JAVA高并发编程详解》-Thread start方法的源码

    Thread start方法的源码:

  9. 将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本)

    原文:将 C++/WinRT 中的线程切换体验带到 C# 中来(WPF 版本) 如果你要在 WPF 程序中使用线程池完成一个特殊的任务,那么使用 .NET 的 API Task.Run 并传入一个 L ...

  10. XML和Json的特点

    Xml特点: 1.有且只有一个根节点: 2.数据传输的载体 3.所有的标签都需要自定义 4.是纯文本文件 Json(JavaScript Object Notation)特点: json分为两种格式: ...