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
函数。因此,eMin
和 eMax
也是一维数组,您最终会得到 eVal
作为二维 np.ndarray
。 pd.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])
我正在尝试优化以下功能:
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
函数。因此,eMin
和 eMax
也是一维数组,您最终会得到 eVal
作为二维 np.ndarray
。 pd.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])