1. 程式人生 > >《機器學習實戰》學習總結1——K-近鄰演算法(程式清單2-1)

《機器學習實戰》學習總結1——K-近鄰演算法(程式清單2-1)

程式碼如下:

    def classify0(inX, dataSet, labels, k):   
    # inX是用於分類的輸入向量,dataSet是輸入的訓練樣本集,lebels是標籤向量,k是用於選擇最近鄰居的數目
    dataSetSize = dataSet.shape[0]    
    # 訓練樣本個數 , 有多少行資料 shape反回一個元組。(行, 列)
    
    diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet   
     # tile(inX, (dataSetSize,1)) 建立一個numpy的array,dataSetSize行,每行資料是inX
    sqDiffMat = diffMat**2# 矩陣的每個值平方
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5    # distance是inX與dataSet的歐氏距離
    sortedDistIndicies = distances.argsort()    # 返回排序從小到達的索引位置
    classCount = {}   # 字典儲存k近鄰不同label出現的次數
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1    # 對應label加1,classCount中若無此key,則預設為0
    sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)    
    #reverse=True代表從大到小排序
    #reverse=False或者預設代表從小到大排序
    return sortedClassCount[0][0]    # 返回k近鄰中所屬類別最多的哪一類