个人随笔
目录
机器学习-K近邻值算法(一)
2019-02-18 23:24:28

一、K-近邻值算法,实现语言python
1、伪代码
对未知类别属性的数据集中的每个点依次执行以下操作
(1)计算已知类别数据集中的点与当前点之间的距离;
(2)按照距离递增次序排序;
(3)选取与当前点距离最小的k个点;
(4)确定前k个点所在类别的出现频率;
(5)返回前k个点出现频率最高的类别作为当前点的预测分类。
2、程序如下

  1. #!/usr/bin/python
  2. from numpy import *
  3. "import operator"
  4. "返回训练样本集和标签向量,两者之间的行数必须相同"
  5. def createDataSet():
  6. group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
  7. labels = ['A','A','B','B']
  8. return group,labels
  9. "inX:用于分类的输入向量,dataSet:训练样本集,labels:标签向量,k最近邻居的数目"
  10. def classify0(inX,dataSet,labels,k):
  11. "这个是获取矩阵的第一维的长度"
  12. """
  13. 获取矩阵的长度
  14. shape[0]获取第一维的长度
  15. """
  16. dataSetSize = dataSet.shape[0]
  17. print(dataSetSize)
  18. """
  19. tile(a,(2,1)) 将a按一维度重复1次,也就变成了矩阵
  20. """
  21. diffMat = tile(inX,(dataSetSize,1)) - dataSet
  22. print(diffMat)
  23. """2次幂"""
  24. sqDiffMat = diffMat**2
  25. print(sqDiffMat)
  26. """
  27. axis=1表示按行相加 , axis=0表示按列相加
  28. """
  29. sqDistances = sqDiffMat.sum(axis=1)
  30. print(sqDistances)
  31. "开方"
  32. distances = sqDistances**0.5
  33. print(distances)
  34. "返回distances从小到大的索引值(不是返回现实值,这个索引值去labels中取)"
  35. sortedDistIndicies = distances.argsort()
  36. print(sortedDistIndicies)
  37. classCount = {}
  38. for i in range(k) :
  39. """
  40. 根据索引值获取距离最短的目标值
  41. """
  42. voteIlabel = labels[sortedDistIndicies[i]]
  43. """
  44. 计算目标值出现的次数
  45. """
  46. classCount[voteIlabel] = classCount.get(voteIlabel,0)+1
  47. print(classCount)
  48. """
  49. 倒序排序字典,更具目标值
  50. key=lambda x:x[1]:用第二个关键字来排序
  51. reverse=True:倒序排序
  52. """
  53. sortedClassCount = sorted(classCount.items(), key=lambda x:x[1],reverse=True)
  54. print(sortedClassCount)
  55. """
  56. 返回概率最大的值
  57. """
  58. return sortedClassCount[0][0]
  59. group,labels=createDataSet()
  60. result = classify0([0,0],group,labels,3)
  61. print(result)

3、注意事项
在python3中没有了字典的iteritems方法,需要导入numpy模块

 186

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2