Python scipy最小化的问题

Python scipy最小化的问题,python,numpy,Python,Numpy,我从scipy minimize收到以下错误 RuntimeWarning: overflow encountered in double_scalars inner = x[k]*((x[0]**int(cAnde[ses][sub][strats][0]))*(1.0-x[0])**int(cAnde[ses][sub][strats][1])) Traceback (most recent call last): File "MLEestimation.py", line 39,

我从scipy minimize收到以下错误

RuntimeWarning: overflow encountered in double_scalars
  inner = x[k]*((x[0]**int(cAnde[ses][sub][strats][0]))*(1.0-x[0])**int(cAnde[ses][sub][strats][1]))
Traceback (most recent call last):
  File "MLEestimation.py", line 39, in ,module.
     constraints=MLEfunction.MLEconstrain(x), method = 'SLSQP', options = {'disp': True})
  File "C:\ProgramData\Anaconda2\lib\site-packages\scipy\optimize\_minimize.py", line 458, in minimize
     constraints, callback=callback, **options)
  File "C:\ProgramData\Anaconda2\lib\site-packages\scipy\optimize\slsqp.py", line 370 in _minimize_slsqp
      raise ValueError("Objective function must return a scalar")
   ValueError: Objective function must return a scalar
但是,当我用np.isscalar检查目标函数的输出是否是标量时,我得到了它是标量,所以我不确定我做错了什么。下面是所有代码供参考

import math
import pickle
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from scipy.optimize import minimize
import MLEfunction

x = [0.9,0.2,0.1,0.2,0.1,0.2,0.2]

def MLE(x, cAnde):
    est = 0.0
    for ses in cAnde:
        for sub in cAnde[ses]:
            k = 0
            for strats in cAnde[ses][sub]:
                k += 1
                inner = x[k] * x[0] ** int(cAnde[ses][sub][strats][0]) \
                    * (1.0 - x[0]) ** int(cAnde[ses][sub][strats][1])
                est += math.log(inner)
    est = -1.0 * est
    return est


def MLE_deriv(x, cAnde):
    der = np.zeros_like(x)
    d0 = 0
    for ses in cAnde:
        for sub in cAnde[ses]:
            for strat in cAnde[ses][sub]:
                inner = float(cAnde[ses][sub][strat][0]) / x[0]
                inner += float(cAnde[ses][sub][strat][1]) / (1 - x[0])
                d0 += inner
    der[0] = -1.0 * d0
    for k in range(len(x) - 1):
        d = 0
        for ses in cAnde:
            for sub in cAnde[ses]:
                d += 1.0 / x[k + 1]
        der[k + 1] = -1.0 * d
    return der


def MLEconstraint(x):
    cons = []
    jacs = []
    for j in range(len(x)):
        if j == 0:
            jacs.append(0.0)
        else:
            jacs.append(1.0)
    sum1 = {'type': 'eq', 'fun': lambda x: np.array([sum(x[1:]) - 1]),
            'jac': lambda x: np.array(jacs)}
    cons.append(sum1)
    for k in range(len(x)):
        jacu = []
        jacd = []
        for l in range(len(x)):
            if l == k:
                jacu.append(-1.0)
                jacd.append(1.0)
            else:
                jacu.append(0.0)
                jacd.append(0.0)
        up = {'type': 'ineq', 'fun': lambda x: np.array([1 - x[k]]),
              'jac': lambda x: np.array(jacu)}
        low = {'type': 'ineq', 'fun': lambda x: np.array([x[k]]),
               'jac': lambda x: np.array(jacd)}
        cons.append(up)
        cons.append(low)
    return tuple(cons)


res = minimize(
    MLEfunction.MLE,
    x,
    args=CEs['48,0.75'],
    jac=MLEfunction.MLE_deriv,
    constraints=MLEfunction.MLEconstraint(x),
    method='SLSQP',
    options={'disp': True},
    )

print res.x

注意:最小化是在不同于定义函数的.py文件中进行的,我正在导入定义函数的原始文件

请编辑您的问题以包含错误文本,否则如果外部图像链接中断,问题将变得无效。什么是
MLEfunction
?也许您想去掉
import
语句及其在
res
定义中的所有用法?什么是
x
?而
CEs
?MLEfunction是python文件,我在其中存储了三个MLE函数。优化是在另一个.py文件中完成的。x是我忘记包含和编辑的输入的初始列表。CEs是一个大的字典文件,我将其存储为pickle文件并导入。虽然没有一个工作示例,但很难确定,但我猜inner会变大,因此返回nan。您能检查一下吗?不,请编辑您的问题以包含错误文本,否则如果外部图像链接中断,问题将变得无效。什么是
MLEfunction
?也许您想去掉
import
语句及其在
res
定义中的所有用法?什么是
x
?而
CEs
?MLEfunction是python文件,我在其中存储了三个MLE函数。优化是在另一个.py文件中完成的。x是我忘记包含和编辑的输入的初始列表。CEs是一个大的字典文件,我将其存储为pickle文件并导入。虽然没有一个工作示例,但很难确定,但我猜inner会变大,因此返回nan。你能检查一下吗?不,内尔永远不会回来