dimensiereductie_courtemanche2D_spiraal.py 4.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. # Courtemanche1998 model, 2 ruimtedimensies, 21 variabelen,
  12. # andere bron (resulterende in een spiraal)
  13. data = ith.SimData.from_stem("myokit_CMspiral3/myokit_5")
  14. # Vermijd randeffecten en initialiatie
  15. # TODO: begintijd zou in principe in de log moeten staan
  16. def snij_randen_weg(variabele,begintijd, eindtijd):
  17. def begin(index):
  18. if index == 0:
  19. return begintijd
  20. return variabele.shape[index]//8
  21. def eind(index):
  22. if index == 0:
  23. return eindtijd
  24. if variabele.shape[index] < 20:
  25. return variabele.shape[index]
  26. return (7 * variabele.shape[index])//8
  27. return variabele[begin(0):eind(0),begin(1):eind(1),begin(2):eind(2),begin(3):eind(3)]
  28. def snij_randen_weg2(variables,begintijd,eindtijd):
  29. newdata = dict()
  30. for key in variables.keys():
  31. newdata[key] = snij_randen_weg(variables[key], begintijd,eindtijd)
  32. return newdata
  33. def onderzoek(t0, t1, aantal_punten, eps):
  34. vars = snij_randen_weg2(data.vars, t0, t1)
  35. # We bekijken de faseruimte, tijds- en ruimtecoordinaten zijn daarin niet van belang.
  36. for key in vars.keys():
  37. vars[key] = vars[key].ravel()
  38. # Verlaag aantal punten om geheugengebruik en tijdsduur te beperken.
  39. # replace=True strikt genomen incorrect maar verlaagt geheugengebruik
  40. # en wegens de hoge hoeveelheid punten weinig belangrijk
  41. np.random.seed(1)
  42. keuzes = np.random.choice(vars['u'].shape[0], aantal_punten,replace=True)
  43. for key in data.vars.keys():
  44. vars[key] = vars[key][keuzes]
  45. # Nu de randen verwijderd zijn en we punten in een faseruimte hebben, kunnens we proberen
  46. # diffusion maps te gebruiken.
  47. dmap = DiffusionMap.from_sklearn(epsilon=eps,n_evecs=21)
  48. dmap.fit(np.column_stack((vars['gateui'], vars['gatexs'], vars['gated'], vars['Ca'], vars['gatew'], vars['gateu'], vars['Na'], vars['gateoa'], vars['Caup'], vars['gatef'], vars['gateua'], vars['gateh'], vars['gatexr'], vars['K'], vars['gatefCa'], vars['u'], vars['gatem'], vars['gatev'], vars['gatej'], vars['gateoi'], vars['Carel'])))
  49. diff_visualization.embedding_plot(dmap,dim=3)
  50. return dmap
  51. def plot_veel_punten(t0, t1, aantal_punten, dmap):
  52. vars = snij_randen_weg2(data.vars, t0, t1)
  53. # copied from 'onderzoek'
  54. for key in vars.keys():
  55. vars[key] = vars[key].ravel()
  56. print("raveled")
  57. np.random.seed(1) # determinism
  58. keuzes = np.random.choice(vars['u'].shape[0], aantal_punten, replace=True)
  59. # calculate the diffusion coordinates # TODO waarom vind Emacs+Python de o-trema niet goed?
  60. var_phi1234 = dmap.transform(np.column_stack((vars['gateui'], vars['gatexs'], vars['gated'], vars['Ca'], vars['gatew'], vars['gateu'], vars['Na'], vars['gateoa'], vars['Caup'], vars['gatef'], vars['gateua'], vars['gateh'], vars['gatexr'], vars['K'], vars['gatefCa'], vars['u'], vars['gatem'], vars['gatev'], vars['gatej'], vars['gateoi'], vars['Carel'])))
  61. print("transformed")
  62. # plot it!
  63. fig = plt.figure(figsize=(6,6))
  64. ax = fig.add_subplot(111,projection='3d')
  65. ax.scatter(var_phi1234[:,0],var_phi1234[:,1],var_phi1234[:,2],var_phi1234[:,3],c=var_phi1234[:,3],cmap='viridis')
  66. ax.set_title("Embedding given by first three DCs, coloured by fourth (Courtemanche model, spiral)") # todo engels
  67. ax.set_xlabel(r'$\psi_1$')
  68. ax.set_ylabel(r'$\psi_2$')
  69. ax.set_zlabel(r'$\psi_3$')
  70. plt.axis('tight') # ? copied from pydiffmap
  71. fig.savefig("Courtemanche2D(spiral) 3+1 eigenvectors, extended embedding.png")
  72. #fig.savefig("BOFC 3+1 eigenvectors, extended embedding (uvw, s).pdf")
  73. plt.show()
  74. plt.close()
  75. # Wacht eerst tot de spiraal gevormd is en de bron niet meer zichtbaar
  76. matplotlib.use("TkAgg")
  77. dmap = onderzoek((201 * 4)//11, 200, 7000, 0.05)
  78. plot_veel_punten(50, 151, 9, dmap) # TODO te traag
  79. #del var1, var2, var3, var4 # geheugengebruik beperken
  80. #dmap = DiffusionMap.from_sklearn(n_evecs = 4)
  81. #map.fit(faseruimte)
  82. # TODO scatterplot voor willekeurige 4 variabelen, dan op de vier (dimensionality curse?, maar één waarde, logisch?)
  83. # Papers tresholdwaarden ...
  84. # 1. State space Courtemanche, random 4 variabelen
  85. # 2. Daarop diffusion maps
  86. # 3. Cut-off waarden dominante eigenvectoren (eerst papers)