不确定导致错误的原因"Tuple index out of range"



我试图回答这个问题:创建一个函数cubefit(xdata, ydata)(按此顺序的参数),返回最佳拟合*参数[a, B, C, D]的numpy数组,该数组适合x值的列表xdata到y值的列表ydata,到形式为y= Ax^3 + B x^2 + C x + D的三次方程

*,其中拟合是使用非线性最小二乘回归检验(scipy的curve_fit()函数的默认拟合方法)确定的

这是我的尝试:

import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize as scpo
def cubefit(xdata,ydata):
x = np.array(xdata)
y = np.array(ydata)

def cubic(x_a,A,B,C,D):
return A*x_a**3+B*x_a**2+C*x_a+D
actual_fit_parameters = scpo.curve_fit(cubic, x , y)

fit_D = actual_fit_parameters[3]
fit_C = actual_fit_parameters[2]
fit_B = actual_fit_parameters[1]
fit_A = actual_fit_parameters[0]

return [fit_A,fit_B,fit_C,fit_D]

我得到这个错误信息:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-40-fafc77be7ebf> in <module>()
3 import numpy as np
4 assert "cubefit" in dir(), "It appears that you may not have defined a function named `cubefit`, or you may not have executed your answer cell."
----> 5 assert type(cubefit([0,1,2,3],[0,1,8,27])) != None, "It appears that your function `cubefit` does not return anything"
6 assert type(cubefit([0,1,2,3],[0,1,8,27])) != list, "It appears that your function `tophat` does not return a list"
7 assert type(cubefit([0,1,2,3],[0,1,8,27])) == np.ndarray, "It appears that your function `tophat` does not return a numpy array"
<ipython-input-39-d4f3443da67b> in cubefit(xdata, ydata)
11     actual_fit_parameters = scpo.curve_fit(cubic, x , y)
12 
---> 13     fit_D = actual_fit_parameters[3]
14     fit_C = actual_fit_parameters[2]
15     fit_B = actual_fit_parameters[1]
IndexError: tuple index out of range

知道为什么吗?

如果您阅读scipy.optimize.curve_fit()文档,您将看到发生了什么:

收益

  • popt: array

    使f(xdata, *popt) - ydata的残差平方和最小的参数的最优值。

  • pcov:二维阵列

    popt的估计协方差。对角线表示参数估计的方差。使用perr = np.sqrt(np.diag(pcov))计算参数的一个标准差误差。[…]

函数返回两个结果,两个数组。再往下看,在示例部分中,您将看到作者认为应该如何使用函数:
popt, pcov = curve_fit(func, xdata, ydata)
# ...

使用元组赋值将两个数组拆分为两个变量。

你的代码没有,它将2值元组视为至少有4个值的数组。我猜测你想要的是第一个数组,所以你可以使用:

actual_fit_parameters, _ = scpo.curve_fit(cubic, x , y)

将第二个数组pcov赋值给_(表示您想在代码中忽略它)。

你没有包括样本输入或预期的输出,所以我不能告诉你我的猜测是否对你有用。

其他注释:

  • type(someobject) != Noneisalways truetype(None)返回NoneType。如果您需要测试返回None以外的内容,请使用someobject is not None
  • 不要使用type(someobject) == SomeTypetype(someobject) != SomeType,应该使用isinstance(someobject, SomeType)进行类型检查。isinstance()对子类也返回true。(在极少数情况下,您必须只测试一种特定类型,而不测试子类,请使用标识测试,type(someobject) is SomeType)。

最新更新