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