手撕代碼,已經(jīng)全部調(diào)試正確,可以直接copy使用的哦;;;;誒,這個簡書復(fù)制代碼好像不咋好用(注意縮進(jìn))
#!/usr/bin/python
#-*- coding:UTF-8-*- from numpy import * #科學(xué)計數(shù)包
import operator #運(yùn)算符模塊
from os import listdir #從os模塊中導(dǎo)入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]返回行數(shù),shape[1]返回列數(shù),行數(shù)就是樣本數(shù)量,此處為4
????diffMat = tile(inX, (dataSetSize, 1)) - dataSet #要分類的新數(shù)據(jù)和原始數(shù)據(jù)做差
????#about tile():
#1.tile()是numpy下的一個函數(shù)
#2.tile(A, reps)返回一個shape =reps的矩陣,矩陣的每個元素是A(reps的數(shù)字從后往前分布對應(yīng)A的第N個維度的重復(fù)次數(shù))
#3.可以理解為行方向重復(fù)多少次,列方向重復(fù)多少次
????sqDiffMat = diffMat ** 2 #對差求平方
????sqDistances = sqDiffMat.sum(axis = 1) #這樣就求出每個新數(shù)據(jù)點(diǎn)和原始數(shù)據(jù)點(diǎn)的距離的平方
????distances = sqDistances ** 0.5 #這里求得才是距離
????sortedDisIndicies = distances.argsort()#距離升序排序
#about argsort():
#argsort()函數(shù)返回的是數(shù)組值從小到大排序的索引值,也就是原數(shù)組的下標(biāo)(remember下表從0開始算) #存放分類結(jié)果以及投票次數(shù)
????classCount = {} #建立空字典 {key, value},key是label, value 是label的次數(shù)
????for i in range(k):
????????voteLabel = labels[sortedDisIndicies[i]]
????????classCount[voteLabel] = classCount.get(voteLabel, 0) + 1
#voteLabel 不在classCount中時返回0.若在就讀取當(dāng)前的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:用于比較的函數(shù),比較什么由key決定 #key:用列表的某個屬性或者函數(shù)進(jìn)行作為關(guān)鍵字,迭代集合中的一項(xiàng) 、
#operator.itemgetter(1)表示獲得對象的第一個域的值,這里是指value #reverse:排序規(guī)則,True降序,F(xiàn)alse 升序
? ? ? ?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 *#科學(xué)計數(shù)包
import operator#運(yùn)算符模塊
from osimport listdir#從os模塊中導(dǎo)入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]返回行數(shù),shape[1]返回列數(shù),行數(shù)就是樣本數(shù)量,此處為4
? ? diffMat = tile(inX, (dataSetSize,1)) - dataSet#要分類的新數(shù)據(jù)和原始數(shù)據(jù)做差
? ? # about tile():
? ? #1.tile()是numpy下的一個函數(shù)
? ? #2.tile(A, reps)返回一個shape =reps的矩陣,矩陣的每個元素是A(reps的數(shù)字從后往前分布對應(yīng)A的第N個維度的重復(fù)次數(shù))
? ? #3.可以理解為行方向重復(fù)多少次,列方向重復(fù)多少次
? ? sqDiffMat = diffMat **2? ? ? #對差求平方
? ? sqDistances = sqDiffMat.sum(axis =1)#這樣就求出每個新數(shù)據(jù)點(diǎn)和原始數(shù)據(jù)點(diǎn)的距離的平方
? ? distances = sqDistances **0.5? ? ? ? ? #這里求得才是距離
? ? sortedDisIndicies = distances.argsort()#距離升序排序
? ? #about argsort():
? ? #argsort()函數(shù)返回的是數(shù)組值從小到大排序的索引值,也就是原數(shù)組的下標(biāo)(remember下表從0開始算)
? ? #存放分類結(jié)果以及投票次數(shù)
? ? classCount = {}#建立空字典? {key, value},key是label, value 是label的次數(shù)
? ? for iin range(k):
voteLabel = labels[sortedDisIndicies[i]]
classCount[voteLabel] = classCount.get(voteLabel,0) +1
? ? ? ? #voteLabel 不在classCount中時返回0.若在就讀取當(dāng)前的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:用于比較的函數(shù),比較什么由key決定
? ? #key:用列表的某個屬性或者函數(shù)進(jìn)行作為關(guān)鍵字,迭代集合中的一項(xiàng)
? ? #? operator.itemgetter(1)表示獲得對象的第一個域的值,這里是指value
? ? #reverse:排序規(guī)則,True降序,F(xiàn)alse 升序
? ? 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