我想优化一个函数,但它返回nan
s
以下是函数(fnRestrictParams
是一个助手函数):
def fnRestrictParams(vParams):
vRestrictedParams = vParams
vRestrictedParams[1] = exp(vParams[1])
vRestrictedParams[2] = exp(vParams[2]) / (1 + exp(vParams[2]))
return(vRestrictedParams)
def fnGASGaussianCopulaLikelihood(vParams, iT, mData):
dLL = 0 # initialize the likelihood at zero
vRestrictedParams = fnRestrictParams(vParams)
dOmega = vRestrictedParams[0]
dA = vRestrictedParams[1]
dB = vRestrictedParams[2]
dFactor = dOmega
dOmega = dOmega*(1 - dB)
vFactor = np.zeros(iT)
for t in range(iT):
# compute the copula parameters based on the factors
rho = (1 - exp(-dFactor))/(1 + exp(-dFactor))
rho2 = rho * rho
vFactor[t] = rho
# quantile functions
qu = sps.norm.ppf(mData[t, :])
x = qu[0] ** 2 + qu[1] ** 2
y = qu[0] * qu[1]
# get the log pdf of the copula, and its gradient with respect to the copula parameters
dLL += -0.5 * np.log(1 - rho2) - 0.5 * (rho2 * x - 2 * rho * y) / (1 - rho2)
# scaled score function
dSt = (2 / (1 - rho2)) * (y - rho - rho * (x - 2) / (1 + rho2))
# GAS recursion
dFactor = dOmega + dA * dSt + dB * dFactor
dLL = dLL/iT
return(-dLL)
测试此函数的数据是here。在
我知道这个函数可以正常工作,因为我已经将输出与原始作者(用另一种编程语言)提供的实现进行了比较。在
^{pr2}$但是,当我尝试使用scipy.optimize.minimize
优化此函数时:
# optimize the function without the gradient
spoGC = spo.minimize(fnGASGaussianCopulaLikelihood, np.array([0.005,-5,5.0]),
args = (int(mData.shape[0]), mData[:, [0, 1]]),
method = 'BFGS', options = {'disp': True, 'gtol': 1e-10, 'eps': 1e-10})
我得到:
Optimization terminated successfully.
Current function value: nan
Iterations: 0
Function evaluations: 5
Gradient evaluations: 1
Out[34]:
(array([ 0.005 , 1.0067607 , 0.72974065]),
nan,
array([ nan, nan, nan]),
array([[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]),
5,
1,
0)
这显然是不好的。我不知道是什么引起了这个问题。任何帮助都将不胜感激。在
目前没有回答
相关问题 更多 >
编程相关推荐