sábado, 30 de julio de 2011

Python y matemáticas: Theano



Theano son unas librerías matemáticas basadas en Python. 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.

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:

#!/usr/bin/python

from matplotlib import rc
from pylab import *
from theano import *
import theano.tensor as T
import numpy

rc(‘text’, usetex=True)
rc(‘font’, family=’serif’)

x = T.fvector(‘x’)
x1 = T.fscalar(‘x1′)
y = 1/(1 + T.exp(-x))
y1 = 1/(1 + T.exp(-x1))
logistic = function([x], y)
logistic1 = function([x1], y1)
grady = T.grad(y1, x1)
derivada = function([x1], grady)

a = float(input(‘Introduce el extremo izqdo. \n’))
b = float(input(‘Introduce el extremo drcho. \n’))
particion = float(input(‘Introduce la longitud de particion del intervalo. \n’))
pderiv = float(input(‘Introduce el punto donde hallar su recta tangente. \n’))

xval = arange(a,b,particion, dtype=’float32′)
z,w,w1=T.fscalars(‘z’, ‘w’, ‘w1′)
rectatg2 = (x-z)*w+w1
rectatg3 = function([x, Param(z, default=pderiv), Param(w, default=derivada(pderiv)), Param(w1, default=logistic1(pderiv))], rectatg2)

figure(1)

plot(xval, logistic(xval), linewidth=1.5, color=’r')
plot(xval, rectatg3(xval), linewidth=1.0, color=’g')
ylim([0,1])

xlabel(r’\textbf{Abcisa}’, fontsize=12)
ylabel(r’\textit{Ordenada}’,fontsize=12)
title(r”Funcion logistica f(x) = $\displaystyle\frac{1}{1+e^{-x}}$”, fontsize=12, color=’r')
legend((‘Funcion Logistica’, ‘Recta Tangente’),’upper left’, shadow=True, fancybox=True)

leg = gca().get_legend()
ltext = leg.get_texts()
llines = leg.get_lines()
frame = leg.get_frame()

frame.set_facecolor(’0.80′)
setp(ltext, fontsize=’small’)
setp(llines, linewidth=1.5)

grid(True)
axhline(linewidth=1.5, color=’b')
axvline(linewidth=1.5, color=’b')

figure(2)

plot(xval, logistic(xval), ‘k.’)
plot(xval, rectatg3(xval), linewidth=1.0, color=’g')
ylim([0,1])
legend((‘Funcion Logistica’, ‘Recta Tangente’),’upper left’, shadow=True, fancybox=True)
leg = gca().get_legend()
ltext = leg.get_texts()
llines = leg.get_lines()
frame = leg.get_frame()

frame.set_facecolor(’0.80′)
setp(ltext, fontsize=’small’)
setp(llines, linewidth=1.5)

xlabel(r’\textbf{Abcisa}’, fontsize=12)
ylabel(r’\textit{Ordenada}’,fontsize=12)
title(r”Funcion logistica f(x) = $\displaystyle\frac{1}{1+e^{-x}}$”, fontsize=12, color=’r')
grid(True)
axhline(linewidth=1.5, color=’r')
axvline(linewidth=1.5, color=’r')

figure(1)
savefig(‘fig1′) &npbs;
figure(2)
savefig(‘fig2′)
show()

El resultado es el siguiente:






Fuente: Linuxmúsica

Sitio oficial de Theano: http://deeplearning.net/software/theano/

No hay comentarios: