scipy.optimize.minimize.最小化趋同问题

2024-10-01 07:20:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我想优化一个函数,但它返回nans

以下是函数(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)

这显然是不好的。我不知道是什么引起了这个问题。任何帮助都将不胜感激。在


Tags: the函数itnanarraydllrhoqu