Está en la página 1de 6

EL PODER DE SYMPY

SymPy es un poderoso y fantástico sistema de álgebra computarizada (CAS) para Python


que usa el cálculo simbólico exacto en lugar del cálculo aproximado usando decimales. Es
útil para aquellas situaciones en las que usaría "lápiz y papel" para resolver problemas de
matemáticas y cálculo, con el beneficio de usar la sintaxis familiar de Python. En lugar de
representar la raíz cuadrada de 2 aproximando 1,4142135623730951, la conservará
exactamente como s qrt (2).
Entonces, ¿por qué no usar SymPy para todo lo relacionado con las matemáticas? Si bien
lo usaremos a lo largo de este libro, es importante seguir sintiéndose cómodo haciendo
matemáticas de Python con decimales simples, ya que scikit-learn y otras bibliotecas de
ciencia de datos adoptan este enfoque. Es mucho más rápido para las computadoras usar
decimales en lugar de símbolos. SymPy también tiene problemas cuando las expresiones
matemáticas comienzan a hacerse demasiado grandes. Pero mantenga SymPy en su
bolsillo trasero como su ventaja, y no se lo cuente a sus hijos de secundaria y
universitarios. Literalmente pueden usarlo para hacer su tarea de matemáticas.

Derivados
Volvamos a hablar de funciones y mirémoslas desde una perspectiva de cálculo,
comenzando con las derivadas. Una derivada indica la pendiente de una función y es útil
para medir la tasa de cambio en cualquier punto de una función.
¿Por qué nos preocupamos por los derivados? A menudo se utilizan en el aprendizaje
automático y otros algoritmos matemáticos, especialmente con descenso de gradiente.
Cuando la pendiente es 0, eso significa que estamos en el mínimo o máximo de una
variable de salida. Este concepto será útil más adelante cuando hagamos regresión lineal
( Capítulo 5 ), regresión logística ( Capítulo 6 ) y redes neuronales ( Capítulo 7 ).
Comencemos con un ejemplo simple. Echemos un vistazo a la función en
la Figura 1-6. ¿Qué tan “empinada” es la curva en x = 2 ?
Observe que podemos medir la "inclinación" en cualquier punto de la curva, y podemos
visualizar esto con una línea tangente. Piense en una línea tangente como una línea recta
que "apenas toca" la curva en un punto dado. También proporciona la pendiente en un
punto dado. Puede estimar crudamente una línea tangente en un valor x dado al crear
una línea que interseque ese valor x y un valor x vecino muy cercano en la función.
Tome x = 2 y un valor cercano x = 2.1, que cuando se pasa a la función f(x) = x2 producirá
f (2) = 4 y f (2.1) = 4.41 como se muestra en la Figura 1-7. La recta resultante que pasa
por estos dos puntos tiene una pendiente de 4,1.
Figura 1-6. Observando la pendiente en una parte dada de la función

Figura 1-7. Una forma tosca de calcular la pendiente.

Puede calcular rápidamente la pendiente m entre dos puntos usando la fórmula simple
de elevación sobre carrera:

m = 41

Si hiciera el paso x entre los dos puntos aún más pequeño, como x = 2 y x = 2,00001, lo
que daría como resultado f (2) = 4 y f (2,00001) = 4,00004, eso se acercaría mucho a la
pendiente real de 4. Entonces, cuanto menor sea el paso al valor vecino, más nos
acercaremos al valor de la pendiente en un punto dado de la curva. Como tantos
conceptos importantes en matemáticas, encontramos algo significativo cuando nos
acercamos a valores infinitamente grandes o infinitamente pequeños.
El ejemplo 1-17 muestra una calculadora derivada implementada en Python.
Ejemplo 1-17. Una calculadora de derivadas en Python
def derivative_x(f, x, step_size):
m = (f(x + step_size) - f(x)) / ((x + step_size) - x)
return m
def my_function(x):
return x**2
slope_at_2 = derivative_x(my_function, 2, .00001)
print(slope_at_2) # prints 4.000010000000827

Ahora, la buena noticia es que hay una forma más limpia de calcular la pendiente en
cualquier parte de una función. Ya hemos estado usando SymPy para trazar gráficos,
pero le mostraré cómo también puede realizar tareas como derivadas utilizando la magia
de la computación simbólica.
Cuando encuentre una función exponencial como f(x)= x2, la función derivada hará que el
exponente sea un multiplicador y luego lo reducirá en 1, dejándonos con la derivada
. El indica una derivada con respecto a x, lo que dice que estamos
construyendo una derivada apuntando al valor de x para obtener su pendiente. Entonces,
si queremos encontrar la pendiente en x = 2, y tenemos la función derivada, simplemente
reemplazamos ese valor de x para obtener la pendiente:
f(x) = x2

Si tiene la intención de aprender estas reglas para calcular derivadas a mano, hay
muchos libros de cálculo para eso. Pero hay algunas buenas herramientas para calcular
derivadas simbólicamente para ti. La biblioteca de Python SymPy es gratuita y de código
abierto, y se adapta muy bien al uso de la sintaxis de Python. El ejemplo 1-18 muestra
cómo calcular la derivada de f(x) = x2 en SymPy.
Ejemplo 1-18. Cálculo de una derivada en SymPy
from sympy import *
# Declare 'x' to SymPy
x = symbols('x')
# Now just use Python syntax to declare function
f = x**2
# Calculate the derivative of the function
dx_f = diff(f)
print(dx_f) # prints 2*x¡
Guau! Entonces, al declarar variables usando la función de símbolos () en SymPy, puedo
proceder a usar la sintaxis normal de Python para declarar mi función. Después de eso,
puedo usar diff() para calcular la función derivada. En el ejemplo 1-19, podemos llevar
nuestra función derivada de vuelta a Python simple y simplemente declararla como otra
función.
Ejemplo 1-19. Una calculadora de derivadas en Python
def f(x):
return x**2
def dx_f(x):
return 2*x
slope_at_2 = dx_f(2.0)
print(slope_at_2) # prints 4.0
Si quieres seguir usando SymPy, puede llamar a la función subs() para intercambiar la
variable x con el valor 2 como se muestra en el ejemplo 1-20.
Ejemplo 1-20. Uso de la función de sustitución en SymPy
# Calculate the slope at x = 2
print(dx_f.subs(x,2)) # prints 4

Derivadas parciales
Otro concepto que encontraremos en este libro es el de derivadas parciales, que
usaremos en los capítulos 5, 6 y 7. Estas son derivadas de funciones que tienen múltiples
variables de entrada.
Piénsalo de esta manera. En lugar de encontrar la pendiente en una función
unidimensional, tenemos pendientes con respecto a múltiples variables en varias
direcciones. Para cada derivada variable dada, asumimos que las otras variables se
mantienen constantes. Mire el gráfico 3D de f( x, y) = 2x 3 + 3y3 en la figura 1-8 y verá que
tenemos pendientes en dos direcciones para dos variables.
Tomemos la función f(x, y)= 2x3 + 3y3 . Las variables x e y obtienen cada una sus propias
derivadas . Estos representan los valores de pendiente con respecto a cada
variable en una superficie multidimensional. Técnicamente llamamos a estos gradientes
de "pendientes" cuando se trata de múltiples dimensiones. Estas son las derivadas de x e
y, seguidas del código SymPy para calcular esas derivadas.:

El ejemplo 1-21 y la figura 1-8 muestran cómo calculamos las derivadas parciales para x e
y, respectivamente, con SymPy.
Ejemplo 1-21. Cálculo de derivadas parciales con SymPy
from sympy import *
from sympy.plotting import plot3d
# Declare x and y to SymPy
x,y = symbols('x y')
# Now just use Python syntax to declare function
f = 2*x**3 + 3*y**3
# Calculate the partial derivatives for x and y
dx_f = diff(f, x)
dy_f = diff(f, y)
print(dx_f) # prints 6*x**2
print(dy_f) # prints 9*y**2
# plot the function
plot3d(f)
Figura 1-8. Trazar una función exponencial tridimensional

Así que para ( x, y ) valores (1,2), la pendiente con respecto a x es 6(1)=6 y la


pendiente con respecto a y es 9 (2) 2= 36 .

USO DE LÍMITES PARA CALCULAR DERIVADAS


¿Quiere ver dónde entran en juego los límites al calcular derivadas? Si te sientes bien con
lo que hemos aprendido hasta ahora, ¡continúa! Si todavía está digiriendo, tal vez
considere volver a esta barra lateral más tarde.
SymPy nos permite hacer algunas exploraciones interesantes sobre matemáticas. Tome
nuestra función f (x ) = x2; aproximamos una pendiente para x = 2 dibujando una línea a
través de un punto vecino cercano x = 2.0001 agregando un paso 0.0001. ¿Por qué no
usar un límite para disminuir para siempre ese paso s y ver a qué pendiente se acerca?

En nuestro ejemplo, estamos interesados en la pendiente donde x = 2 , así que


sustituyamos eso:

Al acercarnos siempre a un tamaño de paso s a 0 pero nunca alcanzarlo (recuerde que el


punto vecino no puede tocar el punto en x = 2 , de lo contrario no tenemos línea),
podemos usar un límite para ver que convergemos en una pendiente de 4 como se
muestra en el ejemplo 1-22.
Ejemplo 1-22. Uso de límites para calcular una pendiente
from sympy import *
# "x" and step size "s"
x, s = symbols('x s')
# declare function
f = x**2
# slope between two points with gap "s"
# substitute into rise-over-run formula
slope_f = (f.subs(x, x + s) - f) / ((x+s) - x)
# substitute 2 for x
slope_2 = slope_f.subs(x, 2)
# calculate slope at x = 2
# infinitely approach step size _s_ to 0
result = limit(slope_2, s, 0)
print(result) # 4

Ahora, ¿qué pasa si no asignamos un valor específico a x y lo dejamos en paz? ¿Qué


sucede si disminuimos nuestro tamaño de paso s infinitamente hacia 0? Veamos el
ejemplo 1-23.
Ejemplo 1-23. Uso de límites para calcular una derivada
from sympy import *
# "x" and step size "s"
x, s = symbols('x s')
# declare function
f = x**2
# slope between two points with gap "s"
# substitute into rise-over-run formula
slope_f = (f.subs(x, x + s) - f) / ((x+s) - x)
# calculate derivative function
# infinitely approach step size +s+ to 0
result = limit(slope_f, s, 0)
print(result) # 2x
Eso nos dio nuestra función derivada 2x. SymPy fue lo suficientemente inteligente como
para darse cuenta de que nunca dejaría que nuestro tamaño de paso llegara a 0 sino que
siempre se acercara a 0. Esto converge f( x ) = x 2 para llegar a su contraparte derivada
2x.

También podría gustarte