datos de ajuste con numpy
Permítanme comenzar diciendo que lo que obtengo puede no ser lo que espero y tal vez usted pueda 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 lo hago:
>>> coefs = np.polynomial.polynomial.polyfit(x, y, 4)
>>> ffit = np.poly1d(coefs)
Ahora creo una nueva cuadrícula para los 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()
Consigo el 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 de antemano.
2 answers
Desafortunadamente, np.polynomial.polynomial.polyfit
devuelve los coeficientes en el orden opuesto al de np.polyfit
y np.polyval
(o, como usaste 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
.
Así que si desea utilizar 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 lugar de usar solo el nuevo paquete (er).
Es más seguro usar solo el paquete polinómico:
import numpy.polynomial.polynomial as poly
coefs = poly.polyfit(x, y, 4)
ffit = poly.polyval(x_new, coefs)
plt.plot(x_new, ffit)
O, para crear la función polinómica:
ffit = poly.Polynomial(coefs) # instead of np.poly1d
plt.plot(x_new, ffit(x_new))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-07 14:38:40
Tenga en cuenta que puede usar la clase Polinomial directamente para hacer el ajuste y devolver una instancia polinómica.
from numpy.polynomial import Polynomial
p = Polynomial.fit(x, y, 4)
plt.plot(*p.linspace())
p
utiliza valores x escalados y desplazados para la estabilidad numérica. Si necesita la forma habitual de los coeficientes, tendrá que seguir con
pnormal = p.convert(domain=(-1, 1))
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-22 04:19:09