J'ai quelques points et j'essaie d'ajuster la courbe pour ces points. Je sais qu’il existe une fonction scipy.optimize.curve_fit
, Mais je ne comprends pas la documentation, c’est-à-dire comment utiliser cette fonction.
Mes points: np.array([(1, 1), (2, 4), (3, 1), (9, 3)])
Quelqu'un peut-il expliquer comment faire cela?
Je vous suggère de commencer par un ajustement polynomial simple, scipy.optimize.curve_fit
essaie d’adapter une fonction f
que vous devez connaître pour un ensemble de points.
Ceci est un ajustement polynomial simple de 3 degrés utilisant numpy.polyfit
et poly1d
, le premier effectue un ajustement polynomial aux moindres carrés et le second calcule les nouveaux points:
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()
Vous devez d’abord séparer votre tableau numpy en deux tableaux distincts contenant les valeurs x et y.
x = [1, 2, 3, 9]
y = [1, 4, 1, 3]
curve_fit nécessite également une fonction fournissant le type d'ajustement souhaité. Par exemple, un ajustement linéaire utiliserait une fonction comme
def func(x, a, b):
return a*x + b
scipy.optimize.curve_fit(func, x, y)
retournera un tableau numpy contenant deux tableaux: le premier contiendra les valeurs pour a
et b
qui correspondent le mieux à vos données, et le second sera la covariance du paramètres d'ajustement optimal.
Voici un exemple d’ajustement linéaire avec les données que vous avez fournies.
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]
Ce code renverra a = 0.135483870968
Et b = 1.74193548387
Voici un graphique avec vos points et votre ajustement linéaire ... qui est clairement mauvais, mais vous pouvez modifier la fonction d’ajustement pour obtenir le type d’ajustement souhaité.