diff --git a/knn.py b/knn.py
new file mode 100644
index 0000000000000000000000000000000000000000..6b00003c93db9013aaf8cef165b8c7d572ee4f23
--- /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")
+