微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

“'numpy.float64' 对象不可调用”-在函数中使用具有多个参数的 scipy.optimize curve_fit 时出错

如何解决“'numpy.float64' 对象不可调用”-在函数中使用具有多个参数的 scipy.optimize curve_fit 时出错

我是 Python 和编程的新手。如果之前已经回答过这个问题,请提前道歉,我已经检查了我能找到的所有内容,但我无法解决它。

我正在尝试使用有限数量的值(历史和未来预测)来近似一个 sigmoid 函数(用于创新扩散预测),准确地说是 Bass 模型。

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

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

参数含义如下:m:Maximum Maket Size,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,'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,1])
      8 plt.plot(t_data,'o')
----> 9 plt.plot(t_data,'-')
     10 plt.show()

<ipython-input-17-286e00184588> in func_nl_lsq(t,*args)
      4     m,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,'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...)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。