kNN算法实现伪代码(参考机器学习实战)
建立文件test.py
#导入第一个模块:科学计算包
from numpy import *
#导入第二个模块:运算符模块
import operator
#创建一个creatDataSet函数:建立数据集和标签
def creatDataSet():
group=array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
labels=['a','a','b','b']
return group,labels
建立文件kNN.py
import test
import operator
from numpy import *
from scipy import *
from matplotlib import *
dataSet,labels=test.creatDataSet()
print(dataSet)
print(labels)
"""了解get的作用:用字典统计相同标签个数
classCount={}
bb=['a','a','b','b'] #标签
for i in range(4):
classCount[bb[i]]=classCount.get(bb[i],0)+1
print(classCount['a'])
print(classCount['b'])
"""
inX=[1,1]
k=2
#inx为自己输入要分类的测试数,dataset为训练集,labels为标签集,k为kNN中的K值
#shape[0]得到训练样本多少行
#tile建立inx,dataSetSize行,1列
#sum(axis=1),按行相加
#argsort递增排序
def classify0(inX,dataSet,labels,k):
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort() #生成的不是距离而是标号列表
print(sortedDistIndicies)
classCount={}
for i in range(k):
#print(sortedDistIndicies[i]) #训练点标号3,2
voteIlabel=labels[sortedDistIndicies[i]] #找到标号3,2对应的标签‘b’,'b'
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #这一步是做相同标签的统计(+1),找到键voteIlabel对应的值,如果不存在这样的键则返回默认值0
print(classCount.get(voteIlabel,0))
sortedClassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #sorted排序做升序,返回副本,原始输入不变,里面的参数设置请参考https://blog.csdn.net/hshl1214/article/details/40587985
print(sortedClassCount[0][0]) #或者参考https://www.cnblogs.com/zhoufankui/p/6274172.html
return sortedClassCount[0][0]
classify0(inX,dataSet,labels,k)