Scipy scipy.optimize.curve_fit Método

Suraj Joshi 30 enero 2023
  1. Sintaxis de scipy.optimize.curve_fit():
  2. Códigos de ejemplo: scipy.optimize.curve_fit() Método para ajustar la línea recta a nuestros datos (expresión de modelo lineal)
  3. Código de ejemplo: scipy.optimize.curve_fit() Método para ajustar la curva exponencial a nuestros datos (expresión del modelo exponencial)
Scipy scipy.optimize.curve_fit Método

La función Python Scipy scipy.optimize.curve_fit() se usa para encontrar los parámetros de mejor ajuste usando un ajuste de mínimos cuadrados. El método curve_fit ajusta nuestro modelo a los datos.

El ajuste de la curva es esencial para encontrar el conjunto óptimo de parámetros para la función definida que mejor se ajuste al conjunto de observaciones proporcionado.

Sintaxis de scipy.optimize.curve_fit():

scipy.optimize.curve_fit(f, xdata, ydata, sigma=None, p0=None)

Parámetros

f Es la función del modelo. Toma la variable independiente como primer argumento y los parámetros que se ajustan como argumentos restantes separados.
xdata tipo matriz. Variable independiente o entrada a la función.
ydata tipo matriz. Variable dependiente. La salida de la función..
sigma Valor opcional. Son las incertidumbres estimadas en los datos.
p0 Conjetura inicial para los parámetros. El ajuste de la curva debe saber dónde debe comenzar a buscar, cuáles son los valores razonables para los parámetros.

Regreso

Devuelve dos valores:

  1. popt: tipo matriz. Contiene valores óptimos para la función del modelo. Contiene internamente resultados de ajuste para la pendiente y resultados de ajuste para la intersección.
  2. p-cov : Covarianza, que denota incertidumbres en el resultado del ajuste.

Códigos de ejemplo: scipy.optimize.curve_fit() Método para ajustar la línea recta a nuestros datos (expresión de modelo lineal)

import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy import optimize


def function(x, a, b):
    return a * x + b


x = np.linspace(start=-50, stop=10, num=40)
y = function(x, 6, 2)

np.random.seed(6)
noise = 20 * np.random.normal(size=y.size)
y = y + noise

popt, cov = scipy.optimize.curve_fit(function, x, y)
a, b = popt

x_new_value = np.arange(min(x), 30, 5)
y_new_value = function(x_new_value, a, b)

plt.scatter(x, y, color="green")
plt.plot(x_new_value, y_new_value, color="red")
plt.xlabel("X")
plt.ylabel("Y")
print("Estimated value of a : " + str(a))
print("Estimated value of b : " + str(b))
plt.show()

Ajuste de curva a una línea recta usando el método scipy.optimize.curve_fit

Producción:

Estimated value of a : 5.859050240780936
Estimated value of b : 1.172416121927438

En este ejemplo, primero generamos un conjunto de datos con 40 puntos utilizando la ecuación y = 6*x+2. Luego, agregamos algo de ruido gaussiano a los valores y del conjunto de datos para que se vea más realista. Ahora estimamos los parámetros a y b de la ecuación subyacente y=a*x+b, que genera el conjunto de datos utilizando el método scipy.optimize.curve_fit(). Los puntos “verdes” en el gráfico representan los puntos de datos reales del conjunto de datos, y la línea “roja” representa la curva ajustada al conjunto de datos mediante el método “scipy.optimize.curve_fit()”.

Finalmente, podemos ver que los valores de a y b estimados usando el método scipy.optimize.curve_fit() son 5.859 y 1.172 respectivamente, que están bastante cerca de los valores reales 6 y 2.

Código de ejemplo: scipy.optimize.curve_fit() Método para ajustar la curva exponencial a nuestros datos (expresión del modelo exponencial)

import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy import optimize


def function(x, a, b):
    return a * np.exp(b * x)


x = np.linspace(10, 30, 40)

y = function(x, 0.5, 0.3)
print(y)

noise = 100 * np.random.normal(size=y.size)
y = y + noise
print(y)
popt, cov = scipy.optimize.curve_fit(function, x, y)

a, b = popt

x_new_value = np.arange(min(x), max(x), 1)
y_new_value = function(x_new_value, a, b)

plt.scatter(x, y, color="green")
plt.plot(x_new_value, y_new_value, color="red")
plt.xlabel("X")
plt.ylabel("Y")
print("Estimated value of a : " + str(a))
print("Estimated value of b : " + str(b))
plt.show()

Ajuste de curva a una curva exponencial usando el método scipy.optimize.curve_fit

Producción:

Estimated value of a : 0.5109620054206334
Estimated value of b : 0.2997005016319089

En este ejemplo, primero generamos un conjunto de datos con 40 puntos usando la ecuación y = 0.5*x^0.3. Luego, agregamos algo de ruido gaussiano a los valores y del conjunto de datos para hacerlo más realista. Ahora estimamos los parámetros a y b de la ecuación subyacente y = a*x^b que genera el conjunto de datos utilizando el método scipy.optimize.curve_fit(). Los puntos verdes en el gráfico representan los puntos de datos reales del conjunto de datos, y la línea roja representa la curva ajustada al conjunto de datos mediante el método scipy.optimize.curve_fit().

Finalmente, podemos ver que los valores de a y b estimados usando el método scipy.optimize.curve_fit() son 0.5109 y 0.299 respectivamente, que están bastante cerca de los valores reales 0.5 y 0.3.

De esta forma, podemos determinar la ecuación subyacente de los puntos de datos dados utilizando el método scipy.optimize.curve_fit().

Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn