我知道这个话题在 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))