From c8a8999c561778fa76e489331fee1661c4e684e7 Mon Sep 17 00:00:00 2001 From: selalimi <saraelalami2001@gmail.com> Date: Sat, 4 Nov 2023 23:04:05 -0400 Subject: [PATCH] Add Knn.py --- knn.py | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 knn.py diff --git a/knn.py b/knn.py new file mode 100644 index 0000000..6b00003 --- /dev/null +++ b/knn.py @@ -0,0 +1,82 @@ +import numpy as np +import os +import pickle +import matplotlib.pyplot as plt +import plotly.graph_objects as go + + +# Commentaire global expliquant le but du code +'''Here is the code to compute the L2 Euclidean distance matrix and predict labels using k-nearest neighbors:''' +# Create distance Matrix +''' +Arguments : +-Deux matrices. + +Returns : +dists : la matrice de distances euclidiennes L2. +La computation de cette fonction doit être effectuée uniquement avec des manipulations de matrices. +''' +def distance_matrix(X, Y): + XX = np.sum(X ** 2, axis=1, keepdims=True) + YY = np.sum(Y ** 2, axis=1, keepdims=True) + XY = X @ Y.T + dists = XX + YY.T - 2 * XY + return dists + +# KNN predict +''' +Arguments : +-dists : la matrice de distances entre l'ensemble d'entraînement et l'ensemble de test. +-labels_train : les étiquettes d'entraînement. +- k : le nombre de voisins. + +Returns : +-Les étiquettes prédites pour les éléments de data_test. +''' +def knn_predict(dists, labels_train, k): + n_test = dists.shape[0] + y_pred = np.zeros(n_test, dtype=np.int64) + for i in range(n_test): + indices = np.argsort(dists[i])[:k] + k_nearest_labels = labels_train[indices] + y_pred[i] = np.argmax(np.bincount(k_nearest_labels)) + return y_pred + +# evaluate_knn +'''Here is the code to evaluate k-nearest neighbors and plot the accuracy as a function of k:''' +''' +Arguments : +-data_train : les données d'entraînement. +-labels_train : les étiquettes correspondantes. +-data_test : les données de test. +-labels_test : les étiquettes correspondantes. +-k : le nombre de voisins. + +Returns : +-La précision du modèle Knn : le taux de classification entre les valeurs prédites et les observations +réelles des données de test. +''' +def evaluate_knn(data_train, labels_train, data_test, labels_test, k): + dists = distance_matrix(data_test, data_train) + y_pred = knn_predict(dists, labels_train, k) + accuracy = np.mean(y_pred == labels_test) + return accuracy + +# Plot Accuracy of KNN model +''' +******La fonction trace la variation de la précision en fonction du nombre de voisins K**** +Arguments : +-X_train : données d'entraînement +-y_train : étiquettes d'entraînement +-X_test : données de test +-y_test : étiquettes de test +''' +def plot_KNN(X_train, y_train, X_test, y_test, max_k=20): + neighbors = np.arange(1, max_k + 1) + accuracies = [evaluate_knn(X_train, y_train, X_test, y_test, k) for k in neighbors] + plt.plot(neighbors, accuracies, 'b-o') + plt.xlabel('K') + plt.ylabel('Accuracy') + plt.title('Variation of Accuracy with K') + plt.savefig("Results/knn.png") + -- GitLab