scipy.optimize.curve_fit - TypeError: only size-1 arrays can be converted to Python scalars

scipy.optimize.curve_fit - TypeError: only size-1 arrays can be converted to Python scalars

我知道这个话题在 6 年前就已经解决了,但要么我不太理解所提出的解决方案,要么它对我不起作用...我正在尝试用 S 形曲线拟合一小部分数据来自 scipy.optimize 的 curve_fit()。我有以下脚本:

CO = [336.6,249.7,154.2,117.7,36.8,53.4]
COp = [434.9,406,290.7,86.2,66.0,83.5]

cycle_lst = [1,2,3,4,5,6]

def fit_func(x,a,b):
    return (a/(1+exp(-b*x)))

popt_res,popc_res = curve_fit(fit_func, xdata = cycle_lst, ydata = CO)


abs_gen = np.linspace(1,6,1000)
sim_fit = []
for i in abs_gen:
    print(fit_func(popt_res[0],popt_res[1],i))
    sim_fit.append(fit_func(popt_res[0],popt_res[1],i))

plt.scatter(cycle_lst,COp, label = "Digestion with polyphosphate")
plt.plot(abs_gen,sim_fit,label = "modeled curve")
plt.xlabel("Number of cycle performed")
plt.ylabel("Remaining mass (g)")
plt.legend()
plt.grid(True, axis = 'both')
plt.show()

引发错误:

  File "<ipython-input-80-6d6b9f70c774>", line 2, in fit_func
    return (a/(1+exp(-b*x)))

TypeError: only size-1 arrays can be converted to Python scalars

我无法真正理解的是,就在之前,我能够在不修改列表或尝试将值一一传递到函数中的情况下拟合我的数据。在 curve_fit() 文档中,没有说明函数无法处理列表或数组这一事实(如果没有,我真的无法理解为什么 sigmoide 的参数应该用一系列的来确定值)。我的错误可能真的很愚蠢,但如果有人能帮助它真的会挽救我的心理健康,我知道 python 一点,但我绝对不是专家。

问题在于您希望scipy优化的函数:

def fit_func(x, a: float, b: float):
    return a / (1 + exp(-x * b))

这会导致问题,因为 math 模块中的 exp() 似乎只支持单个值。一种快速避免这种情况的方法是使用 numpy 模块中的 exp() 函数,它支持对列表的操作。

def fit_func(x, a: float, b: float):
    return a / (1 + np.exp(-x * b))