基本原理

KNN算法又叫最近邻居法,是一种非常简单易于掌握的分类算法。
其基本原理是,存在一个已知标签的数据集合,也就是训练样本集。
这个样本集中的每一个数据所属的分类都是已知的。
当一个没有标签的新数据需要确定自己属于哪个分类的时候,
只需要把新数据的每个特征和训练集中的每个数据的特征进行比较,
找出其中和新数据最相似(最近邻)的k个数据,
算法取这k个数据中出现次数最多的标签作为新数据的类别。
通常k不大于20。

代码实现

假如现在又四个已知点,[1.01.1], [1.01.0], [00], [00.1],类别标签分别是A、A、B、B
如果给定一个新的点[0, 0],那么怎么判断它属于A还是B呢?
按照KNN算法原理,需要执行以下操作:
计算训练集中各点与当前点之间的距离(本文采用最经典的欧式距离)
  1. 计算训练集中各点与当前点之间的距离(本文采用最经典的欧式距离)
  2. 按照距离递增次序对各点排序
  3. 选取与当前点距离最小的k个点
  4. 确定前k个点所在类别的出现频率
  5. 返回前k个点出现频率最高的类别,即为分类结果。

以下代码实现了KNN算法的分类过程
  1. # 创建训练数据集
  2. def creatDataSet():
  3. group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
  4. labels = ['A', 'A', 'B', 'B']
  5. return group, labels
  6. # ========================================
  7. # inX:输入待分类向量
  8. # dataSet:输入的训练样本集
  9. # labels:标签向量
  10. # k:用于选择最近邻居的数目
  11. # 分类器得出类别标签然后返回
  12. # =========================================
  13. def classify0 (inX, dataSet, labels, k):
  14. # shape返回表示行列数的元组,shape[0]获得行数
  15. dataSetSize = dataSet.shape[0]
  16. # 以inX为元素重复(dataSetSize, 1)次构成新的数组
  17. diffMat = tile(inX, (dataSetSize, 1))-dataSet
  18. sqDiffMat = diffMat**2
  19. # 矩阵行元素相加(如果axis = 0的话表示列相加)
  20. sqDistance = sqDiffMat.sum(axis = 1)
  21. distances = sqDistance**0.5
  22. # argsort()得到排序后原来位置的下标
  23. sortedDisIndicies = distances.argsort()
  24. classCount = {}
  25. for i in range(k):
  26. voteIlabel = labels[sortedDisIndicies[i]]
  27. classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
  28. sortedClassCount = sorted(classCount.iteritems(),
  29. # 构造函数key,获取对象的第1个域的值
  30. key = operator.itemgetter(1),
  31. # 升序排列
  32. reverse = True)
  33. # 返回分类器得出类别标签
  34. return sortedClassCount[0][0]

如果把上面问题中的待测试点[0, 0]和训练集生成函数的返回值group和labels作为参数输入分类器,选择k=3
即:
  1. classify0 ([0, 0], group, labels, 3):
会得到其标签为B

这就完成了一个基于KNN分类算法的简单分类器。
当然,在现实中的应用场景的复杂程度比这个例子大多了

【1】KNN(K-nearest neighbors algorithm)的更多相关文章

  1. 【Luogu2900】土地征用(斜率优化,动态规划)

    [Luogu2900]土地征用(斜率优化,动态规划) 题面 Description 农夫John准备扩大他的农场,他正在考虑N (1 <= N <= 50,000) 块长方形的土地. 每块 ...

  2. 【BZOJ1855】股票交易(动态规划,单调队列)

    [BZOJ1855]股票交易(动态规划,单调队列) 题面 BZOJ 题解 很显然,状态之和天数以及当天剩余的股票数有关 设\(f[i][j]\)表示第\(i\)天进行了交易,剩余股票数为\(j\)的最 ...

  3. 【BZOJ1004】Cards(组合数学,Burnside引理)

    [BZOJ1004]Cards(组合数学,Burnside引理) 题面 Description 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Su ...

  4. 【BZOJ2242】计算器(BSGS,快速幂)

    [BZOJ2242]计算器(BSGS,快速幂) 题面 BZOJ 洛谷 1.给定y.z.p,计算y^z mod p 的值: 2.给定y.z.p,计算满足xy ≡z(mod p)的最小非负整数x: 3.给 ...

  5. 【BZOJ4555】求和(多种解法混合版本)

    [BZOJ4555]求和(多种解法混合版本) 题面 BZOJ 给定\(n\),求 \[f(n)=\sum_{i=0}^{n}\sum_{j=0}^{i}S(i,j)\times 2^j \times ...

  6. 【BZOJ3456】城市规划(生成函数,多项式运算)

    [BZOJ3456]城市规划(生成函数,多项式运算) 题面 求\(n\)个点的无向连通图个数. \(n<=130000\) 题解 \(n\)个点的无向图的个数\(g(n)=2^{C_n^2}\) ...

  7. 【CF961G】Partitions(第二类斯特林数)

    [CF961G]Partitions(第二类斯特林数) 题面 CodeForces 洛谷 题解 考虑每个数的贡献,显然每个数前面贡献的系数都是一样的. 枚举当前数所在的集合大小,所以前面的系数\(p\ ...

  8. 【BZOJ4826】【HNOI2017】影魔(扫描线,单调栈)

    [BZOJ4826][HNOI2017]影魔(扫描线,单调栈) 题面 BZOJ 洛谷 Description 影魔,奈文摩尔,据说有着一个诗人的灵魂.事实上,他吞噬的诗人灵魂早已成千上万.千百年来,他 ...

  9. 【BZOJ2654】Tree(凸优化,最小生成树)

    [BZOJ2654]Tree(凸优化,最小生成树) 题面 BZOJ 洛谷 题解 这道题目是之前\(Apio\)的时候写的,忽然发现自己忘记发博客了... 这个万一就是一个凸优化, 给所有白边二分一个额 ...

  10. 【BZOJ4455】小星星(动态规划,容斥)

    [BZOJ4455]小星星(动态规划,容斥) 题面 BZOJ 洛谷 Uoj 题解 题意说简单点就是给定一张\(n\)个点的图和一棵\(n\)个点的树,现在要让图和树之间的点一一对应,并且如果树上存在一 ...

随机推荐

  1. JavaMail的简单使用(自测可以发邮件)

    在很多项目中我们都会遇到发送邮件的功能,发送邮件其实还是很实用的,正好今天做项目需要实现,现在来简单的整理一下发送邮件的实现. 建立邮件与服务器之间的会话 Properties props = new ...

  2. 网络编程网络协议篇(osi七层协议)

    一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...

  3. 8.14 day32 TCP服务端并发 GIL解释器锁 python多线程是否有用 死锁与递归锁 信号量event事件线程q

    TCP服务端支持并发 解决方式:开多线程 服务端 基础版 import socket """ 服务端 1.要有固定的IP和PORT 2.24小时不间断提供服务 3.能够支 ...

  4. APP手机商城系统选择,混合开发与原生开发哪个好?

    关于手机APP开发用混合还是原生现在说法不一,有说混合开发好:时间短.费用低.效果也不错,有说原生开发好,原生APP在性能方面比较好.而商城系统中的手机APP用混合开发还是原生开发比较好呢? 最近我参 ...

  5. 从零写一个编译器(十三):代码生成之遍历AST

    项目的完整代码在 C2j-Compiler 前言 在上一篇完成对JVM指令的生成,下面就可以真正进入代码生成部分了.通常现代编译器都是先把生成IR,再经过代码优化等等,最后才编译成目标平台代码.但是时 ...

  6. LoRaWAN_stack移植笔记(三)__SPI

    stm32相关的配置 由于例程使用的主控芯片为STM32L151C8T6,而在本设计中使用的主控芯片为STM32L051C8T6,内核不一样,并且Cube库相关的函数接口及配置也会有不同,所以芯片的驱 ...

  7. 打包Electron项目

    先确保该项目正常运行npm run dev,结束程序, 上篇的项目运行已经提到了打包输出工具electron-packager 可以使用全局安装的方式: npm install -g electron ...

  8. NFS挂载报错

    nfs共享的时候,无论怎么检查都报错:mount.nfs: access denied by server while mounting NFS版本问题编辑/etc/sysconfig/nfs文件,找 ...

  9. 随笔编号-12 阿里云CentOS7系列一 -- 安装JDK7的方法.

    最近因为数据采集以及生产环境冲突.导入windows Server 2008系统经常死机.经讨论决定把采集服务程序和生产服务进行分开.采集程序通过windows Server2008运行.而生产程序通 ...

  10. SQL语言分类之DDL、DML、DCL、DQL

    SQL 语言共分为四大类: 数据控制语言 DCL 数据定义语言 DDL 数据操纵语言 DML 数据查询语言 DQL 一.数据控制语言 DCL 1.1 作用 用来设置或更改数据库用户或角色权限的语句,并 ...