标签:
k-邻近算法
优点: 精度高,对异常值不敏感, 无数据输入假定
缺点:计算复杂度高, 空间复杂度高
使用范围: 数值型, 标称型
序号 | 流程 | 说明 |
1 | 收集数据 | 可以使用任何方法 |
2 | 准备数据 |
距离计算所需要的数值, 最好使结构化的数据格式 |
3 | 分析数据 | 可以使用任何方法 |
4 | 训练算法 | 不适合用于k邻近算法 |
5 | 测试算法 | 计算错误率 |
6 | 使用算法 |
1. 需要输入样本数据和机构化的输出结果 2. 运行k邻近算法判定输入数据分别属于哪个分类 3. 应用对计算出的分类执行后续的处理 |
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()函数,常见数据集和标签
伪代码如下
对未知类别属性的数据集中的每个点依次执行以下操作 | |
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个输入参数:
classCount字典分解为元祖列表,然后使用运算符模块的itemgetter方法,逆序排序
itemgetter(1)获取classCount的第1值(不是第0个)
sorted对第1个值进行排序
参考《机器学习实战》
标签:
原文地址:http://www.cnblogs.com/keltoy/p/5380012.html