scipy.optimize.curve_fit,TypeError:不支持的操作数类型

时间:2013-01-11 19:01:07

标签: python scipy typeerror curve-fitting

我已完成搜索,问题与Python scipy: unsupported operand type(s) for ** or pow(): 'list' and 'list'类似 然而,那里发布的解决方案没有用,我认为它可能实际上是不同的。

我正在尝试使用scipy.curve_fit为数据拟合曲线,当我保留所有3个参数时,一切正常,我得到了预期的结果。

def func(x,a,b,c):
  return a*np.exp(b*(x**c)) 

popt, pcov = curve_fit(func,x,y)

但是,当我尝试修复其中一个值(c = 2)时,

def func2(x,a,b):
  return a*np.exp(b*(x**2))

popt, pcov = curve_fit(func2,x,y)

我使用TypeError: unsupported operand type(s) for ** or pow(): 'int' and 'list'使用numpy.power(x,2)按照链接问题中的建议允许代码运行但产生错误的结果。有人看到我做错了吗?

编辑添加: 甚至更令人困惑的是,我知道这个问题是由curve_fit使用的,而第二个公式也是如此。

第二编辑: 对于那些提到的列表问题X和Y现在都是数组,代码运行没有错误。然而,func2仍然产生了错误的结果。 (我会在这里发布图表,但显然我需要更多代表。)

Func 1 curvefit给出了[a,b,c] = [ 1.71890826, -0.0239123, 3.17039851]但是对于func2,它都会出错[a,b] = [ -2.88694423e-15, 9.99999998e-01]。我不明白这么小的变化是如何造成如此严重的问题的,最小的能够用c = 2来拟合这些数据。

2 个答案:

答案 0 :(得分:5)

发生TypeError是因为传递给x的{​​{1}}是一个列表。

以下是一个例子:

func2

在这种情况下,import numpy as np import scipy.optimize as optimize def func2(x,a,b): return a*np.exp(b*(x**2)) x = np.linspace(0,1,6).reshape(2,-1) y = func2(x,1,1) x = x.tolist() y = y.tolist() print(x) # [[0.0, 0.2, 0.4], [0.6000000000000001, 0.8, 1.0]] print(y) # [[1.0, 1.0408107741923882, 1.1735108709918103], [1.4333294145603404, 1.8964808793049517, 2.718281828459045]] popt, pcov = optimize.curve_fit(func2, x, y) # TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int' 将形状(2,3)的数组func2映射到形状(2,3)的数组x。函数y期望optimize.curve_fit的返回值是一个数字序列 - 而不是数组。

幸运的是,在这种情况下,func2func2的每个组件上按元素运行 - x的元素之间没有互动。因此,如果我们传递形状(2,3)的数组x或形状的1D数组(6,),它确实没有区别。

如果我们传递一个形状数组(6,),那么x将返回一个形状数组(6,)。完善。这样做会很好:

func2

答案 1 :(得分:1)

您使用了哪些x值?以下示例适用于我。

from scipy.optimize import curve_fit
import numpy as np

def func2(x,a,b):
  return a*np.exp(b*(x**2))

x = np.linspace(0,4,50)
y = func2(x, 2.5, 2.3)
yn = y + 6.*np.random.normal(size=len(x))
popt, pcov = curve_fit(func2,x,yn)
print popt, pcov

它根据random函数给出结果:

[ 1.64182333  2.00134505] [[  1.77331612e+11  -6.77171181e+09]
 [ -6.77171181e+09   2.58627411e+08]]

您的xyn类型列表值是?以下示例给出了错误消息:

print range(10)**2

TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'