Usando Theano (Python Con Matemáticas)

por | 27 marzo, 2011

Hola, hace un par de semanas me encontré con unas librerías matemáticas basadas en Python llamadasTheano, en honor a la mujer de Pitágoras. Me parecieron interesantes y las empaqueté para Mandriva; están disponibles en MIB, por si a alguien le interesa. Con ellas podemos definir, evaluar y optimizar expresiones matemáticas que involucren arrays multidimensionales de forma eficiente.

Lo cierto es que viene muy bien para definir funciones matemáticas de cualquier dimensión, pudiendo especificar los parámetros de las funciones. Otra característica que he encontrado muy interesante es que calcula las derivadas de las funciones con un código sencillo y claro.
Destacar que estas librerías son totalmente compatibles con Numpy, Scipy y las he usado sin problemas con Mathplotlib para dibujar las gráficas de funciones.
Tienen una característica, la cual no he utilizado aún, y es que si tienes una tarjeta Nvidia con soporte Cuda puedes obtener una mayor eficiencia en cálculos grandes, pero esto poco a poco
Bien, para que veáis cómo se usan con un ejemplo un poco más elaborado que los que vienen en su documentación he realizado un pequeño programa que dibuja la función logística y su recta tangente en un punto dado, para ello he usado Mathplotlib, de esa forma podéis aprender a dibujar funciones de forma sencilla, con soporte LateX en las figuras, creación de leyendas y guardado de las imágenes en formato .png. El código es el siguiente:

  1. #!/usr/bin/python
  2.  
  3. from matplotlib import rc
  4. from pylab import *
  5. from theano import *
  6. import theano.tensor as T
  7. import numpy
  8.  
  9. rc('text', usetex=True)
  10. rc('font', family='serif')
  11.  
  12. x = T.fvector('x')
  13. x1 = T.fscalar('x1')
  14. y = 1/(1 + T.exp(-x))
  15. y1 = 1/(1 + T.exp(-x1))
  16. logistic = function([x], y)
  17. logistic1 = function([x1], y1)
  18. grady = T.grad(y1, x1)
  19. derivada = function([x1], grady)
  20.  
  21. a = float(input('Introduce el extremo izqdo. \n'))
  22. b = float(input('Introduce el extremo drcho. \n'))
  23. particion = float(input('Introduce la longitud de particion del intervalo. \n'))
  24. pderiv = float(input('Introduce el punto donde hallar su recta tangente. \n'))
  25.  
  26. xval = arange(a,b,particion, dtype='float32')
  27. z,w,w1=T.fscalars('z', 'w', 'w1')
  28. rectatg2 = (x-z)*w+w1
  29. rectatg3 = function([x, Param(z, default=pderiv), Param(w, default=derivada(pderiv)), Param(w1, default=logistic1(pderiv))], rectatg2)
  30.  
  31. figure(1)
  32.  
  33. plot(xval, logistic(xval), linewidth=1.5, color='r')
  34. plot(xval, rectatg3(xval), linewidth=1.0, color='g')
  35. ylim([0,1])
  36.  
  37. xlabel(r'\textbf{Abcisa}', fontsize=12)
  38. ylabel(r'\textit{Ordenada}',fontsize=12)
  39. title(r"Funcion logistica f(x) = $\displaystyle\frac{1}{1+e^{-x}}$", fontsize=12, color='r')
  40. legend(('Funcion Logistica', 'Recta Tangente'),'upper left', shadow=True, fancybox=True)
  41.  
  42. leg = gca().get_legend()
  43. ltext  = leg.get_texts()
  44. llines = leg.get_lines()
  45. frame  = leg.get_frame()
  46.  
  47. frame.set_facecolor('0.80')
  48. setp(ltext, fontsize='small')
  49. setp(llines, linewidth=1.5)
  50.  
  51. grid(True)
  52. axhline(linewidth=1.5, color='b')
  53. axvline(linewidth=1.5, color='b')
  54.  
  55. figure(2)
  56.  
  57. plot(xval, logistic(xval), 'k.')
  58. plot(xval, rectatg3(xval), linewidth=1.0, color='g')
  59. ylim([0,1])
  60. legend(('Funcion Logistica', 'Recta Tangente'),'upper left', shadow=True, fancybox=True)
  61. leg = gca().get_legend()
  62. ltext  = leg.get_texts()
  63. llines = leg.get_lines()
  64. frame  = leg.get_frame()
  65.  
  66. frame.set_facecolor('0.80')
  67. setp(ltext, fontsize='small')
  68. setp(llines, linewidth=1.5)
  69.  
  70. xlabel(r'\textbf{Abcisa}', fontsize=12)
  71. ylabel(r'\textit{Ordenada}',fontsize=12)
  72. title(r"Funcion logistica f(x) = $\displaystyle\frac{1}{1+e^{-x}}$", fontsize=12, color='r')
  73. grid(True)
  74. axhline(linewidth=1.5, color='r')
  75. axvline(linewidth=1.5, color='r')
  76.  
  77. figure(1)
  78. savefig('fig1')
  79. figure(2)
  80. savefig('fig2')
  81.  
  82. show()

Y el resultado del código es éste:


Nota: En esa web encontraréis un enlace de descarga de la documentación en PDF.

Saludos

Un pensamiento en “Usando Theano (Python Con Matemáticas)

  1. Pingback: Bitacoras.com

Los comentarios están cerrados.