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

use*_*259 6 python curve-fitting typeerror scipy

我已经完成了搜索,问题似乎与Python scipy类似:**或pow()不支持的操作数类型:'list'和'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)
Run Code Online (Sandbox Code Playgroud)

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

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

popt, pcov = curve_fit(func2,x,y)
Run Code Online (Sandbox Code Playgroud)

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

编辑添加:更令人困惑的是最小的,我知道这是由curve_fit使用,第二个公式有效.

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

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

unu*_*tbu 5

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'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,func2x形状(2,3)的数组映射到形状(2,3)的数组y.该函数optimize.curve_fit期望返回值func2是一系列数字 - 而不是数组.

对我们来说幸运的是,在这种情况下,func2在每个组件上都是元素操作的x- 元素之间没有相互作用x.因此,如果我们传递一个x形状(2,3)或一维形状(6,)数组,那么它确实没有区别.

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

x = np.asarray(x).ravel()
y = np.asarray(y).ravel()
popt, pcov = optimize.curve_fit(func2, x, y)
print(popt)
# [ 1.  1.]
Run Code Online (Sandbox Code Playgroud)