dimensiereductie.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. #!/bin/env python3
  2. #swapoff!
  3. import ithildin as ith
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. import sys
  7. from typing import List
  8. from scipy.interpolate import RectBivariateSpline
  9. #im
  10. from pydiffmap.diffusion_map import DiffusionMap
  11. from pydiffmap import visualization as diff_visualization
  12. import matplotlib
  13. data = ith.SimData.from_stem("../KORRR/phase_1000/phase_1000")
  14. dmap = DiffusionMap.from_sklearn(n_evecs = 1, alpha=0.5, epsilon = 'bgh', k=4)
  15. # de u en v coordinaaten voor een zekere (z,y,x)-positie
  16. uc = data.vars['u'][:,:,200,200].flatten()
  17. uv = data.vars['v'][:,:,200,200].flatten()
  18. matplotlib.use("TkAgg")
  19. plt.scatter(uc,uv)
  20. plt.show()
  21. faseruimte = np.array([uc,uv]) # bekend figuur! lijkt 1-dimensionaal (behalve voor rechtsboven eventueel, maar toch bij benadering ten minste)
  22. # O jee geen convergentie
  23. # dmap.fit(faseruimte.transpose())
  24. # misschien kan convergentie opgelost worden met meer data?
  25. uc = data.vars['u'].flatten()
  26. uv = data.vars['v'].flatten()
  27. # er zijn te veel punten voor plt.scatter om binnen redelijke tijd
  28. # te werken, dus neem een willekeurige selectie
  29. keuzes = np.random.choice(np.arange(uc.shape[0]), 60000,replace=False)
  30. uc2 = uc[keuzes]
  31. uv2 = uv[keuzes]
  32. matplotlib.use("TkAgg")
  33. plt.scatter(uc2, uv2)
  34. plt.show() # dit lijkt er meer op! Opnieuw kan er een soort eendimensionale structuur ontdekt worden maar toch wel wat afwijking.
  35. # Kan dmap.fit hiermee iets doen? (verlaag aantal punten voor snelheid)
  36. keuzes = np.random.choice(np.arange(uc.shape[0]), 1000,replace=False)
  37. uc2 = uc[keuzes]
  38. uv2 = uv[keuzes]
  39. faseruimte2 = np.array([uc2, uv2])
  40. dmap.fit(faseruimte2.transpose())
  41. # (beëindigd wegens te lang bezig)
  42. # misschien is het probleem dat de faseruimte niet echt in een tweedimensionale
  43. # Euclidische ruimte past (en de invoer was al tweedimensionaal). Voorstel:
  44. # hoogdimensionaal werken.
  45. # Returns: an array of shape (N, X×Y×Z)
  46. # where (X,Y,Z) are the number of X, Y and Z positions respectively.
  47. def variable(data, var):
  48. v = data.vars[var]
  49. return np.reshape(v,(v.shape[0], v.shape[1]*v.shape[2]*v.shape[3]))
  50. def all_variables(data,vars):
  51. # Shape: (number of time steps, number of vars * number of grid elements)
  52. return np.append(*map(lambda var: variable(data,var),vars),axis=1)
  53. phase_space = all_variables(data,['u','v'])
  54. dmap = DiffusionMap.from_sklearn(n_evecs=2)
  55. dmap.fit(phase_space) # gelukt!
  56. matplotlib.use("TkAgg")
  57. diff_visualization.data_plot(dmap,dim=3)
  58. diff_visualization.embedding_plot(dmap,dim=2)
  59. # uittesten meer dimensies
  60. dmap = DiffusionMap.from_sklearn(n_evecs=3)
  61. dmap.fit(phase_space) # gelukt!
  62. matplotlib.use("TkAgg")
  63. diff_visualization.data_plot(dmap,dim=3)
  64. diff_visualization.embedding_plot(dmap,dim=3)
  65. data_BOCF = ith.SimData.from_stem("../KORRR/results_9010/PDL_9010")
  66. # Eerst even kijken
  67. var1 = data_BOCF.vars['u'].ravel() # ravel: no copy
  68. var2 = data_BOCF.vars['v'].ravel()
  69. var3 = data_BOCF.vars['w'].ravel()
  70. var4 = data_BOCF.vars['s'].ravel() #???? waarom faalt de code onder nu?
  71. keuzes = np.random.choice(var1.shape[0], 5000,replace=True) # replace=True strikt genomen incorrect maar verlaagt geheugengebruik en wegens de hoge hoeveelheid punten niet belangrijk
  72. var1_ = var1[keuzes]
  73. var2_ = var2[keuzes]
  74. var3_ = var3[keuzes]
  75. var4_ = var4[keuzes]
  76. matplotlib.use("TkAgg")
  77. fig = plt.figure()
  78. ax = fig.add_subplot(projection='3d')
  79. ax.scatter(var1_, var2_, var3_, c=var4_,cmap=plt.hot())
  80. plt.show()
  81. del keuzes
  82. #for k = seq(1,var1.size
  83. # oeps twee verre groepjes punten (misschien interfereren die later?)
  84. eigenaardig = (var3_ > 0.9999999) | (var1_ > 0.5)
  85. #eigenaardig = (var3_ > 0.9999999) | (var1_ > 0.5) # ander groepje
  86. var1__ = np.ma.masked_where(eigenaardig, np.ma.array(var1_))
  87. var2__ = np.ma.masked_where(eigenaardig, np.ma.array(var2_))
  88. var3__ = np.ma.masked_where(eigenaardig, np.ma.array(var3_))
  89. var4__ = np.ma.masked_where(eigenaardig, np.ma.array(var4_))
  90. fig = plt.figure()
  91. ax = fig.add_subplot(projection='3d')
  92. ax.scatter(var1__, var2__, var3__,c=var4__,cmap=plt.hot())
  93. plt.show()
  94. del var1, var2, var3, var4, var1_, var2_, var3_, var4_, var1__, var2__, var3__, var4__, fig, ax
  95. # oeps
  96. def weight_negeer_uitschieters(datum):
  97. # s = data.vars['w'].shape
  98. print(datum)
  99. return oeps()
  100. dmap_BOCF = DiffusionMap.from_sklearn(n_evecs=4,k=32, weight_fxn=weight_negeer_uitschieters) # k kleiner voor snelheid
  101. # data_BOCF is een beetje te groot om mee te werken dus maken we
  102. # het een stuk kleiner zodat np.append op mijn computer ermee overweg kan.
  103. def verkleinde_variable(data, var, step_23):
  104. v = data.vars[var]
  105. points2 = np.arange(0,v.shape[2],step_23)
  106. points3 = np.arange(0,v.shape[3],step_23)
  107. vverkleind = v[:,:,points2,:]
  108. vverkleind = v[:,:,:,points3]
  109. reshaped = np.reshape(vverkleind,(vverkleind.shape[0], vverkleind.shape[1]*vverkleind.shape[2]*vverkleind.shape[3]))
  110. return reshaped
  111. def verkleinde_all_variables(data,vars):
  112. # Shape: (number of time steps, number of vars * reduced number of grid elements)
  113. # TODO: grootte skip
  114. # ok: 50, 38, 31
  115. # nok: 40
  116. return np.concatenate(list(map(lambda var: verkleinde_variable(data,var,31),vars)),axis=1)
  117. dmap_BOCF.fit(verkleinde_all_variables(data_BOCF, ['u', 'v', 'w', 's']))
  118. matplotlib.use("TkAgg")
  119. #diff_visualization.data_plot(dmap_BOCF,dim=3)
  120. gc.collect()
  121. # Plot volgens de tweede, derde en vierde coordinaat. Kleur volgens de eerste.
  122. matplotlib.use("TkAgg")
  123. fig = plt.figure()
  124. ax = fig.add_subplot(projection='3d')
  125. ax.scatter(dmap_BOCF.dmap[:,1],dmap_BOCF.dmap[:,2],dmap_BOCF.dmap[:,3],c=dmap_BOCF.dmap[:,0], cmap='viridis')
  126. plt.show()
  127. # kleur volgens de vierde nieuwe coördinaat
  128. scatter_kwarg = {'c' : dmap_BOCF.dmap[:,3] }
  129. diff_visualization.embedding_plot(dmap_BOCF,dim=3,scatter_kwargs=scatter_kwarg)
  130. #diff_visualization.data_plot(dmap_BOCF,dim=3,n_evecs=1)
  131. gc.collect()
  132. # Plot volgens ???
  133. matplotlib.use("TkAgg")
  134. fig = plt.figure()
  135. ax = fig.add_subplot(projection='3d')
  136. ax.scatter(dmap_BOCF.dmap[:,3],dmap_BOCF.dmap[:,1],dmap_BOCF.dmap[:,2],c=dmap_BOCF.dmap[:,0], cmap='viridis')
  137. plt.show()
  138. # ! globaal
  139. # ! hoe werkt pydiffmap, ph1,...2 in verband brengen met algoritme,
  140. # theorie uitleggen van plotjes (halve pagina puntjes)
  141. # <!> plotje BOFC (buento-...) PDL_9010
  142. ## Laten we eens opnieuw proberen, deze keer lokaal
  143. step_23_ = 50
  144. def verkleinde_variable2(data, var):
  145. v = data.vars[var]
  146. points2 = np.arange(0,v.shape[2],step_23_)
  147. points3 = np.arange(0,v.shape[3],step_23_)
  148. vverkleind = v[:,:,points2,:]
  149. vverkleind = v[:,:,:,points3]
  150. return vverkleind
  151. data_BOCF = ith.SimData.from_stem("../KORRR/results_9010/PDL_9010")
  152. def weight_negeer_uitschieters(datum):
  153. s = data.vars['w'].shape
  154. print(s)
  155. print(datum)
  156. return oeps()
  157. dmap_BOCF = DiffusionMap.from_sklearn(n_evecs=4,k=32) #, weight_fxn=weight_negeer_uitschieters)
  158. dmap_BOCF.fit(np.array((verkleinde_variable2(data_BOCF, 'u').flatten(),verkleinde_variable2(data_BOCF, 'v').flatten(),verkleinde_variable2(data_BOCF, 'w').flatten(),verkleinde_variable2(data_BOCF, 's').flatten())).transpose())
  159. #dmap_BOCF.fit(verkleinde_all_variables(data_BOCF, ['u', 'v', 'w', 's']))