码迷,mamicode.com
首页 > 编程语言 > 详细

K-邻近算法(kNN)

时间:2016-04-11 22:24:02      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

k-邻近算法

优点: 精度高,对异常值不敏感, 无数据输入假定

缺点:计算复杂度高, 空间复杂度高

使用范围: 数值型, 标称型

 序号 流程 说明
1 收集数据 可以使用任何方法
2 准备数据

距离计算所需要的数值,

最好使结构化的数据格式

3 分析数据 可以使用任何方法
4 训练算法 不适合用于k邻近算法
5 测试算法 计算错误率
6 使用算法

1. 需要输入样本数据和机构化的输出结果

2. 运行k邻近算法判定输入数据分别属于哪个分类

3. 应用对计算出的分类执行后续的处理

 

  • 准备: 使用python导入数据
1 from numpy import *
2 import operator
3 
4 def createDataSet():
5     group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0,0.1]])
6     labels = [A, A, B, B]
7     return group, labels

  createDataSet()函数,常见数据集和标签

 

  • 实施kNN分类算法

伪代码如下

  对未知类别属性的数据集中的每个点依次执行以下操作
1 计算已知类别数据集中的点与当前点之间的距离
2 按照距离递增顺序排序
3 选取当前点距离最小的k个点
4 确定前k个点所在的类别的出现频率
5 返回前k个点出现频率最高的类别作为当前点的预测分类

k邻近算法

 1 def classify0(inX, dataSet, labels, k):
 2     dataSetSize = dataSet.shape[0]
 3     diffMat = tile(inX, (dataSetSize,1)) - dataSet
 4     sqDiffMat = diffMat**2
 5     sqDistances = sqDiffMat.sum(axis=1)
 6     distances = sqDistances**0.5
 7     sortedDistIndicies = distances.argsort()     
 8     classCount={}          
 9     for i in range(k):
10         voteIlabel = labels[sortedDistIndicies[i]]
11         classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
12     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
13     return sortedClassCount[0][0]

classify0()函数有4个输入参数:

  1. 用于分类的输入向量 inX
  2. 输入的训练样本集 dataSet
  3. 标签向量 labels
  4. 选择邻近的数目 k

classCount字典分解为元祖列表,然后使用运算符模块的itemgetter方法,逆序排序

itemgetter(1)获取classCount的第1值(不是第0个)

sorted对第1个值进行排序

 

参考《机器学习实战》

 

K-邻近算法(kNN)

标签:

原文地址:http://www.cnblogs.com/keltoy/p/5380012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!