1. 程式人生 > >[Machine :Learning] kNN近鄰算法

[Machine :Learning] kNN近鄰算法

出現的次數 假設 .sh dataset () machine main 技術 sorted

from numpy import *
import operator

def createDataSet() :
    group = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 1.1]])
    labels = [A, A, B, B]
    return group, labels


‘‘‘
    tile(array, (intR, intC): 對矩陣進行組合,縱向復制intR次, 橫向復制intC次
    比如 : tile([1,2,3], (3, 2))
    輸出
    [
        [1, 2, 3, 1, 2, 3],
        [1, 2, 3, 1, 2, 3],
        [1, 2, 3, 1, 2, 3]
    ]
    array減法, 兩個 行列數相等的矩陣,對應位置做減法

    argsort(array, axis) 對矩陣進行排序,axis=0 按列排序, axis=1 按行排序  輸出的是排序的索引。比如輸出[0,2,1], 排序結果結果為 array[0],array[2].array[1]

    aorted(iteratorItems, key, reverse)  對可叠代的對象進行排序

‘‘‘ def classify0(intX, dataSet, labels, k) : # 假設輸入 intX = [0, 0], dataSet = array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 1.1]]), labels = [‘A‘, ‘A‘, ‘B‘, ‘B‘], k = 3 dataSetSize = dataSet.shape[0]; # 行數 dataSetSize = 4 diffMat = tile(intX, (dataSetSize, 1)) - dataSet # 矩陣差 diffMat = array([[-1.0, -1.1], [-1.0, -1.0], [0, 0], [0, -1.1]])
sqDiffMat = diffMat ** 2 # 平方 sqDiffMat = array([[1, 1.21], [1, 1], [0, 0], [0, 1.21]]) sqDistances = sqDiffMat.sum(axis=1) # 行和,axis=0時輸出縱和 sqDistances = array([2.21, 2, 0, 1.21]) distances = sqDistances ** 0.5 # 開平方 distances = array([1.41, 1.48, 0, 1.1]) sortedDistIndicies = distances.argsort() #
排序 sortedDistIndicies = array([2, 3, 0, 1]) classCount = {} for i in range(k) : voteIlabel = labels[sortedDistIndicies[i]] classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1 # {label:count}, 取距離最小的三個, 統計label出現的次數,最終 classCount = {‘B‘: 2, ‘A‘: 1} sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) # 對dict按照v值(distance)進行倒序排序 sortedClassCount = [(‘B‘, 2), (‘A‘, 1)] return sortedClassCount[0][0] # 返回第一個tuple的第一個值,也就是出現次數最高的label, 這裏返回‘B’ if __name__ == "__main__": group, labels = createDataSet() classify0([0, 0], group, labels, 3)

技術分享圖片

[Machine :Learning] kNN近鄰算法