手撕代码,已经全部调试正确,可以直接copy使用的哦;;;;诶,这个简书复制代码好像不咋好用(注意缩进)
#!/usr/bin/python
#-*- coding:UTF-8-*- from numpy import * #科学计数包
import operator #运算符模块
from os import listdir #从os模块中导入listdir,他可以列出给定目录的文件名
#creat DataSet
def creatDataSet():
group = array([[1. ,1.1],[1. ,1.],[0. ,0.],[0.,0.1]])
labels = ['A', 'A', 'B', 'B']
return group ,labels
#classify these datasets
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]
#shape[0]返回行数,shape[1]返回列数,行数就是样本数量,此处为4
diffMat = tile(inX, (dataSetSize, 1)) - dataSet #要分类的新数据和原始数据做差
#about tile():
#1.tile()是numpy下的一个函数
#2.tile(A, reps)返回一个shape =reps的矩阵,矩阵的每个元素是A(reps的数字从后往前分布对应A的第N个维度的重复次数)
#3.可以理解为行方向重复多少次,列方向重复多少次
sqDiffMat = diffMat ** 2 #对差求平方
sqDistances = sqDiffMat.sum(axis = 1) #这样就求出每个新数据点和原始数据点的距离的平方
distances = sqDistances ** 0.5 #这里求得才是距离
sortedDisIndicies = distances.argsort()#距离升序排序
#about argsort():
#argsort()函数返回的是数组值从小到大排序的索引值,也就是原数组的下标(remember下表从0开始算) #存放分类结果以及投票次数
classCount = {} #建立空字典 {key, value},key是label, value 是label的次数
for i in range(k):
voteLabel = labels[sortedDisIndicies[i]]
classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
#voteLabel 不在classCount中时返回0.若在就读取当前的value值+1
sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True) #sorted(iterable, cmp=None, key=None, reverse=False)
#return new sorted list返回列表 #cmp:用于比较的函数,比较什么由key决定 #key:用列表的某个属性或者函数进行作为关键字,迭代集合中的一项 、
#operator.itemgetter(1)表示获得对象的第一个域的值,这里是指value #reverse:排序规则,True降序,False 升序
return sortedClassCount[0][0]
if __name__ == "__main__":
dataSet,labels =creatDataSet()
inX = [0.1, 0.1]
className = classify0(inX, dataSet,labels,3)
print "the class of test sample is %s" %className
#-*- coding:UTF-8-*-
from numpyimport *#科学计数包
import operator#运算符模块
from osimport listdir#从os模块中导入listdir,他可以列出给定目录的文件名
#creat DataSet
def creatDataSet():
group = array([[1. ,1.1],[1. ,1.],[0. ,0.],[0.,0.1]])
labels = ['A','A','B','B']
return group ,labels
#classify these datasets
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0]#shape[0]返回行数,shape[1]返回列数,行数就是样本数量,此处为4
diffMat = tile(inX, (dataSetSize,1)) - dataSet#要分类的新数据和原始数据做差
# about tile():
#1.tile()是numpy下的一个函数
#2.tile(A, reps)返回一个shape =reps的矩阵,矩阵的每个元素是A(reps的数字从后往前分布对应A的第N个维度的重复次数)
#3.可以理解为行方向重复多少次,列方向重复多少次
sqDiffMat = diffMat **2 #对差求平方
sqDistances = sqDiffMat.sum(axis =1)#这样就求出每个新数据点和原始数据点的距离的平方
distances = sqDistances **0.5 #这里求得才是距离
sortedDisIndicies = distances.argsort()#距离升序排序
#about argsort():
#argsort()函数返回的是数组值从小到大排序的索引值,也就是原数组的下标(remember下表从0开始算)
#存放分类结果以及投票次数
classCount = {}#建立空字典 {key, value},key是label, value 是label的次数
for iin range(k):
voteLabel = labels[sortedDisIndicies[i]]
classCount[voteLabel] = classCount.get(voteLabel,0) +1
#voteLabel 不在classCount中时返回0.若在就读取当前的value值+1
sortedClassCount =sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse =True)
#sorted(iterable, cmp=None, key=None, reverse=False)
#return new sorted list返回列表
#cmp:用于比较的函数,比较什么由key决定
#key:用列表的某个属性或者函数进行作为关键字,迭代集合中的一项
# operator.itemgetter(1)表示获得对象的第一个域的值,这里是指value
#reverse:排序规则,True降序,False 升序
return sortedClassCount[0][0]
if __name__ =="__main__":
dataSet,labels =creatDataSet()
inX = [0.1,0.1]
className = classify0(inX, dataSet,labels,3)
print "the class of test sample is %s" %className