dimensiereductie_AP_verbeterd.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. #!/bin/env python3
  2. import ithildin as ith
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import sys
  6. from typing import List
  7. from scipy.interpolate import RectBivariateSpline
  8. from pydiffmap.diffusion_map import DiffusionMap
  9. from pydiffmap import visualization as diff_visualization
  10. import matplotlib
  11. # AP model (phase_1000)
  12. # Laadt eerst de data in
  13. data = ith.SimData.from_stem("phase_1000/phase_1000")
  14. # Vermijd randeffecten en initialiatie
  15. def snij_randen_weg(data,variabele,begintijd):
  16. def begin(index):
  17. if index == 0:
  18. return begintijd
  19. return data.vars[variabele].shape[index]//8
  20. def eind(index):
  21. if index == 0:
  22. return data.vars[variabele].shape[index]
  23. if data.vars[variabele].shape[index] < 20:
  24. return data.vars[variabele].shape[index]
  25. return (7 * data.vars[variabele].shape[index])//8
  26. return data.vars[variabele][begin(0):eind(0),begin(1):eind(1),begin(2):eind(2),begin(3):eind(3)]
  27. begintijd = 2
  28. var_u = snij_randen_weg(data, 'u', begintijd).flatten()
  29. var_v = snij_randen_weg(data, 'v', begintijd).flatten()
  30. def als_kolomvector(waardes):
  31. return waardes.reshape((waardes.shape[0], 1))
  32. # Verlaag aantal punten om geheugengebruik en tijdsduur te beperken.
  33. # replace=True strikt genomen incorrect maar wel een stuk sneller
  34. keuzes = np.random.choice(var_u.shape[0], 1000,replace=True)
  35. var_u = var_u[keuzes]
  36. var_v = var_v[keuzes]
  37. # Plot het!
  38. #matplotlib.use("TkAgg")
  39. #plt.scatter(var_u,var_v)
  40. #plt.show()
  41. # Maak nu diffusion maps
  42. faseruimte = np.column_stack((var_u,var_v))
  43. del var_u, var_v # wat geheugen vrijgeven
  44. dmap = DiffusionMap.from_sklearn(n_evecs=2)
  45. dmap.fit(faseruimte[5:46,:])
  46. # geen convergentie bij:
  47. # * 100
  48. # * 200
  49. # * 400
  50. #
  51. # wel convergentie bij:
  52. # * 4
  53. # * 5:46 (41 punten)
  54. # (u,v)-scatterplot, gekleurd met eerste DC
  55. diff_visualization.data_plot(dmap)
  56. # Uitprobeersels:
  57. # * Door epsilon in te stellen op iets tussen 0.001 --- 10,
  58. # kan binnen redelijke tijd een antwoord gevonden worden
  59. # voor alle 1000 punten.
  60. dmap = DiffusionMap.from_sklearn(epsilon=0.001)
  61. dmap.fit(faseruimte)
  62. diff_visualization.data_plot(dmap)