Я пытаюсь установить экспоненциальный закон в свои данные. Мой пример (x,y)
довольно сложный для объяснения, поэтому для общего понимания и воспроизводимости я скажу, что: обе переменные: float
и continuous
, 0<=x<=100
и 0<=y<=1
.Неверный график с scipy.optimize.curve_fit (аналогично скользящей средней)
from scipy.optimize import curve_fit
import numpy
import matplotlib.pyplot as plt
#ydata=[...] is my list with y values, which contains 0 values
#xdata=[...] is my list with x values
transf_y=[]
for i in range(len(ydata)):
transf_y.append(ydata[i]+0.00001) #Adding something to avoid zero values
x=numpy.array(xdata,dtype=float)
y=numpy.array(transf_y,dtype=float)
def func(x, a, c, d):
return a * numpy.exp(-c*x)+d
popt, pcov = curve_fit(func, x, y,p0 = (1, 1e-6, 1))
print ("a = %s , c = %s, d = %s" % (popt[0], popt[1], popt[2]))
xx = numpy.linspace(300, 6000, 1000)
yy = func(xx, *popt)
plt.plot(x,y,label='Original Data')
plt.plot(xx, yy, label="Fitted Curve")
plt.legend(loc='upper left')
plt.show()
Теперь моя встроенная кривая не выглядит похожей на экспоненциальную кривую. Скорее, это выглядит как скользящая средняя кривая, как если бы такая кривая была добавлена как линия тренда в Excel. В чем может быть проблема? При необходимости я найду способ сделать доступные наборы данных, чтобы сделать пример воспроизводимым.
Это то, что я получаю из моего кода (я даже не знаю, почему я получаю три элемента в легенде пока только две построены, по крайней мере, по-видимому):
Таким образом, единственная большая проблема заключалась в том, что мои данные не были отсортированы. Я искренне думал, что это было сделано автоматически. Я был правдиво ошибался. – FaCoffee
Да. И это только беспорядок на участках, фитинг в порядке. –