3.K algoritmo de vecino más cercano: (k-Vecino más cercano, KNN para abreviar)

Uno, algoritmo KNN

El algoritmo de aprendizaje KNN es un método de aprendizaje supervisado de uso común. Su principio de funcionamiento es utilizar el método de medir la distancia entre diferentes valores de características para la clasificación . Los tres elementos de kNN son la elección del valor k, la medición de la distancia y las reglas de decisión de clasificación.

Resumido en una frase: "El que está cerca de Zhu es rojo y el que está cerca de Mo es negro"

Tarea de clasificación: utilice el "método de votación" , es decir, seleccione la etiqueta de categoría que aparece más en las k muestras como resultado de la predicción.
Tarea de regresión: utilice el "método de promedios" , es decir, el valor promedio de las etiquetas de salida de estas k muestras como resultado de la predicción; también se puede realizar una votación promedio ponderada o ponderada, y cuanto más cerca esté la distancia, mayor será el peso de la muestra .

Dos, mapa intuitivo KNN

La discusión del desempeño basada en las dos clasificaciones es la siguiente:
Inserte la descripción de la imagen aquí
como se muestra en la figura: algoritmo kNN, la línea de puntos muestra la línea equidistante; la muestra de prueba se juzga como un ejemplo positivo cuando k = 1 o k = 5, y un ejemplo negativo cuando k = 3 .

3. Principio de algoritmo (método de aprendizaje estadístico)

Inserte la descripción de la imagen aquí
No existe un proceso de aprendizaje explícito para K vecinos más cercanos, es decir, no hay necesidad de aprender del conjunto de entrenamiento.

Cuatro, características KNN

  • Ventajas: alta precisión, insensible a valores atípicos, sin suposiciones de entrada de datos
  • Desventajas: alta complejidad computacional, alta complejidad espacial
  • Rango de datos aplicable: numérico y nominal

Cinco, implementación de algoritmos

# 数据加载
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)

Supongo que te gusta

Origin blog.csdn.net/weixin_41044112/article/details/108206669
Recomendado
Clasificación