"'numpy.float64' object is not callable" - 在函数中使用具有多个参数的 scipy.optimize curve_fit时出错



我是python和编程的新手。提前道歉如果这个问题以前已经回答过,我已经检查了所有我能找到的,但我无法通过我的方式。

我试图近似一个S形函数(用于创新扩散预测(,准确地说是Bass模型,具有有限的值(历史和未来预测(。

使用的函数在下面的代码中。

变量具有以下含义:y:市场扩散0≤y≤1,t:年

参数的含义如下:m:最大Maket大小,p:早期采用者/创新者,q:混合者

现在,我得到以下错误:'numpy.float64' object is not callable

为了使代码运行良好,我需要对代码进行哪些更改?

import numpy as np
import matplotlib.pyplot as plt
import scipy.optimize
from scipy.optimize import curve_fit
import pylab as p
t_data = np.array([2016, 2017, 2018, 2019, 2020, 2025, 2030, 2035, 2040, 2045])
y_data = np.array([0.0015, 0.0027, 0.0042, 0.0066, 0.0164, 0.1389, 0.3889, 0.6667, 0.8611, 0.99])
def bass(t, *args):
m, p, q = args
t_0 = 2011
return m*(1-np.exp(-(p+q)*(t-t_0)))/(1+(p/q)*np.exp(-(p+q)*(t-t_0)))
popt, pcov = curve_fit(bass, t_data, y_data, p0=[1, 1, 1])
plt.plot(t_data, y_data, 'o')
plt.plot(t_data, func_nl_lsq(t_data, *popt), '-')
plt.show()

这是我收到的错误全文:

<ipython-input-30-3b4f9481e8a6>:6: RuntimeWarning: overflow encountered in exp
return m*(1-np.exp(-(p+q)*(t-t_0)))/(1+(p/q)*np.exp(-(p+q)*(t-t_0)))
<ipython-input-30-3b4f9481e8a6>:6: RuntimeWarning: invalid value encountered in true_divide
return m*(1-np.exp(-(p+q)*(t-t_0)))/(1+(p/q)*np.exp(-(p+q)*(t-t_0)))
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-30-3b4f9481e8a6> in <module>
7 popt, pcov = curve_fit(bass, t_data, y_data, p0=[1, 1, 1])
8 plt.plot(t_data, y_data, 'o')
----> 9 plt.plot(t_data, func_nl_lsq(t_data, *popt), '-')
10 plt.show()
<ipython-input-17-286e00184588> in func_nl_lsq(t, *args)
4     m, p, q = args
5     t_0 = 2011
----> 6     return m*((1-np.exp(-(p+q)(t-t_0)))/(1+(p/q)*np.exp(-(p+q)(t-t_0))))
7 popt, pcov = curve_fit(func_nl_lsq, t_data, y_data, p0=[1, 1, 1])
8 plt.plot(t_data, y_data, 'o')
TypeError: 'numpy.float64' object is not callable

最后一个错误TypeError: 'numpy.int64' object is not callable是由表达式(p+q)(t-t_0)引起的,该表达式被解释为函数调用。你必须明确地记下乘法,即:

def bass(t, *args):
m, p, q = args
t_0 = 2011
return m*(1-np.exp(-(p+q)*(t-t_0)))/(1+(p/q)*np.exp(-(p+q)*(t-t_0)))

在调用bass函数时,似乎还需要包含参数。类似于:curve_fit(bass(t_data, args), rest of curve_fit arguments...)

最新更新