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

2024-03-09

我已经进行了搜索,问题似乎类似于Python scipy:** 或 pow() 不支持的操作数类型:“list”和“list” https://stackoverflow.com/questions/9156208/python-scipy-unsupported-operand-types-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)

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

编辑添加: 更令人困惑的是,据我所知,它被 curve_fit 使用,第二个公式有效。

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

Func 1 曲线拟合给出[a,b,c] = [ 1.71890826, -0.0239123, 3.17039851]然而对于 func2 来说一切都出错了[a,b] = [ -2.88694423e-15, 9.99999998e-01]。我不明白这么小的变化怎么会导致如此严重的问题,leastsq 能够用 c=2 来拟合这些数据。


The TypeError发生的原因是x被传递给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'

在这种情况下,func2映射一个数组x形状为 (2,3) 的数组y形状为(2,3)。功能optimize.curve_fit期望返回值来自func2是一个数字序列——而不是一个数组。

对我们来说幸运的是,在这种情况下,func2对每个组件进行逐元素操作x-- 各元素之间不存在相互作用x。所以如果我们传递一个数组确实没有什么区别x形状 (2,3) 或形状 (6,) 的一维数组。

如果我们传递一个形状为 (6,) 的数组,那么func2将返回形状为 (6,) 的数组。完美的。这样就可以了:

x = np.asarray(x).ravel()
y = np.asarray(y).ravel()
popt, pcov = optimize.curve_fit(func2, x, y)
print(popt)
# [ 1.  1.]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐