Solución:
Te sugiero que comiences con un ajuste polinomial simple, scipy.optimize.curve_fit
intenta adaptarse a 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 matriz numpy en dos matrices separadas que contengan valores xey.
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á una matriz numpy que contiene dos matrices: la primera contendrá valores para a
y b
que mejor se adapte a sus datos, y el segundo será la covarianza de los parámetros de ajuste óptimos.
A continuación, se muestra 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 volverá 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 el tipo de ajuste que desee.