interp.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. #!/usr/bin/python3
  2. import numpy as np
  3. from scipy import interpolate
  4. def ecdf(x):
  5. data = np.array(x)
  6. sorted_data = np.sort(data)
  7. # Calculer les probabilités cumulées
  8. n = len(sorted_data)
  9. y = np.arange(1, n+1) / n
  10. return y
  11. def gendata():
  12. # Générer des données suivant une distribution normale
  13. mean = 0 # Moyenne de la distribution normale
  14. std_dev = 1 # Écart-type de la distribution normale
  15. num_samples = 100 # Nombre d'échantillons à générer
  16. return np.random.normal(mean, std_dev, num_samples)
  17. data1 = gendata()
  18. data2 = gendata()
  19. x1 = sorted(data1)
  20. y1 = ecdf(data1)
  21. x2 = sorted(data2)
  22. y2 = ecdf(data2)
  23. absmin = max(min(x1), min(x2))
  24. absmax = min(max(x1), max(x2))
  25. # Créer une fonction d'interpolation linéaire
  26. f1 = interpolate.interp1d(x1, y1, kind='linear')
  27. # Générer des points pour l'interpolation
  28. x_interp = np.linspace(absmin, absmax, 1000)
  29. y_interp1 = f1(x_interp)
  30. # Créer une fonction d'interpolation linéaire
  31. f2 = interpolate.interp1d(x2, y2, kind='linear')
  32. # Générer des points pour l'interpolation
  33. y_interp2 = f2(x_interp)
  34. # Calculer l'erreur quadratique moyenne (RMSE)
  35. rmse = np.sqrt(np.mean((y_interp1 - y_interp2) ** 2))
  36. # Calculer l'erreur quadratique moyenne (MAE)
  37. mae = np.mean(abs(y_interp1 - y_interp2))
  38. # normalized RMSE, as y are 0 -> 1 it's just 100x
  39. # normalized MAE, as y are 0 -> 1 it's just 100x
  40. print("NRMSE: {}, NMAE: {}".format(100 * rmse, 100 * mae))
  41. import matplotlib.pyplot as plt
  42. # Tracer un histogramme des données générées
  43. plt.hist(data1, bins=30, color='skyblue', edgecolor='black')
  44. plt.hist(data2, bins=30, color='red', edgecolor='black')
  45. plt.xlabel('Valeurs')
  46. plt.ylabel('Fréquence')
  47. plt.title('Distribution normale générée aléatoirement')
  48. plt.show()
  49. # Tracer le nuage de points et la fonction d'interpolation
  50. plt.scatter(x1, y1, color='blue', label='Données réelles')
  51. plt.scatter(x2, y2, color='red', label='Données réelles')
  52. plt.plot(x_interp, y_interp1, color='orange', label='Données interpolées')
  53. plt.plot(x_interp, y_interp2, color='orange', label='Données interpolées')
  54. plt.xlabel('X')
  55. plt.ylabel('Y')
  56. plt.title('Interpolation linéaire à partir d\'un nuage de points')
  57. plt.legend()
  58. plt.show()