认识-什么是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. docker stack删除network失败

    现象描述 删除stack的时候没太多提示,但再启动相同的stack会报错,提示网络创建失败:随后使用network ls命令可以看到之前的network还在: 使用docker network rm还 ...

  2. CentOS 7 卸载OpenJdk安装Oracle Jdk1.8

    CentOS 7 卸载OpenJdk安装Oracle Jdk1.81.查询openjdk:rpm -qa | grep jdk2.卸载OpenJdkrpm -e --nodeps 查询到的结果3.安装 ...

  3. java中静态方法中为什么不能使用this、super和直接调用非静态方法

    这个要从java的内存机制去分析,首先当你New 一个对象的时候,并不是先在堆中为对象开辟内存空间,而是先将类中的静态方法(带有static修饰的静态函数)的代码加载到一个叫做方法区的地方,然后再在堆 ...

  4. Linux部署springboot项目,两种方式

    部署jar包(官方推荐) 在linux服务器上运行Jar文件时通常的方法是: $ java -jar test.jar 这种方式特点是ssh窗口关闭时,程序中止运行.或者是运行时没法切出去执行其他任务 ...

  5. Ubuntu 上多版本软件管理方法

    https://linuxize.com/post/how-to-install-gcc-compiler-on-ubuntu-18-04/ sudo apt install software-pro ...

  6. Egret自定义计时器(TimerManager和Laya.timer)

    一 自定义计时器 因为游戏中经常用到计时器,比如每1秒发射一枚子弹啊,每2秒怪物AI自动转向啊 每次去new Timer 然后addEventListener(egret.TimerEvent...  ...

  7. Promise.resolve解析

    总结自:https://blog.csdn.net/lq15310444798/article/details/81275278 Promise.resolve返回一个Promise实例 参数分4种情 ...

  8. BatchConfigTool批量配置工具

    海康批量配置工具BatchConfigTool是一款支持设备在线搜索.批量配置参数.批量升级等功能的软件,支持对大批量设备同时进行各参数的配置,极大的简化了操作过程! 软件功能 1.对在线设备进行搜索 ...

  9. Postman 设置变量

  10. netty的reactor模式

    reactor中包含5个核心结构,那么从操作系统低层次的调度来看5部分是这样的. (1)Handle(句柄资源描述符)本质是对客户端连接上来以后发生事件的处理机制,比如连接成功,读取数据,发送数据等状 ...