Este documento describe el poder del sistema de álgebra computarizada SymPy para Python. SymPy usa cálculo simbólico exacto en lugar de aproximaciones decimales, lo que lo hace útil para resolver problemas matemáticos. Aunque es más lento que usar decimales, SymPy puede calcular derivadas y derivadas parciales de forma exacta. El documento proporciona ejemplos de cómo usar SymPy para calcular derivadas de funciones simples de una y múltiples variables.
1. 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 relacionadocon 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. Literalmentepueden 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áximode 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
2. 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)
returnm
def my_function(x):
returnx**2
slope_at_2 = derivative_x(my_function, 2, .00001)
print(slope_at_2) #prints4.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
3. 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
4. derivada variable dada, asumimos que las otras variables se mantienen constantes. Mire el
gráfico 3D de f( x, y) = 2x3
+ 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)
5. 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
fromsympy import*
# "x"and stepsize "s"
x, s = symbols('x s')
# declare function
f = x**2
6. # slope betweentwopointswithgap"s"
# substitute intorise-over-runformula
slope_f = (f.subs(x, x + s) - f) / ((x+s) - x)
# substitute 2forx
slope_2 = slope_f.subs(x, 2)
# calculate slope atx = 2
# infinitelyapproachstepsize _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
fromsympy import*
# "x"and stepsize "s"
x, s = symbols('x s')
# declare function
f = x**2
# slope betweentwopointswithgap"s"
# substitute intorise-over-runformula
slope_f = (f.subs(x, x + s) - f) / ((x+s) - x)
# calculate derivative function
# infinitelyapproachstepsize +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 ) = x2
para llegar a su contraparte derivada
2x.