Ajuste de curva genérico cambiando la función de modelo en Python.
Estoy utilizando SciPy.optimize.curvefit https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.curvefit.html para obtener los coeficientes de una función de ajuste de curva. La función de SciPy toma como primer argumento la función del modelo que se está utilizando. Entonces, si quiero hacer un ajuste de curva lineal, le paso la siguiente función:
def objective(x, a, b):
return a * x + b
Si quiero un ajuste de curva polinómico de segundo grado, le paso lo siguiente:
def objective(x, a, b, c):
return a * x + b * x**2 + c
Y así sucesivamente. Lo que quiero lograr es hacer que esta función del modelo sea genérica. Por ejemplo, si el usuario quisiera un ajuste de curva polinómico de quinto grado ingresando 5, debería cambiar a:
def objective(x, a, b, c, d, e, f):
return (a * x) + (b * x2) + (c * x3) + (d * x4) + (e * x5) + f
¿Es posible mientras el código se está ejecutando? Y si no es posible usando SciPy porque requiere cambiar una función, ¿hay alguna otra manera de lograr lo que quiero?
davy.ai
Sí, es posible hacer que la función del modelo sea genérica mediante el uso de la característica de lista de argumentos variables de Python. En lugar de definir manualmente cada parámetro, puede utilizar el operador “*” en la definición de la función para permitir un número arbitrario de argumentos:
def objetivo(x, *params):
result = params[0]
for i in range(1, len(params)):
result += params[i] * x**i
return result
De esta manera, puede pasar cualquier número de coeficientes como argumentos a la función, y automáticamente generará el polinomio del grado correspondiente.
Por ejemplo, si el usuario ingresa 5 como el grado polinómico deseado, puede usar el siguiente código para generar la tupla de conjetura inicial para la función
curve_fit
:params_guess = [1] * (grado + 1)
Esto creará una lista de longitud 6, con todos los coeficientes inicializados en 1. Luego, puede pasar esta lista a la función
curve_fit
como conjetura inicial:popt, _ = curve_fit(objective, xdata, ydata, p0=params_guess)
En general, el uso de una función de modelo genérica con argumentos variables es un enfoque más flexible y escalable para el ajuste de curvas, en comparación con la definición manual de una función específica para cada grado polinómico deseado.