web-dev-qa-db-fra.com

python ajustement de courbe numpy / scipy

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?

49
Bob

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()

enter image description here

85
jabaldonedo

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é.

enter image description here

46
Greg