Permítanme comenzar diciendo que lo que me pasa no se lo que me espera y tal vez usted me puede ayudar 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 ajuste de estos datos con los de, digamos, un 4 de grado del polinomio. Lo que yo hago:

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

Ahora puedo crear una nueva cuadrícula para valores de x para evaluar el ajuste de la función de ffit:

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

Cuando hago todo el trazado (conjunto de datos y ajuste de la curva) 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()

Me sale lo siguiente:

los datos de adaptación con numpy
fitting_data.png

De lo que yo esperaría es el ajuste de la función para que se ajuste correctamente (al menos cerca del valor máximo de los datos). ¿Qué estoy haciendo mal?

Gracias de antemano.

InformationsquelleAutor ezitoc | 2013-09-12

2 Comentarios

  1. 71

    Por desgracia, np.polynomial.polynomial.polyfit devuelve los coeficientes en el orden opuesto que para np.polyfit y np.polyval (o, como solía 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 los coeficientes de [A, B, C] a A + Bx + Cx^2 + ..., mientras que np.polyfit devuelve: ... + Ax^2 + Bx + C.

    Así que si usted desea utilizar esta combinación de funciones, se debe invertir el orden de los coeficientes, como en:

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

    Sin embargo, la documentación estados claramente para evitar np.polyfit, np.polyval, y np.poly1d, y en lugar de utilizar sólo la nueva(er) de paquete.

    Estás más seguro es utilizar sólo el polinomio paquete:

    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 polinómica:

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

    los datos de adaptación con numpy

    • Gracias. Esta solución es muy clara y pertinente. Me salvó un poco de tiempo importante 🙂
  2. 16

    Tenga en cuenta que puede utilizar el Polinomio de clase directamente para hacer el ajuste y el retorno de un Polinomio ejemplo.

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

    p utiliza cambiar la escala y los valores de x para la estabilidad numérica. Si usted necesita la forma habitual de los coeficientes, usted tendrá que seguir con

    pnormal = p.convert(domain=(-1, 1))
    • +1 para la conversión de los coeficientes, lo cual es útil si usted necesita para hacer algunos cálculos con otros polinomios en el dominio predeterminado. Tenga en cuenta que esto se puede hacer en el fit() método directamente, con el mismo domain argumento.

Dejar respuesta

Please enter your comment!
Please enter your name here