Saltar al contenido

extrapolando datos con numpy/python

Presta atención porque en esta noticia hallarás el resultado que buscas.Esta sección ha sido probado por nuestros expertos para garantizar la calidad y exactitud de nuestro post.

Solución:

También puedes usar el polyfit de numpy:

data = np.array([[1,5], [2,10], [3,15], [4,20], [5,25]])
fit = np.polyfit(data[:,0], data[:,1] ,1) #The use of 1 signifies a linear fit.

fit
[  5.00000000e+00   1.58882186e-15]  #y = 5x + 0

line = np.poly1d(fit)
new_points = np.arange(5)+6

new_points
[ 6, 7, 8, 9, 10]

line(new_points)
[ 30.  35.  40.  45.  50.]

Esto le permite alterar el grado de ajuste del polinomio con bastante facilidad como la función polyfit tomar los siguientes argumentos np.polyfit(x data, y data, degree). Se muestra un ajuste lineal donde el valor devuelto array parece fit[0]*x^n + fit[1]*x^(n-1) + ... + fit[n-1]*x^0 para cualquier grado n. los poly1d función le permite convertir este array en una función que devuelve el valor del polinomio en cualquier valor dado x.

En general, la extrapolación sin un modelo bien entendido tendrá, en el mejor de los casos, resultados esporádicos.


Ajuste de curvas exponenciales.

from scipy.optimize import curve_fit

def func(x, a, b, c):
    return a * np.exp(-b * x) + c

x = np.linspace(0,4,5)
y = func(x, 2.5, 1.3, 0.5)
yn = y + 0.2*np.random.normal(size=len(x))

fit ,cov = curve_fit(func, x, yn)
fit
[ 2.67217435  1.21470107  0.52942728]         #Variables

y
[ 3.          1.18132948  0.68568395  0.55060478  0.51379141]  #Original data

func(x,*fit)
[ 3.20160163  1.32252521  0.76481773  0.59929086  0.5501627 ]  #Fit to original + noise

Después de discutir con usted en el chat de Python, está ajustando sus datos a un exponencial. Esto debería dar un indicador relativamente bueno ya que no está buscando una extrapolación a largo plazo.

import numpy as np
from scipy.optimize import curve_fit
import matplotlib.pyplot as plt

def exponential_fit(x, a, b, c):
    return a*np.exp(-b*x) + c

if __name__ == "__main__":
    x = np.array([0, 1, 2, 3, 4, 5])
    y = np.array([30, 50, 80, 160, 300, 580])
    fitting_parameters, covariance = curve_fit(exponential_fit, x, y)
    a, b, c = fitting_parameters
    
    next_x = 6
    next_y = exponential_fit(next_x, a, b, c)
    
    plt.plot(y)
    plt.plot(np.append(y, next_y), 'ro')
    plt.show()

El punto rojo en el eje del extremo derecho muestra el siguiente punto “previsto”.

Como se señala en esta respuesta a una pregunta relacionada, a partir de la versión 0.17.0 de scipy, hay una opción en scipy.interpolate.interp1d que permite la extrapolación lineal. En tu caso, podrías hacer:

>>> import numpy as np
>>> from scipy import interpolate

>>> x = [1, 2, 3, 4, 5]
>>> y = [5, 10, 15, 20, 25]
>>> f = interpolate.interp1d(x, y, fill_value = "extrapolate")
>>> print(f(6))
30.0

Tienes la opción de asentar nuestra publicación dejando un comentario o puntuándolo te estamos agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *