python - scipy.brute 值错误 : setting an array element with a sequence

标签 python python-2.7 scipy maximize

我的 scipy.brute 有问题,我这样设置最大化

import numpy as np
from scipy.optimize import brute
from scipy.optimize import fmin
from scipy.stats import norm 

lambmarket=np.array([1.1076, 0.0615, 0.15238, 0.16265, 0.1761301, 0.193762, 0.0778772, 0.079162, 0.07505194, 0.071973])
xnew = np.array([0.5, 1.0, 2.0, 3.0, 4.0, 5.0, 7.0, 10.0, 20.0, 30.0])

def optimization(key):
    if key=='inc':
         ranges=slice(0,2,0.2), slice(0.001,2.998,0.5)
         finalB =brute(incmse, ranges, full_output=True,finish=None, disp=True)
         finalA=fmin(incmse, finalB[0], xtol=0.001, ftol=0.001, maxiter=500, maxfun=500)

    return finalA

哪里

def incmse(*p):

    v, sigma =p[0]
    print v,sigma

    msqdiff=[(( lambmarket[t]  - s_t(0.,xnew[t], v, 0.003, sigma) )**2)  for t in range(0,len(xnew))]

    print sum(msqdiff)
    return msqdiff


def s_t(t,T,v,r,sigma):
    m=r-0.5*sigma**2
    gamma=1+2*m/(sigma**2)
    nu=m+sigma**2
    delta=m-gamma*sigma**2
    beta=-m*gamma+(gamma**2)*(sigma**2)/2
    s = lambda t,T,v: norm.cdf((-v-m*(T-t))/(sigma*np.sqrt(T-t))) - np.exp(v+r*(T-t)) * norm.cdf((-v-nu*(T-t))/(sigma*np.sqrt(T-t))) \
        + np.exp(( 1-gamma )*v)/gamma * norm.cdf((m*(T-t)-v)/(sigma*np.sqrt(T-t))) \
        - np.exp(v+(T-t)*beta)/gamma * norm.cdf((delta*(T-t)-v)/(sigma* np.sqrt(T-t)))

    lamb = ((1/0.01) * (s(t,T+0.01,v)-s(t,T,v)))/(1-s(t,T,v))


    return lamb

可以通过

执行
 optimization('inc')

(lammmarket 和 xnew 是全局性的) 从打印中我知道错误是在所有暴力迭代完成之后出现的......有人可以解释我吗?

(我寻找了类似的线程并尝试自己解决,但我仍然不明白问题是什么)

完整错误输出

param=optimization(key)
File "/home/myway/calibration.py", line 129, in optimization
finalB =brute(incmse, ranges, full_output=True,finish=None, disp=True)
File "/usr/lib/python2.7/dist-packages/scipy/optimize/optimize.py", line 2542, in brute
Jout = vecfunc(*grid)
File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line 1573, in __call__
return self._vectorize_call(func=func, args=vargs)
File "/usr/lib/python2.7/dist-packages/numpy/lib/function_base.py", line  1643, in _vectorize_call
copy=False, subok=True, dtype=otypes[0])
ValueError: setting an array element with a sequence.

最佳答案

正如 cel 所指出的,问题只是我(无意中)返回一个向量而不是单个值,函数 incmse 必须修改如下

def incmse(*p):

     v, sigma =p[0]
     print v,sigma

     msqdiff=[(( lambmarket[t]  - s_t(0.,xnew[t], v, 0.003, sigma) )**2)  for t in range(0,len(xnew))]

     print sum(msqdiff)
     return sum(msqdiff)

现在,根据需要将单个值传递给 scipy.optimize.brute 使其工作。

关于python - scipy.brute 值错误 : setting an array element with a sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32702484/

相关文章:

python - 我可以把Django模板中的字符串剪掉吗?

python - 如果一行中不存在所有值,则插入记录

python - Linux/ python : Monitor/proc/acpi files without polling?

python - 为什么 unicodecsv 不能正常写入?

python - Numpy: "bump"数组的高效索引数组

python - 为什么 scipy.stats 分布的最大似然参数估计有时表现如此糟糕?

python - 沿最后一个维度索引 numpy nd 数组

python - 如何从github有效地将代码导入ipython

python - 如果我在迭代列表时从列表中删除,为什么会跳过元素?

python - 将 1x1 稀疏矩阵转换为标量