====== K-Nearest Neighbour ====== kNN é um dos algoritmos de **classificação** mais simples disponíveis para aprendizado supervisionado. A ideia é procurar as correspondências mais próximas dos dados de teste no espaço de recursos. O KNN tenta classificar cada amostra de um conjunto de dados avaliando sua distância em relação aos vizinhos mais próximos. Se os vizinhos mais próximos forem majoritariamente de uma classe, a amostra em questão será classificada nesta categoria. Como o próprio nome já diz, "k-vizinhos mais próximos", podemos determinar o número ''k''. Quando o ''k'' é pequeno a classificação fica mais sensível a regiões bem próximas podendo ocorrer o overfitting. Por outro lado com ''k'' grande, a classificação fica menos sujeita a ruídos podendo ser considerada mais robusta. Porém se ''k'' for grande demais pode ser que haja o problema de underfitting. ===== Exemplos ===== ==== k=3 ==== {{:nova-amostra-para-classificar.jpg?nolink&200|}}{{:classificando-a-amostra.png?200|}} {{:classificacao-escolhida.jpg?200|}} ==== k=3 ==== \\ {{:proxima-amostra.jpg?nolink&200|}} {{:k3.jpg?200|}}{{:classe-final-com-k3.jpg?200|}} \\ ==== k=5 ==== {{:proxima-amostra.jpg?nolink&200 |}}{{:knn-com-k5-300x292.jpg?nolink&200|}}{{:classe-final-com-k5-300x292.jpg?nolink&200|}} ==== Código ==== import cv2 as cv import numpy as np import matplotlib.pyplot as plt # Feature set containing (x,y) values of 25 known/training data trainData = np.random.randint(0,100,(25,2)).astype(np.float32) # Label each one either Red or Blue with numbers 0 and 1 responses = np.random.randint(0,2,(25,1)).astype(np.float32) # Take Red neighbours and plot them red = trainData[responses.ravel()==0] plt.scatter(red[:,0],red[:,1],80,'r','^') # Take Blue neighbours and plot them blue = trainData[responses.ravel()==1] plt.scatter(blue[:,0],blue[:,1],80,'b','s') plt.show() newcomer = np.random.randint(0,100,(1,2)).astype(np.float32) plt.scatter(newcomer[:,0],newcomer[:,1],80,'g','o') knn = cv.ml.KNearest_create() knn.train(trainData, cv.ml.ROW_SAMPLE, responses) ret, results, neighbours ,dist = knn.findNearest(newcomer, 3) print( "result: {}\n".format(results) ) print( "neighbours: {}\n".format(neighbours) ) print( "distance: {}\n".format(dist) ) plt.show() Resultado: {{ :espaco.png?nolink&500 |}} \\ result: [[1.]] neighbours: [[0. 1. 1.]] distance: [[185. 290. 349.]] ===== Referências ===== [[https://didatica.tech/o-que-e-e-como-funciona-o-algoritmo-knn/|Algoritmo Knn]]