python numpy regression curve-fitting data-fitting

python - datos de ajuste con numpy



subplot title python (2)

Desafortunadamente, np.polynomial.polynomial.polyfit devuelve los coeficientes en el orden opuesto al de np.polyfit y np.polyval (o, como np.poly1d ). Para ilustrar:

In [40]: np.polynomial.polynomial.polyfit(x, y, 4) Out[40]: array([ 84.29340848, -100.53595376, 44.83281408, -8.85931101, 0.65459882]) In [41]: np.polyfit(x, y, 4) Out[41]: array([ 0.65459882, -8.859311 , 44.83281407, -100.53595375, 84.29340846])

En general: np.polynomial.polynomial.polyfit devuelve coeficientes [A, B, C] a A + Bx + Cx^2 + ... , mientras que np.polyfit devuelve: ... + Ax^2 + Bx + C

Entonces, si desea usar esta combinación de funciones, debe invertir el orden de los coeficientes, como en:

ffit = np.polyval(coefs[::-1], x_new)

Sin embargo, la documentación establece claramente para evitar np.polyfit , np.polyval y np.poly1d , y en su lugar utilizar únicamente el nuevo paquete (er).

Es más seguro usar solo el paquete de polinomios:

import numpy.polynomial.polynomial as poly coefs = poly.polyfit(x, y, 4) ffit = poly.polyval(x_new, coefs) plt.plot(x_new, ffit)

O bien, para crear la función polinomial:

ffit = poly.Polynomial(coefs) # instead of np.poly1d plt.plot(x_new, ffit(x_new))

Permítanme comenzar diciendo que lo que obtengo puede no ser lo que espero y quizás puedan ayudarme aquí. Tengo los siguientes datos:

>>> x array([ 3.08, 3.1 , 3.12, 3.14, 3.16, 3.18, 3.2 , 3.22, 3.24, 3.26, 3.28, 3.3 , 3.32, 3.34, 3.36, 3.38, 3.4 , 3.42, 3.44, 3.46, 3.48, 3.5 , 3.52, 3.54, 3.56, 3.58, 3.6 , 3.62, 3.64, 3.66, 3.68]) >>> y array([ 0.000857, 0.001182, 0.001619, 0.002113, 0.002702, 0.003351, 0.004062, 0.004754, 0.00546 , 0.006183, 0.006816, 0.007362, 0.007844, 0.008207, 0.008474, 0.008541, 0.008539, 0.008445, 0.008251, 0.007974, 0.007608, 0.007193, 0.006752, 0.006269, 0.005799, 0.005302, 0.004822, 0.004339, 0.00391 , 0.003481, 0.003095])

Ahora, quiero ajustar estos datos con, digamos, un polinomio de 4 grados. Así que hago:

>>> coefs = np.polynomial.polynomial.polyfit(x, y, 4) >>> ffit = np.poly1d(coefs)

Ahora creo una nueva grilla para valores x para evaluar la función de ajuste ffit :

>>> x_new = np.linspace(x[0], x[-1], num=len(x)*10)

Cuando hago todo el trazado (conjunto de datos y curva de ajuste) con el comando:

>>> fig1 = plt.figure() >>> ax1 = fig1.add_subplot(111) >>> ax1.scatter(x, y, facecolors=''None'') >>> ax1.plot(x_new, ffit(x_new)) >>> plt.show()

Obtengo lo siguiente:

fitting_data.png

Lo que espero es que la función de ajuste se ajuste correctamente (al menos cerca del valor máximo de los datos). ¿Qué estoy haciendo mal?

Gracias por adelantado.


Tenga en cuenta que puede usar la clase polinomial directamente para hacer el ajuste y devolver una instancia polinomial.

from numpy.polynomial import Polynomial p = Polynomial.fit(x, y, 4) plt.plot(*p.linspace())

p usa valores x escalados y desplazados para la estabilidad numérica. Si necesita la forma habitual de los coeficientes, deberá seguir con

pnormal = p.convert(domain=(-1, 1))