【问题标题】:'numpy.ndarray' object is not callable error with optimize.minimize'numpy.ndarray' 对象是不可调用的错误优化.minimize
【发布时间】:2019-04-25 22:38:18
【问题描述】:

我想用一个简单的 sin^2 函数拟合一组数据,并想根据拟合的参数确定其最小值。

这是我的代码:

import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize

data = np.loadtxt('data.txt', usecols=(0,1))
x = data[:,0]*np.pi/180
y = data[:,1]

plt.scatter(x, y, c='red')

def sine(t,a,b,c):
    return a*(np.sin(b*(t-c)))**2

params, cov = optimize.curve_fit(sine, x, y, p0=[9500, 0.5, 0])
print(params)

t = np.linspace(0, 2*np.pi/3, 120) 
plt.plot(t, sine(t, *params), 'black')

plt.show()

optimize.minimize(sine(t, *params), x0=0)

除了minimize 调用之外,一切都很好,因为我收到以下错误(带有完整的回溯):

TypeError                                 Traceback (most recent call last)
~\Documents\CNR\Calibrazione_lamine_20181112\Fit.py in <module>()
     23 plt.show()
     24 
---> 25 optimize.minimize(sine(t, *params), x0=0)

~\Anaconda3\lib\site-packages\scipy\optimize\_minimize.py in minimize(fun, x0, args, method, jac, hess, hessp, bounds, constraints, tol, callback, options)
    442         return _minimize_cg(fun, x0, args, jac, callback, **options)
    443     elif meth == 'bfgs':
--> 444         return _minimize_bfgs(fun, x0, args, jac, callback, **options)
    445     elif meth == 'newton-cg':
    446         return _minimize_newtoncg(fun, x0, args, jac, hess, hessp, callback,

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in _minimize_bfgs(fun, x0, args, jac, callback, gtol, norm, eps, maxiter, disp, return_all, **unknown_options)
    911     else:
    912         grad_calls, myfprime = wrap_function(fprime, args)
--> 913     gfk = myfprime(x0)
    914     k = 0
    915     N = len(x0)

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in function_wrapper(*wrapper_args)
    290     def function_wrapper(*wrapper_args):
    291         ncalls[0] += 1
--> 292         return function(*(wrapper_args + args))
    293 
    294     return ncalls, function_wrapper

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in approx_fprime(xk, f, epsilon, *args)
    686 
    687     """
--> 688     return _approx_fprime_helper(xk, f, epsilon, args=args)
    689 
    690 

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in _approx_fprime_helper(xk, f, epsilon, args, f0)
    620     """
    621     if f0 is None:
--> 622         f0 = f(*((xk,) + args))
    623     grad = numpy.zeros((len(xk),), float)
    624     ei = numpy.zeros((len(xk),), float)

~\Anaconda3\lib\site-packages\scipy\optimize\optimize.py in function_wrapper(*wrapper_args)
    290     def function_wrapper(*wrapper_args):
    291         ncalls[0] += 1
--> 292         return function(*(wrapper_args + args))
    293 
    294     return ncalls, function_wrapper

TypeError: 'numpy.ndarray' object is not callable.

我错过了一些东西,但我不知道是什么。


按照建议,我正在添加数据文件以使该程序运行

0   405
5   20
10  350
15  1380
20  2900
25  4750
30  6450
35  8100
40  9100
45  9800
50  10100
55  10250
60  9400
65  8400
70  6430
75  4900
80  3030
85  1500
90  400
95  17
100 410
105 1550
110 3100
115 4850
120 6780

【问题讨论】:

  • 我猜你只需要x0=[0] 或类似的东西(取决于你使用了多少变量)。只需确保提供与变量数量相同长度的列表即可。
  • 我已经尝试使用x0=[0],但我得到了同样的错误。
  • 好的,你能提供一些数据来重现错误吗?!这样更容易提供帮助。
  • 您能解释一下您希望通过此minimize 电话实现什么目标吗?您已经使用curve_fit 拟合了参数。
  • 我想找到最小化我的功能的角度值,optimize.minimize(sine, x0=[0], args=(params[0], params[1], params[2])) 显然工作正常。谢谢!

标签: python python-3.x numpy scipy minimize


【解决方案1】:

minimize 需要一个函数作为第一个参数,但是,您目前通过了

sine(t, *params)

这是一个 numpy 数组。

您可以解决此问题并执行以下操作:

print(optimize.minimize(sine, x0=[0], args=tuple(params)))

这将打印出来

      fun: 2.4080485986582715e-12
 hess_inv: array([[1.15258817e-05]])
      jac: array([8.19961349e-09])
  message: 'Optimization terminated successfully.'
     nfev: 18
      nit: 4
     njev: 6
   status: 0
  success: True
        x: array([0.09203053])

【讨论】:

    【解决方案2】:

    在 scipy 的文档中,optimize.minimize 函数将ndarrayshape(n) 作为x, 的输入而不是整数。我认为错误是从那里引发的,因为在他们的错误跟踪中

    --> 913     gfk = myfprime(x0)
    

    此函数引发错误。

    文档link

    【讨论】:

    • 我验证了x, 的输入确实是ndarrayshape(n,),所以问题可能是其他问题
    猜你喜欢
    • 2019-09-04
    • 2021-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多