{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":45867,"databundleVersionId":6924515,"sourceType":"competition"}],"dockerImageVersionId":30786,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom sklearn.decomposition import PCA\nimport cv2\nimport os\nimport random\nfrom sklearn.cluster import KMeans\nimport matplotlib.pyplot as plt\nfrom sklearn.cluster import DBSCAN\nfrom sklearn.cluster import SpectralClustering","metadata":{"execution":{"iopub.status.busy":"2024-12-18T22:30:18.431805Z","iopub.execute_input":"2024-12-18T22:30:18.436487Z","iopub.status.idle":"2024-12-18T22:30:20.272222Z","shell.execute_reply.started":"2024-12-18T22:30:18.436338Z","shell.execute_reply":"2024-12-18T22:30:20.271293Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Valeurs pour l'initialisation\n\npath_images = '/kaggle/input/UBC-OCEAN/train_thumbnails/' # on utilise les thumbnails car les vraies images sont trop lourdes.\npath_csv = '/kaggle/input/UBC-OCEAN/train.csv'\nimage_size = 256  # pour la largeur et la longueur\nn_components = 20 # nombre de dimensions visé par la réduction de dimension\nn_clusters = 5 # nombre de groupes d'images visé\niter = 50 # iterrations de la NNMF\n","metadata":{"execution":{"iopub.status.busy":"2024-12-18T22:30:20.273812Z","iopub.execute_input":"2024-12-18T22:30:20.274326Z","iopub.status.idle":"2024-12-18T22:30:20.27996Z","shell.execute_reply.started":"2024-12-18T22:30:20.274293Z","shell.execute_reply":"2024-12-18T22:30:20.278548Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def Crea_Dic_KMeans2a(n_clusters,Xlabels,reduced_X):\n    #K-means pour une couche de couleur \n\n    Dic_KMeans = {}\n\n    kmeans = KMeans(n_clusters=n_clusters, random_state=0, n_init=10)\n\n    # on applique  K-means à l'image réduite\n    kmeans.fit(reduced_X[0])\n    labels = kmeans.labels_\n    \n    for i in range(len(labels)):\n        Dic_KMeans[i]=[labels[i],Xlabels[i]] # dictionnaire avec les labels du K-means (0,1,2 ..) et le labels initiaux\n    \n    return Dic_KMeans,reduced_X[0]","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:36:00.792902Z","iopub.execute_input":"2024-12-18T22:36:00.793355Z","iopub.status.idle":"2024-12-18T22:36:00.800018Z","shell.execute_reply.started":"2024-12-18T22:36:00.79332Z","shell.execute_reply":"2024-12-18T22:36:00.798817Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def Crea_Dic_KMeans3(n_clusters,Xlabels,reduced_X): # K-means avec la moyenne des couches RGB après la réduction de dimension\n\n    reduced_X = np.mean(reduced_X, axis=0)\n\n    Dic_KMeans = {}\n\n    kmeans = KMeans(n_clusters=n_clusters, random_state=0, n_init=10)\n\n    kmeans.fit(reduced_X)\n    labels = kmeans.labels_\n    \n    for i in range(len(labels)):\n        Dic_KMeans[i]=[labels[i],Xlabels[i]] # dictionnaire avec les labels du K-means (0,1,2 ..) et le labels initiaux\n    \n    return Dic_KMeans, reduced_X","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:30:20.296202Z","iopub.execute_input":"2024-12-18T22:30:20.297246Z","iopub.status.idle":"2024-12-18T22:30:20.304327Z","shell.execute_reply.started":"2024-12-18T22:30:20.297189Z","shell.execute_reply":"2024-12-18T22:30:20.303269Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def Crea_Dic_KMeans4(n_clusters,Xlabels,reduced_X): # K_means sur chaque couche puis k-means sur l'ensemble\n\n    Dic_KMeans = {}\n    L = [] # liste des labels générés  par les premiers K-means\n    \n    for k in range (3): # K-means sur chaque couche\n        \n        kmeans = KMeans(n_clusters=n_clusters, random_state=0, n_init=10)\n    \n        kmeans.fit(reduced_X[k])\n        L.append(kmeans.labels_)\n        \n    New_reduced_X = np.array([L[i] for i in range (3)]) #  création d'une nouvelle matrice avec les premiers K-means\n\n    kmeans = KMeans(n_clusters=n_clusters, random_state=0, n_init=10)\n    kmeans.fit(New_reduced_X.T) # transposition pour avoir la matrice verticale\n    labels = kmeans.labels_ # labels finaux\n    \n    for i in range(len(labels)):\n        Dic_KMeans[i]=[labels[i],Xlabels[i]]\n    \n    return Dic_KMeans, New_reduced_X.T","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:30:20.305547Z","iopub.execute_input":"2024-12-18T22:30:20.305913Z","iopub.status.idle":"2024-12-18T22:30:20.316021Z","shell.execute_reply.started":"2024-12-18T22:30:20.305869Z","shell.execute_reply":"2024-12-18T22:30:20.314936Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def P(Dic_KMeans,n_clusters): # synthétisation du clustering  # exemple élément du dico : CC : [12,5,8,23,1] et chaque index est le numéro du cluster\n    Dic = {'CC':[0]*n_clusters,'EC':[0]*n_clusters,'HGSC':[0]*n_clusters,'LGSC':[0]*n_clusters,'MC':[0]*n_clusters} # tri par label initial\n    for image_id in Dic_KMeans:\n        Dic[Dic_KMeans[image_id][1]][Dic_KMeans[image_id][0]] += 1\n    return Dic\n        ","metadata":{"execution":{"iopub.status.busy":"2024-12-18T22:30:20.317501Z","iopub.execute_input":"2024-12-18T22:30:20.317937Z","iopub.status.idle":"2024-12-18T22:30:20.328565Z","shell.execute_reply.started":"2024-12-18T22:30:20.317895Z","shell.execute_reply":"2024-12-18T22:30:20.327484Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef graph_camembert(Dic,l):\n\n    labels = ['CC', 'EC', 'HGSC', 'LGSC', 'MC']\n    sizes = {} # Proportions pour chaque catégorie\n    \n    for s in range(n_clusters): #  on prend en compte ici que les labels initiaux sont inégalement répartis\n        sizes[s]=[[(Dic[label][s])/sum(Dic[label]) for label in Dic],[Dic[label][s] for label in labels]]  \n        \n    \n    for s in range(n_clusters):\n        plt.figure(figsize=(8, 6))\n        plt.pie(sizes[s][0], labels=labels, autopct='%1.1f%%', shadow=True, startangle=140)\n    \n        plt.title('Répartition des labels pour le cluster '+str(s)+' avec '+str(round(sum(sizes[s][1])/l*100))+' % des individus') # pourcentage d'images par cluster \n        plt.axis('equal')  # Pour que le camembert soit un cercle\n    plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-12-18T22:30:20.330011Z","iopub.execute_input":"2024-12-18T22:30:20.33103Z","iopub.status.idle":"2024-12-18T22:30:20.341034Z","shell.execute_reply.started":"2024-12-18T22:30:20.330977Z","shell.execute_reply":"2024-12-18T22:30:20.339924Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def graph_barres(Dic,type):\n    note = 0 # note finale pour chaque méthode\n\n    D = {1:'avec 1 couche grise ', 2:'avec la moyenne de 3 couches RGB ',3:'avec K_means de chaque couche RGB',4:'avec DBSCAN et la moyenne de 3 couches RGB', 5:'avec SpectralClustering et la moyenne de 3 couches RGB' }\n\n    L = [label for label in Dic]\n    \n    hauteurs = [round((max(Dic[label]))/sum(Dic[label])*100,1) for label in L] # la population majoritaire pour chaque label initial\n    labels = [label+' cluster '+str(Dic[label].index(max(Dic[label]))) for label in L]\n    labels_info = {}\n\n    a=-1\n    for label in L: # clacul de la note final pour chaque méthode \n        a+=1\n        cluster = Dic[label].index(max(Dic[label]))\n        if cluster not in labels_info:\n            labels_info[cluster] = [0,hauteurs[a]] \n        labels_info[cluster][0] += 1\n        \n    for cluster in labels_info:\n        if labels_info[cluster][0] == 1:\n            note += (1/len(L)*labels_info[cluster][1])  # somme du produit  de 1/n_cluster et du pourcentage max d'un label dans un cluster si ce label est exclusif au cluster\n        \n\n            \n   # Créer l'histogramme\n    plt.figure(figsize=(12, 5))\n    plt.bar(labels, hauteurs, color='skyblue', edgecolor='black')\n    \n    # titres et étiquettes\n    \n    plt.title(\"efficacité du classement \"+ D[type] + \" Note = \"+ str(note) + \"/100\" )\n    plt.ylabel('pourcentages')\n    \n    plt.grid(axis='y', alpha=0.75)\n    plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-12-18T22:30:20.342273Z","iopub.execute_input":"2024-12-18T22:30:20.342622Z","iopub.status.idle":"2024-12-18T22:30:20.357056Z","shell.execute_reply.started":"2024-12-18T22:30:20.342589Z","shell.execute_reply":"2024-12-18T22:30:20.35608Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def nuage(Dic_Kmeans,reduced_M,type):\n    D = {1:'avec 1 couche grise ', 2:'avec la moyenne de 3 couches RGB ',3:'avec K_means de chaque couche RGB',4:'avec DBSCAN et la moyenne de 3 couches RGB', 5:'avec SpectralClustering et la moyenne de 3 couches RGB' }\n\n    abscisses = [reduced_M[i][0] for i in range(len(reduced_M))] # on récupère les positions de chaque image\n    ordonnees = [reduced_M[i][1] for i in range(len(reduced_M))]\n    noms = [str(Dic_Kmeans[i][1]) for i in range(len(reduced_M))]\n    C={0:\"black\",1:\"brown\",2:\"pink\",3:\"green\",4:\"blue\",5:\"purple\"}\n\n    couleurs = [C[Dic_Kmeans[i][0]] for i in range(len(reduced_M))]\n    \n    plt.figure(figsize=(8, 6))\n    \n    for i in range(len(noms)):\n        plt.scatter(abscisses[i], ordonnees[i], color=couleurs[i], s=100) # on rajoute les couleurs (labels du clustering)\n    \n        plt.text(abscisses[i], ordonnees[i], noms[i], fontsize=8, ha='right', color='black') # on rajoute les labels initiaux\n    \n    plt.xlabel('Abscisse')\n    plt.ylabel('Ordonnee')\n    plt.title('Graphique avec couleurs indépendantes pour chaque point'+ D[type])\n    \n    plt.grid(True)\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:30:20.358484Z","iopub.execute_input":"2024-12-18T22:30:20.359445Z","iopub.status.idle":"2024-12-18T22:30:20.374926Z","shell.execute_reply.started":"2024-12-18T22:30:20.359396Z","shell.execute_reply":"2024-12-18T22:30:20.373879Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ntrain_df = pd.read_csv(path_csv)\n\n\ndef list_files_in_folders(folder_path):   # récupération des paths et des labels initiaux pour chaque image\n    files = []\n    labels = []\n    for root, dirs, filenames in os.walk(folder_path):\n        for filename in filenames:\n            image_id = train_df[train_df['image_id'] == int(filename.split('_')[0])]['label'].iloc[0]\n            labels.append(image_id)\n            files.append(os.path.join(root, filename))\n    return files ,labels\n\nfiles ,labels = list_files_in_folders(path_images)\n\ndf = pd.DataFrame({'path': files, 'category': labels}) #crée un tableau avec à gauche le chemin de l'image et à droite le label\n\n\ndf.tail(13)\ndef read_image(df):\n    images = []\n    labels = []\n    for index, row in df.iterrows():\n       image = cv2.imread(row['path'])\n       image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # on transforme l'image en trois couches RGB\n       images.append(image)\n       labels.append(row['category'])\n    return images , labels\n\n\nimages , labels = read_image(df) \n\n\ndef resize_normalize_batch(images, labels):\n    resized_images = []\n    for image in images:\n        resized_image = cv2.resize(image, (image_size,image_size)) #donnne une taille 256*256\n        resized_image = resized_image / 255. #divise pour avoir des pixels entre 0-1\n        resized_images.append(resized_image)\n    return np.array(resized_images), labels\n\nimages , labels = resize_normalize_batch(images , labels) #applique la fonction précédente\n \nlabels = np.array(labels) # sous forme d'un tableau numpy\n\nV = images # tableau avec toutes les images \n","metadata":{"execution":{"iopub.status.busy":"2024-12-18T22:30:20.37834Z","iopub.execute_input":"2024-12-18T22:30:20.378739Z","iopub.status.idle":"2024-12-18T22:32:30.097419Z","shell.execute_reply.started":"2024-12-18T22:30:20.37869Z","shell.execute_reply":"2024-12-18T22:32:30.096183Z"},"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n\n#on veut V=W*H, on utilise la loss function abs(V-WH)**2, pour cela on fait une boucle telle que l'update de H permet d'update W.\ndef update_H(W, H, V):\n    numerator = W.T.dot(V)\n    denominator = W.T.dot(W).dot(H) + 1e-10\n    H = H*(numerator / denominator)\n    return H\n\ndef update_W(W, H, V):\n    numerator = V.dot(H.T)\n    denominator = W.dot(H).dot(H.T) + 1e-10\n    W = W*(numerator / denominator)\n    return W\n\ndef do_nnmf(V,rank,iter):\n\n     # Initialize\n     n = V.shape[0] #nbr d'images\n     m = V.shape[1] #nbr de ligne et de colonnes n*m\n\n     W = np.abs(np.random.randn(n, rank))#n lignes(nbr d'images) rank colonnes rempli de nombre positifs aléatoirs\n   \n     H = np.abs(np.random.randn(rank, m)) #rank ligne et m colonnes (256*256)\n\n     for i in range(iter):\n         H = update_H(W, H, V)\n         W = update_W(W, H, V)\n         \n         print(i)\n     return H, W\n\ndef reductiondim(X):   #X.shape=(400,256,256,3)\n    W = []\n    pourcentage =  []\n    \n    for i in range (3):     #sur l'ensemble des couches:\n        V = X[:,:,:,i]\n        reshaped_V = V.reshape(V.shape[0], image_size*image_size)  # on reshape pour avoir reshaped_V.shape = (400,256*256)\n        h, w = do_nnmf(reshaped_V,n_components,iter) \n        W.append(w)\n    \n        \n        # on reconstitue la matrice approximée\n        V_reconstructed = np.dot(w, h)\n        \n        # Calcule de l'erreur de reconstruction\n        reconstruction_error = np.linalg.norm(reshaped_V - V_reconstructed, 'fro')  # Norme Frobenius \n        \n        # Calculer l'erreur de reconstruction initiale \n        total_error = np.linalg.norm(reshaped_V, 'fro')\n        \n        # Le pourcentage d'information conservée\n        pourcentage.append((1 - reconstruction_error / total_error) * 100)\n        \n\n \n    return W,pourcentage\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:32:30.099192Z","iopub.execute_input":"2024-12-18T22:32:30.100059Z","iopub.status.idle":"2024-12-18T22:32:30.110505Z","shell.execute_reply.started":"2024-12-18T22:32:30.100005Z","shell.execute_reply":"2024-12-18T22:32:30.109442Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\ndef DB(labels,W,e,m): # clustering en utilisant DBSCAN et la moyenne des 3 couches RGB\n\n    reduced_X = np.mean(W, axis=0)\n    \n    Dic_DBSCAN = {}\n\n\n    # Application de DBSCAN\n    dbscan = DBSCAN(eps=e, min_samples=m)\n    dbscan_labels = dbscan.fit_predict(reduced_X)\n    L= set(dbscan_labels)\n    \n    for i in range(len(labels)):\n        Dic_DBSCAN[i]=[dbscan_labels[i],labels[i]]\n        \n    return Dic_DBSCAN, reduced_X, len(L) # len(L) permet d'obtenir le nombre de clusters","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:32:30.111747Z","iopub.execute_input":"2024-12-18T22:32:30.112093Z","iopub.status.idle":"2024-12-18T22:32:30.127399Z","shell.execute_reply.started":"2024-12-18T22:32:30.112039Z","shell.execute_reply":"2024-12-18T22:32:30.126243Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def SPC(labels,W): # clustering en utilisant spectral et la moyenne des 3 couches RGB\n\n    reduced_X = np.mean(W, axis=0)\n    Dic_SPC = {}\n\n    \n    # Application de Spectral Clustering\n    spectral = SpectralClustering(n_clusters=5, affinity='nearest_neighbors')\n    spectral_labels = spectral.fit_predict(reduced_X)\n   \n\n    for i in range(len(labels)):\n        Dic_SPC[i]=[spectral_labels[i],labels[i]]\n        \n    return Dic_SPC, reduced_X\n\n\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:32:30.128975Z","iopub.execute_input":"2024-12-18T22:32:30.129451Z","iopub.status.idle":"2024-12-18T22:32:30.144267Z","shell.execute_reply.started":"2024-12-18T22:32:30.129411Z","shell.execute_reply":"2024-12-18T22:32:30.143214Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def comparaison(W,e,m):\n    D1,W1 = Crea_Dic_KMeans2a(n_clusters,labels,W)\n    D2,W2 = Crea_Dic_KMeans3(n_clusters,labels,W)\n    D3,W3 = Crea_Dic_KMeans4(n_clusters,labels,W)\n    D4,W4, n = DB(labels,W,e,m)\n    D5,W5 = SPC(labels,W)\n    P1=P(D1,n_clusters)\n    P2=P(D2,n_clusters)\n    P3=P(D3,n_clusters)\n    P4=P(D4,n)\n    P5=P(D5,n_clusters)\n    graph_barres(P1,1)\n    graph_barres(P2,2)\n    graph_barres(P3,3)\n    graph_barres(P4,4)\n    graph_barres(P5,5)\n    nuage(D1,W1,1)\n    nuage(D2,W2,2)\n    nuage(D3,W3,3)\n    nuage(D5,W5,5)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:40:50.682589Z","iopub.execute_input":"2024-12-18T22:40:50.683772Z","iopub.status.idle":"2024-12-18T22:40:50.691039Z","shell.execute_reply.started":"2024-12-18T22:40:50.683726Z","shell.execute_reply":"2024-12-18T22:40:50.689821Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# **K-Means en utilisant la NNMF avec 3 chanels**","metadata":{}},{"cell_type":"code","source":"W,pourcentage_NNMF = reductiondim(V)\nprint(W,pourcentage_NNMF)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:32:30.157741Z","iopub.execute_input":"2024-12-18T22:32:30.158149Z","iopub.status.idle":"2024-12-18T22:34:11.051016Z","shell.execute_reply.started":"2024-12-18T22:32:30.158116Z","shell.execute_reply":"2024-12-18T22:34:11.048909Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Dic_KMeans_NNMF,W6 = Crea_Dic_KMeans2a(n_clusters,labels,W)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:36:09.705982Z","iopub.execute_input":"2024-12-18T22:36:09.706792Z","iopub.status.idle":"2024-12-18T22:36:10.481639Z","shell.execute_reply.started":"2024-12-18T22:36:09.706752Z","shell.execute_reply":"2024-12-18T22:36:10.480727Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(len(Dic_KMeans_NNMF))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:36:14.431997Z","iopub.execute_input":"2024-12-18T22:36:14.432399Z","iopub.status.idle":"2024-12-18T22:36:14.437561Z","shell.execute_reply.started":"2024-12-18T22:36:14.432366Z","shell.execute_reply":"2024-12-18T22:36:14.436371Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"Dic_NNMF=P(Dic_KMeans_NNMF,n_clusters)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:36:18.93472Z","iopub.execute_input":"2024-12-18T22:36:18.935551Z","iopub.status.idle":"2024-12-18T22:36:18.940277Z","shell.execute_reply.started":"2024-12-18T22:36:18.93551Z","shell.execute_reply":"2024-12-18T22:36:18.939188Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"print(len(Dic_NNMF))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:36:21.766947Z","iopub.execute_input":"2024-12-18T22:36:21.767362Z","iopub.status.idle":"2024-12-18T22:36:21.772861Z","shell.execute_reply.started":"2024-12-18T22:36:21.767327Z","shell.execute_reply":"2024-12-18T22:36:21.77173Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"graph_camembert(Dic_NNMF,len(Dic_KMeans_NNMF))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:36:24.157035Z","iopub.execute_input":"2024-12-18T22:36:24.157409Z","iopub.status.idle":"2024-12-18T22:36:25.186416Z","shell.execute_reply.started":"2024-12-18T22:36:24.157379Z","shell.execute_reply":"2024-12-18T22:36:25.184873Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"graph_barres(Dic_NNMF,1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:37:28.207068Z","iopub.execute_input":"2024-12-18T22:37:28.207487Z","iopub.status.idle":"2024-12-18T22:37:28.432501Z","shell.execute_reply.started":"2024-12-18T22:37:28.207451Z","shell.execute_reply":"2024-12-18T22:37:28.431308Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"nuage(Dic_KMeans_NNMF,W6,1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:38:00.139054Z","iopub.execute_input":"2024-12-18T22:38:00.140058Z","iopub.status.idle":"2024-12-18T22:38:06.03352Z","shell.execute_reply.started":"2024-12-18T22:38:00.140018Z","shell.execute_reply":"2024-12-18T22:38:06.032113Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"comparaison(W,0.015,1)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2024-12-18T22:41:07.302406Z","iopub.execute_input":"2024-12-18T22:41:07.302776Z","iopub.status.idle":"2024-12-18T22:41:35.443443Z","shell.execute_reply.started":"2024-12-18T22:41:07.302747Z","shell.execute_reply":"2024-12-18T22:41:35.442246Z"}},"outputs":[],"execution_count":null}]}