'''
Created on Sep 16, 2010
kNN: k Nearest Neighbors Input: inX: vector to compare to existing dataset (1xN)
dataSet: size m data set of known vectors (NxM)
labels: data set labels (1xM vector)
k: number of neighbors to use for comparison (should be an odd number) Output: the most popular class label @author: pbharrin
'''
from numpy import *
#NumPy是Python语言的一个扩展程序库。支持高端大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。
import pdb
pdb.set_trace()#用于调试
import operator#operator 模块是 Python 中内置的操作符函数接口,它定义了算术,比较和与标准对象 API 相对应的其他操作的内置函数。
#operator 模块是用 C 实现的,所以执行速度比 Python 代码快。
from os import listdir#os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表。这个列表以字母顺序。 它不包括 '.' 和'..' 即使它在文件夹中。 def classify0(inX, dataSet, labels, k):
#这个方法每次只能处理一个样本
#这里的dataSet是一个数组,inX是待分类的样本,K是neighbor的数量
#inX是以行向量的方式储存的,dataSet也是一行表示一个样本
#KNN算法几乎不需要“训练”,属于即开即用那种的
dataSetSize = dataSet.shape[0]#这是样本个数
diffMat = tile(inX, (dataSetSize,1)) - dataSet#ile()函数内括号中的参数代表扩展后的维度,而扩展是通过复制A来运作的,最终得到一个与括号内的参数(reps)维度一致的数组(矩阵)
#将inX复制为和样本一样多的行数
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)#sum对array求和,如果参数是0,就按列求和,返回一个行向量;如果参数是1,就按行求和,但是也返回一个行向量(从计算的角度来看,是列向量转置之后的)
distances = sqDistances**0.5#**是python中的幂运算,用在矩阵上的效果的对应位置相乘而不是矩阵乘法中的A*A
##现在distances中的每一个元素代表了待求目标点和每一个样本点之间的距离
sortedDistIndicies = distances.argsort() #argsort是numpy的方法,从小到大排序(不加参数的话),返回的是index而不是排序后的元素本身
classCount={}#这是个字典类型 (labels)
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1#给这个类型加一
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)#选出k中数量最大的label
return sortedClassCount[0][0]##输出最大的label def createDataSet():
group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
#[[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]是list类型的二维向量,转成array可以方便进行向量化计算(array是numpy封装的)
labels = ['A','A','B','B']
return group, labels
group,labels=createDataSet()
classify0([0,0],group,labels,3)

最新文章

  1. JavaScript知识结构图
  2. 服务器磁盘扩展卷时遭遇“There is not enough space available on the disk(s) to complete this operation.”错误
  3. pycharm下载 -professional
  4. 使用php递归计算目录大小
  5. WEB前端常用网站收集
  6. Asp.net操作Excel----NPOI!!!!1
  7. c++ struct 使用
  8. JavaScript DOM-Ready 机制
  9. haproxy hdr_beg 配置
  10. SQL 经典语句
  11. kettle 通用的数据库迁移流程
  12. SQL的日期转换
  13. c/c++二叉树的创建与遍历(非递归遍历左右中,破坏树结构)
  14. JQ-总结
  15. 单调栈的运用-bzoj1012(代码转载-http://hzwer.com/1130.html)
  16. Python异常和调试.md
  17. spring之jdbcTemplate
  18. Shell编程-11-子Shell和Shell嵌套
  19. C++编程经验-返回局部变量的讨论(转)
  20. selenium启动谷歌所遇到的问题

热门文章

  1. C++入门经典-例2.7-控制cout打印格式程序
  2. Docker入门-常用命令
  3. pom.xml报Plugin execution not covered by lifecycle configuration错误
  4. 套接字I/O函数write/read writev/readv send/recv sendto/recvfrom sendmsg/recvmsg
  5. ASP.NET中的物理路径与虚拟路径
  6. C++抽象类实践
  7. Emacs Python 自动补全之 jedi
  8. Maven POM 模板[z]
  9. vsftp软件安装部署
  10. Python 的列表生成器