[关闭]
@bergus 2015-10-24T20:08:49.000000Z 字数 1160 阅读 1643

机器学习之K近邻算法(KNN)

python 算法 KNN 机械学习


苛求真理的欲望让我想要了解算法的本质,于是我开始了机械学习的算法之旅

  1. from numpy import *
  2. import operator
  3. from collections import Counter
  4. #KNN需要测试集,训练集,标签和k值
  5. #测试集:你需要测试的数据
  6. #训练集:给定的标准数据
  7. #标签:每个标准数据的类别
  8. #k值 :测试集和训练集相比较下前K个最相识的训练集的值
  9. # 用KNN算法找出测试集的类别
  10. #1,求出已知类别训练集中的点与当前点之间的距离
  11. #2,对所求距离以此递增排序
  12. #3,选取与当前点距离最小的k个点
  13. #4,确定前k个点所在类别的出现频率
  14. #5,返回前k个点出现频率最高的类别作为当前点的预测分类
  15. def kNNClassify(testSet, trainSet, labels, k=3):
  16. rows = trainSet.shape[0] #shape[0]得到训练集的行数
  17. #求距离
  18. distSet = tile(testSet, (rows, 1)) - trainSet #得到距离矩阵
  19. distance = sum(distSet ** 2 , axis = 1) ** 0.5 # 求出距离
  20. #排序
  21. #得到排序后数据原位置的下标,排序后位置是不变的
  22. #从而使得排序后的结果和trainSet的标签一一对应
  23. #然后就可以通过排序结果反向得到标签值
  24. sortedDistIndices = argsort(distance)
  25. #选取k个最小值
  26. classCount = Counter()# 保存类别
  27. #记录k值内相同标签出现的次数
  28. [classCount.update([labels[sortedDistIndices[i]]]) for i in xrange(k)]
  29. ## 得到出现次数最多的标签类别
  30. return sorted(classCount.iteritems(), key=lambda d:d[1], reverse = True )[0][0]
  31. if __name__ == '__main__':
  32. #然后我们在命令行中测试
  33. trainSet = array([
  34. [1.0, 0.9],
  35. [1.0, 1.0],
  36. [0.1, 0.2],
  37. [0.0, 0.1]])
  38. labels = ['A', 'A', 'B','B'] # 4个标签,2种类别
  39. testSet = array([1.2, 1.0])
  40. label = kNNClassify(testSet, trainSet, labels, k=3)
  41. print "输入:", testSet, "分类: ", label
  42. testSet = array([0.1, 0.3])
  43. label = kNNClassify(testSet, trainSet, labels, k=3)
  44. print "输入:", testSet, "分类: ", label
输入: [ 1.2  1. ] 分类:  A
输入: [ 0.1  0.3] 分类:  B
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注