Python:k近鄰算法實例

原始數據(訓練集)如下: 

機器學習實戰教程(一):K-近鄰算法(史詩級乾貨長文)

#導入模塊numpy並以np作爲別名 
import numpy as np
#def定義函數,Python 使用def 開始函數定義,緊接着是函數名,括號內部爲函數的參數,
#內部爲函數的 具體功能實現代碼,如果想要函數有返回值, 
#在 expressions 中的邏輯代碼中用return 返回。
def createDataSet():
    #四組二維特徵
    group = np.array([[1,101],[5,89],[108,5],[115,8]])
    #四組特徵的標籤
    labels = ['愛情片','愛情片','動作片','動作片']
    return group, labels
#if __name__ == '__main__':表示組合前邊函數,if __name__=="__main__": 語句之前和之後的
#代碼都被執行兩個等號,兩個下劃線組成一個下劃線,_和__不一樣
if __name__ == '__main__':
    #創建數據集
    group, labels = createDataSet()
    #打印數據集
    print(group)
    print(labels)

 

#導入operator模塊,下文的operator.itemgetter()要用到
import operator
def classify0(inX, dataSet, labels, k):
    #numpy函數shape[0]返回dataSet的行數
    dataSetSize = dataSet.shape[0]
    #在列向量方向上重複inX共1次(橫向),行向量方向上重複inX共dataSetSize次(縱向)
    #Numpy的 tile() 函數,就是將原矩陣橫向、縱向地複製。tile 是瓷磚的意思,
    #顧名思義,這個函數就是把數組像瓷磚一樣鋪展開來。
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet
    #二維特徵相減後平方
    sqDiffMat = diffMat**2
    #sum()所有元素相加,sum(0)列相加,sum(1)行相加
    sqDistances = sqDiffMat.sum(axis=1)
    #開方,計算出距離
    distances = sqDistances**0.5
    #返回distances中元素從小到大排序後的索引值
    sortedDistIndices = distances.argsort()
    #定一個記錄類別次數的字典
    classCount = {}
    for i in range(k):
        #取出前k個元素的類別
        voteIlabel = labels[sortedDistIndices[i]]
        #dict.get(key,default=None),字典的get()方法,返回指定鍵的值,如果值不在字典中返回默認值。
        #計算類別次數
        classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1
    #python3中用items()替換python2中的iteritems()
    #key=operator.itemgetter(1)根據字典的值進行排序
    #key=operator.itemgetter(0)根據字典的鍵進行排序
    #reverse降序排序字典
    #sortedClassCount輸出結果是:“分類名稱,次數”
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    #返回次數最多的類別,即所要分類的類別
    #sortedClassCount[0][0]表示返回第一個數組的第一個分類名稱
    return sortedClassCount[0][0]
 
if __name__ == '__main__':
    #創建數據集
    group, labels = createDataSet()
    #測試集
    test = [101,20]
    #kNN分類
    test_class = classify0(test, group, labels, 3)
    #打印分類結果
    print(test_class)

 

代碼註釋:

①Numpy的 tile() 函數,就是將原矩陣橫向、縱向地複製。tile 是瓷磚的意思,顧名思義,這個函數就是把數組像瓷磚一樣鋪展開來。

    橫向鋪展:

   縱向鋪展:

 ②def 的使用

 3.argsort()函數使用

先將[6,-1,7,2,8]按由小到大排序,分別爲[-1,2,6,7,8],  -1在數組mat中的位置是1;2 在數組mat中的位置是3,依次得到0,2,4。

我們發現argsort()函數是將mat中的元素從小到大排列提取其對應的index(索引),然後輸出到y 

4 對於labels[sortedDistIndices[i]]這行代碼,解釋如下

    sortedDistIndices等同於序號3中的‘y’, i從0開始取值...,sortedDistIndices[]會輸出如下:

labels[]會輸出如下:  

5.詞典中get()函數使用

6.循環語句 for  i  in  range(k)

 

7.Python 字典(Dictionary) items() 函數以列表返回可遍歷的(鍵, 值) 元組數組。

 

8. sorted()函數

 

9.  sortedClassCount[0][0]的關於[0][0]解釋

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章