ajustement de la courbe python numpy/scipy

j'ai quelques points et j'essaie d'ajuster la courbe pour ces points. Je sais qu'il existe scipy.optimize.curve_fit fonction, mais je ne comprends pas la documentation, je.e comment utiliser cette fonction.

Mes points: np.array([(1, 1), (2, 4), (3, 1), (9, 3)])

quelqu'un Peut-il expliquer comment le faire?

34
demandé sur CIsForCookies 2013-10-03 21:16:51

2 réponses

je vous suggère de commencer avec de simples approximation polynomiale, scipy.optimize.curve_fit essaie d'adapter une fonction f que vous devez savoir pour un ensemble de points.

ceci est un simple ajustement polynomial de 3 degrés en utilisant numpy.polyfit et poly1d, le premier effectue un ajustement polynomial des 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

67
répondu jabaldonedo 2013-10-03 17:27:30

vous devez d'abord séparer votre tableau nummpy en deux tableaux séparés contenant les valeurs x et Y.

x = [1, 2, 3, 9]
y = [1, 4, 1, 3]

curve_fit nécessite également une fonction qui fournit le type d'ajustement que vous souhaitez. 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 de a et b qui correspondent le mieux à vos données, et le second sera la covariance de l'ajustement optimal paramètre.

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 retournera a = 0.135483870968 et b = 1.74193548387

voici un tracé avec vos points et l'ajustement linéaire... ce qui est clairement un mauvais, mais vous pouvez changer la fonction d'Ajustement pour obtenir n'importe quel type d'ajustement que vous voudriez.

enter image description here

41
répondu Greg 2013-10-03 18:18:00