scipy minimize ValueError: Index data must be 1-dimensional

scipy minimize ValueError: Index data must be 1-dimensional

我正在尝试优化以下功能:

import numpy as np
import pandas as pd
def test(var,q,pts):
    eMin,eMax=var*(1-(1./q)**.5)**2,var*(1+(1./q)**.5)**2
    eVal=np.linspace(eMin,eMax,pts) # create space of eigenvalues
    pdf=q/(2*np.pi*var*eVal)*((eMax-eVal)*(eVal-eMin))**.5 # MP pdf based on eigenvalue space
    pdf=pd.Series(pdf,index=eVal)
    return pdf.sum()

功能很好:实际试试

test(0.5, 10, 1000)

但是当我尝试使用 scipy 优化它时,最小化:

from scipy.optimize import minimize
minimize(test, 0.5, (10,1000))

我收到以下错误消息:

ValueError: Index data must be 1-dimensional

在我的理解中指的是最后一行,即 pdf=pd.Series(pdf, index=eVal)。但是,我不明白这里的问题是什么,因为该函数在优化过程之外工作正常。

问题在于 eVal 变量,它是一个二维 np.ndarray 因为 var 作为一维 np.ndarray 传递(例如,[0.5] ) 在使用 minimize 时添加到 test 函数。因此,eMineMax 也是一维数组,您最终会得到 eVal 作为二维 np.ndarraypd.Series 中的索引参数必须是一维的。因此,您必须将 eVal 展平为 1D,如下所示:

eVal=np.linspace(eMin,eMax,pts).flatten()

解决了上面的错误。

输出:

>>> minimize(test, 0.5, (10,1000))
      fun: 0.06741138275083512
 hess_inv: array([[2.84420795e+08]])
      jac: array([-5.75464219e-06])
  message: 'Optimization terminated successfully.'
     nfev: 70
      nit: 34
     njev: 35
   status: 0
  success: True
        x: array([11715.27509055])