原始代碼:
程序清單0:
from numpy import *
import operator
def createDataSet():
group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels
執行:
>>>import knn
>>>group, labels = knn.createDataSet()
>>>group
array([[ 1. , 1.1],
[ 1. , 1. ],
[ 0. , 0. ],
[ 0. , 0.1]])
>>>labels
['A', 'A', 'B', 'B']
程序清單2-1:
程序清單2-1和上面的程序清單0是在一個.py文件裏,是緊接着上面的代碼寫的
def classify0(inX, dataSet, labels, k):
#shape[0]獲取行 shape[1] 獲取列
dataSetSize = dataSet.shape[0]
#tile將inX擴充爲dataSetSize行1倍inX列的矩陣
diffMat = tile(inX, (dataSetSize,1)) - dataSet
#下面三行代碼計算距離
sqDiffMat = diffMat**2
sqDistances = sqDiffMat.sum(axis=1)
distances = sqDistances**0.5
#用argsort函數返回的是,數組每個元素從小到大排序後的索引值,即第1、2、3...的位置序號
sortedDistIndicies = distances.argsort()
#字典:key:label,value:前k個點中,該label的點的個數
classCount = {}
#投票並統計票數最多的label
for i in range(k):
#得到第i近的點的label,sortedDistIndicies[i]表示該點在DataSet中的序號
voteIlabel = labels[sortedDistIndicies[i]]
#在classCount中給key爲voteIlabel的value +1
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
#將投票計距離最近的前k個點的label數的字典進行排序,返回值sortedClassCount
#類型爲list[(label1,label1Count),(label2,label2Count)]每個括號內爲tuple
sortedClassCount = sorted(classCount.iteritems(),
key = operator.itemgetter(1), reverse = True)
#返回sortedClassCount中第一個位置的tuple中的第一個位置的值,即得票最多的label
return sortedClassCount[0][0]
執行:
>>>knn.classify0([1,1], group, labels, 3)
>>>'A'