python - scipy.optimize.curve_fit - TypeError:只有大小为 1 的数组可以转换为 Python 标量

我知道这个话题在 6 年前就已经解决了,但要么我不太了解所提出的解决方案,要么它对我不起作用......我正在尝试用 curve_fit() 从scipy.优化。我有以下脚本:

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

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

回答1

问题在于您希望 scipy 优化的功能:

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

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

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

相似文章

最新文章