2-1KNN算法

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

def classify0(inX,dataSet,labels,k):#輸入量,訓練樣本集,標籤向量,取前K個
    dataSetSize = dataSet.shape[0]#返回dataSet的維數,0表示有幾行,1表示有幾列
    #print(dataSetSize)
    diffMat = tile(inX,(dataSetSize,1))-dataSet#把inx的行數拓展,列數不變
   # print(tile(inX,(dataSetSize,1)))
    sqDiffMat = diffMat ** 2
    sqDistances = sqDiffMat.sum(axis = 1)
    distances = sqDistances ** 0.5
    sortedDistIndicies = distances.argsort()  #將distances從小到大排列,提取他們的index
    classCount = {}#定義一個新的字典,存儲對應標籤向量的數量
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
       # print("第%d個的類型是%s" %(i,voteIlabel))
        classCount[voteIlabel] = classCount.get(voteIlabel,0)+1#dict.get(key,0)==dict[],
        #返回特定鍵key的鍵值

        #找出最大的那個
    #print(classCount.items()),結果爲dict_items([('B', 2), ('A', 1)])dict.items() 
    # 功能:以列表返回可遍歷的(鍵,值)元組數組
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    '''sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。
   list 的 sort 方法返回的是對已經存在的列表進行操作,而內建函數 sorted 方法返回的是一個新的 list,
   而不是在原來的基礎上進行的操作。
   '''
    return sortedClassCount[0][0]
def main():
    group,labels=createDataSet()
    print(group)
    print(labels)
    print(classify0([0,1],group,labels,3))

main()    



參考:http://blog.csdn.net/rujin_shi/article/details/78766033
.shape用於計算array各維度的長度,在python中都是從0開始的。
0表示有幾行,1表示有幾列
tile函數是numpy包中的,用於重複array,比如上面代碼中的tile(inX,(dataSetSize,1)),表示重複inX,其行重複dataSetSize次,而列不重複
.sum是numpy中用於計算一個array內部行列求和,axis=1表示按列求和,即把每一行的元素加起來
.argsort是numpy中對array進行排序的函數,排序是升序,提取他們的index下標
classCount = {} 其中{}表示生成的是字典,在字典這個類中,有方法get,對classCount元素賦值,其實是個計數器

get(key,0)返回鍵key的鍵值,若鍵不存在,則返回0,以達到從0計數的效果
sorted是內置函數,可以help(sorted)查看用法
>>> dic={1:'a',2:'c',3:'b'}
>>> import operator 
>>> sorted(dic,key=operator.itemgetter(1),reverse=True)
>>> sorted(dic.items(),key=operator.itemgetter(1),reverse=True)
[(2, 'c'), (3, 'b'), (1, 'a')]
>>> sorted(dic.items(),key=operator.itemgetter(0),reverse=True)
[(3, 'b'), (2, 'c'), (1, 'a')]


operator模塊下的itemgetter函數,顧名思義就是提取第X個元素的意思
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章