###python numpy kNN
knn demo 代码每行都加上注释
1.shape 输出维度
>>> c = array([[1,1],[1,2],[1,3],[1,4]])
>>> c.shape
(4, 2)
>>> c.shape[0]
4
>>> c.shape[1]
2
2.tile 生成重复的数据
numpy.tile([1,2],5) #生成一行
numpy.tile([1,2],(3,4) )#生成1行3列的矩阵,矩阵每个元素都4个12 即为[1,2,1,2,1,2,1,2]
3.b=operator.itemgetter(1) 定义了一个函数b,获取对象的一些维
记得 import operator
4.import py文件后,文件有改动重现加在reload python3还需要加上一句:
>>>from imp import reload
>>>reload(kNN)
测试成功的代码:
#!/usr/bin/python
import numpy as np
import operator
def createDataSet():
group = np.array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels = np.array(['A','A','B','B'])
return group,labels
def classify0(inX, dataSet, labels, k):
#inX 未知的点
#dataset输入数据集,训练集,所有的点
#dataset对应的labels
#第一步:计算距离:
#shape返回元组(行,列)
dataSetSize = dataSet.shape[0]
#tile 创建一个数组,dataSetSize行,每行数据是inX,inX和dataset相同列数
#两个矩阵相减,inX和每两个点之间的距离
diffMat = tile(inX, (dataSetSize,1)) - dataSet
#矩阵的每个值算平方
sqDiffMat=diffMat**2
#矩阵的每行求和,得到一个一位数组,平方和
sqDistances=sqDiffMat.sum(axis=1)
#开根号
distances = sqDistances**0.5
#inX和每个点的距离,按照距离值从小到大排序,返回排序后的索引序号
sortedDisIndicies = distances.argsort()
print(sortedDisIndicies)
#第二步:选择距离最小的K个点
#classCount是个字典,key想放label,值想放个数,初始值是0
classCount={}
#距离值从小到大排序,统计这些距离对应的标签都是哪些
for i in range(k):
#因为labels和dataset是对应的,利用上一步的索引序号找到对应的标签
voteIlabel = labels[sortedDisIndicies[i]]
#统计出前K个都有哪些标签
#python字典get,dict.get(key, default=None),没找到key的话赋值为0
#找到已有label的话,值+1
classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
#python sorted排序,括号里第一个参数是迭代,key=限定了排序内容,reverse=True是大到小
#items() 返回可遍历的(键,值)元组数组
sortedClassCount = sorted(classCount.items(),
key=operator.itemgetter(1),reverse=True)
print(sortedClassCount)
return sortedClassCount[0][0]