Basta ya de indagar por todo internet porque llegaste al lugar justo, tenemos la respuesta que buscas sin problema.
Solución:
Le sugiero que comience con un ajuste polinomial simple, scipy.optimize.curve_fit
trata de ajustar una función f
que debes conocer a un conjunto de puntos.
Este es un ajuste polinomial simple de 3 grados usando numpy.polyfit
y poly1d
el primero realiza un ajuste polinomial de mínimos cuadrados y el segundo calcula los nuevos puntos:
import numpy as np
import matplotlib.pyplot as plt
points = np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
# get x and y vectors
x = points[:,0]
y = points[:,1]
# calculate polynomial
z = np.polyfit(x, y, 3)
f = np.poly1d(z)
# calculate new x's and y's
x_new = np.linspace(x[0], x[-1], 50)
y_new = f(x_new)
plt.plot(x,y,'o', x_new, y_new)
plt.xlim([x[0]-1, x[-1] + 1 ])
plt.show()
Primero deberá separar su numpy array en dos matrices separadas que contienen valores x e y.
x = [1, 2, 3, 9]
y = [1, 4, 1, 3]
curve_fit también requiere una función que proporcione el tipo de ajuste que le gustaría. Por ejemplo, un ajuste lineal usaría una función como
def func(x, a, b):
return a*x + b
scipy.optimize.curve_fit(func, x, y)
devolverá un numpy array que contiene dos matrices: la primera contendrá valores para a
y b
que mejor se ajuste a sus datos, y el segundo será la covarianza de los parámetros de ajuste óptimo.
Aquí hay un ejemplo de un ajuste lineal con los datos que proporcionó.
import numpy as np
from scipy.optimize import curve_fit
x = np.array([1, 2, 3, 9])
y = np.array([1, 4, 1, 3])
def fit_func(x, a, b):
return a*x + b
params = curve_fit(fit_func, x, y)
[a, b] = params[0]
Este código regresará a = 0.135483870968
y b = 1.74193548387
Aquí hay un gráfico con sus puntos y el ajuste lineal… que claramente es malo, pero puede cambiar la función de ajuste para obtener cualquier tipo de ajuste que desee.
Calificaciones y comentarios
Tienes la opción de añadir valor a nuestro contenido asistiendo con tu experiencia en las ilustraciones.