| 
					
				 | 
			
			
				@@ -0,0 +1,79 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#!/usr/bin/python3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import numpy as np 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+from scipy import interpolate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def ecdf(x): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    data = np.array(x) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    sorted_data = np.sort(data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # Calculer les probabilités cumulées 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    n = len(sorted_data) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    y = np.arange(1, n+1) / n 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return y 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+def gendata(): 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    # Générer des données suivant une distribution normale 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    mean = 0  # Moyenne de la distribution normale 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    std_dev = 1  # Écart-type de la distribution normale 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    num_samples = 100  # Nombre d'échantillons à générer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return np.random.normal(mean, std_dev, num_samples) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+data1 = gendata() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+data2 = gendata() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+x1 = sorted(data1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+y1 = ecdf(data1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+x2 = sorted(data2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+y2 = ecdf(data2) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+absmin = max(min(x1), min(x2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+absmax = min(max(x1), max(x2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Créer une fonction d'interpolation linéaire 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+f1 = interpolate.interp1d(x1, y1, kind='linear') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Générer des points pour l'interpolation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+x_interp = np.linspace(absmin, absmax, 1000) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+y_interp1 = f1(x_interp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Créer une fonction d'interpolation linéaire 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+f2 = interpolate.interp1d(x2, y2, kind='linear') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Générer des points pour l'interpolation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+y_interp2 = f2(x_interp) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Calculer l'erreur quadratique moyenne (RMSE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+rmse = np.sqrt(np.mean((y_interp1 - y_interp2) ** 2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Calculer l'erreur quadratique moyenne (MAE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+mae = np.mean(abs(y_interp1 - y_interp2)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# normalized RMSE, as y are 0 -> 1 it's just 100x 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# normalized MAE, as y are 0 -> 1 it's just 100x 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+print("NRMSE: {}, NMAE: {}".format(100 * rmse, 100 * mae)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import matplotlib.pyplot as plt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Tracer un histogramme des données générées 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.hist(data1, bins=30, color='skyblue', edgecolor='black') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.hist(data2, bins=30, color='red', edgecolor='black') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.xlabel('Valeurs') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.ylabel('Fréquence') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.title('Distribution normale générée aléatoirement') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.show() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+# Tracer le nuage de points et la fonction d'interpolation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.scatter(x1, y1, color='blue', label='Données réelles') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.scatter(x2, y2, color='red', label='Données réelles') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.plot(x_interp, y_interp1, color='orange', label='Données interpolées') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.plot(x_interp, y_interp2, color='orange', label='Données interpolées') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.xlabel('X') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.ylabel('Y') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.title('Interpolation linéaire à partir d\'un nuage de points') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.legend() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+plt.show() 
			 |