3.K algorithme du plus proche voisin - (k-Nearest Neighbor, KNN pour faire court)

Un, algorithme KNN

L'algorithme d'apprentissage KNN est une méthode d'apprentissage supervisé couramment utilisée dont le principe de fonctionnement est d' utiliser la méthode de mesure de la distance entre différentes valeurs de caractéristiques pour la classification . Les trois éléments de kNN sont le choix de la valeur k, la mesure de la distance et les règles de décision de classification

Résumée en une phrase: "Celui près de Zhu est rouge et celui près de Mo est noir"

Tâche de classification: utilisez la «méthode de vote» , c'est-à-dire sélectionnez l'étiquette de catégorie qui apparaît le plus dans les k échantillons comme résultat de la prédiction.
Tâche de régression: utilisez la "méthode moyenne" , c'est-à-dire la valeur moyenne des étiquettes de sortie de ces k échantillons comme résultat de la prédiction; une moyenne pondérée ou un vote pondéré peut également être effectué , et plus la distance est proche, plus le poids de l'échantillon est important .

Deux, carte intuitive KNN

La discussion sur les performances basée sur les deux classifications est la suivante:
Insérez la description de l'image ici
comme le montre la figure: algorithme kNN, la ligne pointillée montre la ligne équidistante; l'échantillon de test est jugé comme un exemple positif lorsque k = 1 ou k = 5, et un exemple négatif lorsque k = 3 .

3. Principe de l'algorithme (méthode d'apprentissage statistique)

Insérez la description de l'image ici
Il n'y a pas de processus d'apprentissage explicite pour les K voisins les plus proches, c'est-à-dire qu'il n'est pas nécessaire d'apprendre à partir de l'ensemble d'apprentissage.

Quatre, fonctionnalités KNN

  • Avantages: haute précision, insensible aux valeurs aberrantes, aucune hypothèse d'entrée de données
  • Inconvénients: complexité de calcul élevée, complexité spatiale élevée
  • Plage de données applicable: numérique et nominale

Cinq, implémentation d'algorithme

# 数据加载
def loadData(filename):
    dataArr,labelArr = [], []
    for line in open(filename).readlines():
        dataLine = line.strip().split(',')
        dataArr.append([int(num) for num in dataLine[1:]])
        labelArr.append(int(dataLine[0]))
    return dataArr,labelArr

def calcDist(x1, x2):
    # 欧式距离
    return np.sqrt(np.sum(np.square(x1-x2)))
    #马哈顿距离计算公式
    # return np.sum(x1 - x2)

def getClosest(trainDataMat, trainLabelMat, x, topK):
    distList = [0] * len(trainDataMat)
    # 迭代计算与测试数据的距离
    for i in range(len(trainDataMat)):
        x1 = trainDataMat[i]
        curDist = calcDist(x1, x)
        distList[i] = curDist

    # 下标升序排序
    topKList = np.argsort(np.array(distList))[:topK]
    labelList = [0] * 10
    for index in topKList:
        labelList[int(trainLabelMat[index])] += 1

    # 返回类别标签最多的
    return labelList.index(max(labelList))

def model_test_accur(trainDataArr, trainLabelArr, testDataArr, testLabelArr, topK,testNum):

    print('start test')
    # 训练数据
    trainDataMat = np.mat(trainDataArr)
    trainLabelMat = np.mat(trainLabelArr).T
    # 测试数据
    testDataMat = np.mat(testDataArr)
    testLabelMat = np.mat(testLabelArr).T
    errorCnt = 0

    for i in range(testNum):
        print('test {0}:{1}'.format(i,testNum))
        
        testX = testDataMat[i]
        testy = getClosest(trainDataMat, trainLabelMat, testX, topK)

        if testy != testLabelMat[i]: errorCnt += 1
    #返回正确率
    return 1 - (errorCnt / testNum)

Je suppose que tu aimes

Origine blog.csdn.net/weixin_41044112/article/details/108206669
conseillé
Classement