前言

本文介绍机器学习分类算法中的K-近邻算法并给出伪代码与Python代码实现。

算法原理

首先获取训练集中与目标对象距离最近的k个对象,然后再获取这k个对象的分类标签,求出其中出现频数最大的标签。

而这个标签,就是分类的结果。

伪代码

对训练集做以下操作:

1. 计算训练集中各点与当前点之间的距离(本文采用最经典的欧式距离)

2. 按照距离递增次序对各点排序

3. 选取与当前点距离最小的k个点

4. 确定前k个点所在类别的出现频率

5. 返回前k个点出现频率最高的类别,即为分类结果。

特别说明:该算法中,因为没有训练步骤,因此对它而言训练集也就是数据集。

代码示例

  1. #!/usr/bin/env python
  2. # -*- coding:UTF-8 -*-
  3.  
  4. '''
  5. Created on 2016-12-05
  6.  
  7. @author: fangmeng
  8. '''
  9.  
  10. # 导入numpy数学运算库
  11. import numpy
  12. # 导入运算符函数库
  13. import operator
  14.  
  15. # ==============================================
  16. # 输入:
  17. # 空
  18. # 输出:
  19. # group, labels:样本训练集及其对应标签集
  20. # ==============================================
  21. def createDataSet():
  22. '创建训练集及其对应标签集并返回'
  23.  
  24. group = numpy.array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]])
  25. labels = ['A', 'A', 'B', 'B']
  26.  
  27. return group, labels
  28.  
  29. # ==============================================
  30. # 输入:
  31. # inX:目标向量
  32. # dataSet:训练集
  33. # labels:训练集对应的标签集
  34. # k:算法参数
  35. # 输出:
  36. # sortedClassCount[0][0]:目标向量的分类结果
  37. # ==============================================
  38. def classify0 (inX, dataSet, labels, k):
  39. 'kNN 分类器'
  40.  
  41. #计算目标向量与训练集中所有对象的距离并排序
  42. dataSetSize = dataSet.shape[0]
  43. diffMat = numpy.tile(inX, (dataSetSize, 1)) - dataSet
  44. sqDiffMat = diffMat ** 2
  45. sqDistances = sqDiffMat.sum(axis=1)
  46. distances = sqDistances ** 0.5
  47. sortedDistIndicies = distances.argsort()  # 返回数组从小到大的索引值
  48.  
  49. # 取出与目标向量距离最近的三个
  50. classCount = {} # 该字典存放各种标签及其对应的频数
  51. for i in range(k): # 由前 k 位索引的结果构建字典
  52. voteIlable = labels[sortedDistIndicies[i]]
  53. classCount[voteIlable] = classCount.get(voteIlable, 0)+1
  54.  
  55. # 以各个标签的频率为基准进行排序
  56. sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
  57.  
  58. return sortedClassCount[0][0] # 返回出现频率最高的标签
  59.  
  60. def test():
  61. '分类器测试函数'
  62.  
  63. # 新建训练集及其对应标签集
  64. group, labels = createDataSet()
  65.  
  66. # 输入目标向量并返回分类结果后打印
  67. label = classify0([0.0, 0.0], group, labels, 3)
  68. print label
  69.  
  70. if __name__ == '__main__':
  71. # 调用测试函数
  72. test()

运行结果

小结

1. 本文简要介绍了机器学习中经典的K-近邻算法,并给出了代码实现。

2. 该算法的缺点有三个:

a. 耗费空间资源大:要保存整个数据集

b. 耗费时间资源大:要对数据集中的每个样本求距离。当样本很多,或者特征信息多的时候,效率是挺坑的。

c. 没有给出数据的基础结构信息。(本身K-近邻算法就没有严格意义上的训练过程)

3. 后面的文章中,将讲解如何将此算法应用于具体项目中。

第一篇:K-近邻分类算法原理分析与代码实现的更多相关文章

  1. 第七篇:Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

  2. Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

  3. 第十三篇:K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  4. K近邻分类算法实现 in Python

    K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...

  5. 查看neighbors大小对K近邻分类算法预测准确度和泛化能力的影响

    代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 09:36:49 2018 @author: zhen &qu ...

  6. 第十四篇:Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  7. Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  8. K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  9. K邻近分类算法

    # -*- coding: utf-8 -*- """ Created on Thu Jun 28 17:16:19 2018 @author: zhen "& ...

随机推荐

  1. Chrome rem bug

    遇到一个bug,发现chrome在初始化页面的时候,会错误的渲染rem单位,导致字体过大. 比如: 正常的应该是这样的: 原因是,为了使用rem单位,我们常常将 html 的font-size设置为6 ...

  2. Socket原理

    一.Socket简介 Socket是进程通讯的一种方式,即调用这个网络库的一些API函数实现分布在不同主机的相关进程之间的数据交换. 几个定义: (1)IP地址:即依照TCP/IP协议分配给本地主机的 ...

  3. Flask jQuery ajax

    http://www.runoob.com/jquery/jquery-ref-ajax.html http://jun1986.iteye.com/blog/1399242 下面是jQuery官方给 ...

  4. [walkthrough] 在Asp.net MVC6 RC里使用NLog,并且把配置集成到config.json

    说明一下:本文基于随visual studio 2015 RC公开的DNX1.0.0-beta4,git上最新的aspnet的开发版本已经发生了很大变化. 首先,理论部分看[汤姆大叔的博客] 解读AS ...

  5. hadoop如何计算map数和reduce数(未读)

    http://blog.csdn.net/lpxuan151009/article/details/7937821

  6. BZOJ 3872 Ant colony

    Description There is an entrance to the ant hill in every chamber with only one corridor leading int ...

  7. Jump

    hdu4862:http://acm.hdu.edu.cn/showproblem.php?pid=4862 题意:给你n*m的方格,每个方格中有一个数(0---9),然后你每次可以选择一个点开始,这 ...

  8. 通过 IDE 向 Storm 集群远程提交 topology

    转载: http://weyo.me/pages/techs/storm-topology-remote-submission/ http://www.javaworld.com/article/20 ...

  9. Struts2的声明式异常处理

    在struts2应用程序中你还在使用try catch语句来捕获异常么?如果是这样的,那你OUT啦!struts2支持声明式异常处理,可以再Action中直接抛出异常而交给struts2来 处理,当然 ...

  10. ZOJ-2008-Invitation Cards(dijkstra)

    题意: 在有向加权图中G(V,E),邮局要从起点S向其他n个节点发送邮件,于是派出n个邮递员,分别到达其他n个地点发送,然后回到起点S,求出所有邮递员所经过的总路程的最小值. 分析: 正向一次dijk ...