dimensiereductie_AP_veelpunten.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  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. # Dit bouwt verder op dimensiereductie_AP_verbeterd.py
  13. # door heel veel meer punten te nemen, en maakt gebruik
  14. # van de bevinding dat door epsilon handmatig in te stellen,
  15. # er geen convergentieproblemen ontstaan bij ARPACK.
  16. # Laadt eerst de data in
  17. data = ith.SimData.from_stem("phase_1000/phase_1000")
  18. # Vermijd randeffecten en initialiatie
  19. def snij_randen_weg(data,variabele,begintijd):
  20. def begin(index):
  21. if index == 0:
  22. return begintijd
  23. return data.vars[variabele].shape[index]//8
  24. def eind(index):
  25. if index == 0:
  26. return data.vars[variabele].shape[index]
  27. if data.vars[variabele].shape[index] < 20:
  28. return data.vars[variabele].shape[index]
  29. return (7 * data.vars[variabele].shape[index])//8
  30. return data.vars[variabele][begin(0):eind(0),begin(1):eind(1),begin(2):eind(2),begin(3):eind(3)]
  31. def als_kolomvector(waardes):
  32. return waardes.reshape((waardes.shape[0], 1))
  33. def onderzoek(aantal_punten):
  34. begintijd = 2
  35. var_u = snij_randen_weg(data, 'u', begintijd).flatten()
  36. var_v = snij_randen_weg(data, 'v', begintijd).flatten()
  37. # Verlaag aantal punten om geheugengebruik en tijdsduur te beperken.
  38. # replace=True strikt genomen incorrect maar wel een stuk sneller
  39. np.random.seed(0)
  40. keuzes = np.random.choice(var_u.shape[0], aantal_punten, replace=True)
  41. var_u = var_u[keuzes]
  42. var_v = var_v[keuzes]
  43. # Plot het!
  44. # print("scatter")
  45. # plt.scatter(var_u,var_v)
  46. # plt.title("phaseplot of steekproef of AP model (%s points)" % (aantal_punten,)) # todo engels
  47. # plt.xlabel("u")
  48. # plt.ylabel("v")
  49. # plt.savefig("AP %s punten 0.04 eps 2 eigvectoren (scatter).png" % (aantal_punten,))
  50. # plt.savefig("AP %s punten 0.04 eps 2 eigvectoren (scatter).pdf" % (aantal_punten,))
  51. # plt.close()
  52. # Maak nu diffusion maps
  53. faseruimte = np.column_stack((var_u,var_v))
  54. np.random.seed(100)
  55. dmap = DiffusionMap.from_sklearn(epsilon=0.04, n_evecs=2) #0.01)
  56. np.random.seed(200)
  57. print("fitting")
  58. dmap.fit(faseruimte)
  59. print("data")
  60. fig = diff_visualization.data_plot(dmap,show=False)
  61. fig.gca().set_title("Data coloured with first DC (AP model, %s points)" % (aantal_punten,)) # todo engels
  62. plt.xlabel("u")
  63. plt.ylabel("v")
  64. fig.savefig("AP %s punten 0.04 eps 2 eigvectoren (data).png" % (aantal_punten,))
  65. fig.savefig("AP %s punten 0.04 eps 2 eigvectoren (data).pdf" % (aantal_punten,))
  66. plt.close()
  67. print("embedding")
  68. fig = diff_visualization.embedding_plot(dmap,show=False)
  69. fig.gca().set_title("Embedding given by first two DCs (AP model, %s points)" % (aantal_punten,)) # todo engels
  70. fig.savefig("AP %s punten 0.04 eps 2 eigvectoren (embedding).png" % (aantal_punten,))
  71. fig.savefig("AP %s punten 0.04 eps 2 eigvectoren (embedding).pdf" % (aantal_punten,))
  72. plt.close()
  73. # Voor 7000 moet ik al een tijdje wachten
  74. for aantal_punten in [100, 200, 500, 1000, 2000, 3000, 4000, 5000, 6000]:
  75. onderzoek(aantal_punten)
  76. # AP 6000 punten 0.04 eps 2 eigvectoren.png: twee deuken in een cirkel, een paar uitschieters
  77. # AP 3000 punten 0.04 eps 2 eigvectoren.png: twee deukjes, een aantal uitschieters
  78. # AP 2000 punten 0.04 eps 2 eigvectoren.png: een appel met twee ogen
  79. # AP 1000 punten 0.04 eps 2 eigvectoren.png: een neus met een paar stippen