【问题标题】:Index error while fitting polynomial to data将多项式拟合到数据时出现索引错误
【发布时间】:2019-04-28 17:38:48
【问题描述】:

尝试拟合订单时出现索引错误>1 多项式数据:

import numpy as np
from scipy.optimize import curve_fit

x =  b #1D array for X Axis
y =  c #1D array for Y Axis

def func(x, a, b,c):
     return ((a*(x**2)) + b*x + c)  

iniguess = [0,0.038,13.99]
param, pcov = curve_fit(func, x, y, p0=iniguess)

print (param[0],param[1],param[2])
 
import matplotlib.pyplot as plt
plt.plot(x,y,'bo ')
xfit = b
yfit = func(xfit, param[0], param[1], param[3])
plt.plot(xfit,yfit,'r-')
plt.legend(['data','fit'],loc='best')

当我尝试计算预测的 Y 值时,这会给我一个错误代码。错误是“index 3 is out of bounds for axis 0 with size 3

【问题讨论】:

  • 不应该是 param[2] 而不是 param[3] 函数中的最后一个参数 func 在以 yfit = func... 开头的行吗?
  • 是的..排序:阅读错误消息。总之,是x = b还是b的拟合参数。当然,python 可以这样工作,但从代码可读性的角度来看,变量命名也可以改进。
  • 是的。它应该是 Param[2]。错过了。

标签: python-3.x numpy scipy curve-fitting


【解决方案1】:

正如@Ben.T 所指出的,问题在于您的代码中的param[3] 应该是param[2]。当您有一个像param 这样的参数列表并按顺序依次传递给函数时(即func(..., param[0], param[1], param[2], ...)),您可以使用*param 一次性传递它们。领先的asterix *foo is a shortcut in the python syntax 让您一次传递多个参数,而不是一次传递一个。使用这些快捷方式可以使您的代码更易于阅读且不易出错,因为您不再需要为 param 的各个索引而烦恼。

这是您的代码的完整工作版本。请注意在创建yfit 的行中使用了*param

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

def func(x, a, b, c):
     return ((a*(x**2)) + b*x + c)  

iniguess = [2,0.038,13.99]

# make some fake example data
N = 1000
x =  np.linspace(0, 10, N)
y = func(x, *iniguess)

# add some noise to make this a non-trivial curve fitting
y +=  np.random.normal(size=N)

param, pcov = curve_fit(func, x, y, p0=iniguess)
print(param)

plt.plot(x,y,'bo ')

yfit = func(x, *param)
plt.plot(x,yfit,'r-')

plt.legend(['data','fit'],loc='best')

输出:

[ 1.99894963  0.04834206 14.0062958 ]

【讨论】:

  • 感谢您的建议。我从编码开始,这是一个很好的提示。将尝试关注!
猜你喜欢
  • 2010-09-27
  • 2018-02-18
  • 2020-01-24
  • 2021-01-01
  • 2020-03-23
  • 2018-03-16
  • 2018-08-18
  • 2015-09-02
  • 1970-01-01
相关资源
最近更新 更多