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.