python - scipy.optimize.curve_fit 的错误图表(类似于移动平均线)

标签 python scipy curve-fitting exponential moving-average

我正在尝试将指数定律拟合到我的数据中。我的(x,y)样本解释起来相当复杂,所以为了一般理解和可重复性,我会说:两个变量都是 floatcontinuous , 0<=x<=100 , 和 0<=y<=1 .

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 上一样。 可能是什么问题?如有必要,我会找到一种方法使数据集可用,从而使示例可重现。

这就是我从我的代码中得到的(我什至不知道为什么我在图例中得到了三个元素,而只绘制了两个元素,至少显然是这样): enter image description here

最佳答案

enter image description here很多事情:

  1. 您的绘图描绘了原始数据两次,没有可辨别的拟合数据
  2. 您的数据似乎没有排序,我想这就是为什么您会出现曲折行
  3. 在您的示例中,您的预测图将在 300 到 6000 之间,而您的原始数据为 0<=x<=100

除此之外,您的代码或多或少是正确的并且可以工作。

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

xdata=[100.0, 0.0, 90.0, 20.0, 80.0] #is my list with y values, which contains 0 values - edit, you need some raw data which you fit, I inserted some
ydata=[0.001, 1.0, 0.02, 0.56, 0.03] #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

x1=numpy.array(xdata,dtype=float)
y1=numpy.array(transf_y,dtype=float)

def func(x, a, c, d):
    return a * numpy.exp(-c*x)+d

popt, pcov = curve_fit(func, x1, y1,p0 = (1, 1e-6, 1))

print ("a = %s , c = %s, d = %s" % (popt[0], popt[1], popt[2]))

#ok, sorting your data
pairs = []
for i, j in zip(x1, y1):
    pairs.append([i,j])

sortedList = sorted(pairs, key = lambda x:x[0])
sorted_x = numpy.array(sortedList)[:,0]
sorted_y = numpy.array(sortedList)[:,1]


#adjusting interval to the limits of your raw data
xx = numpy.linspace(0, 100.0, 1000)
yy = func(xx, *popt)


#and  everything looks fine
plt.plot(sorted_x,sorted_y, 'o',label='Original Data')
plt.plot(xx,yy,label='Fitted Data')

plt.legend(loc='upper left')
plt.show()

关于python - scipy.optimize.curve_fit 的错误图表(类似于移动平均线),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37189137/

相关文章:

python - 使用 scipy.integrate.odeint 求解 odes 系统(不断变化!)?

Python - 曲线拟合产生不正确的拟合

python - 具有正弦波纹的 n 阶多项式的曲线拟合

python - 抛物面(3D抛物线)曲面拟合python

python - scipy curve_fit 提高 "OptimizeWarning: Covariance of the parameters could not be estimated"

python - 从 Pandas 列中提取任何格式的日期(日期是较长字符串的一部分)

python - 为什么通过切片分配到列表末尾之后不会引发 IndexError?

python - numpy 将排序的数组合并到一个新数组?

python - 方法重构 : from many kwargs to one arg-object

machine-learning - 如何使用 scipy.minimize 最小化套索损失函数?