首页 > 解决方案 > scipy.optimize.minimize 在最小化过程中改变 x0 的形状(初始猜测)

问题描述

背景(可能不相关):我正在使用随机特征进行稀疏内核近似,然后将其用于普通贝叶斯线性回归设置。为了优化两个超参数 [gamma, var_y],我使用了重新参数化技巧并最小化变分上限-E[log(p(y|f(x)))] + KL(q(w)||p(w))

问题:在优化过程中,x0 参数(初始猜测)从 [gamma, var_y] 更改为 [[gamma, var_y]] 导致最小化过程失败。这是因为当 x0 被解包时,只有一个值而不是两个。奇怪的是,每次调用最小化时都不会发生这种情况。

当 x0 改变形状时手动重塑 x0 会导致最小化函数中的错误,并且也会解决问题。

代码:

def kl_divergence(mu, cov):
    n = mu.shape[0]
    kl = 0.5 * (-np.log(np.linalg.det(cov)) - n + np.trace(cov) + np.dot(mu.T,mu))
    return kl

def upper_bound(self, x0):

    print('x0: ', x0)       

    ############################
    # Unpack error occurs here #
    ############################
    gamma, var_y = np.exp(x0)

    X = np.array([-4,-2,-1.5,0.3,1,2,3.5,4.5]).reshape(-1,1)
    Y = np.array([-0.35,0.5,1.5,1.9,0.2,-2.2,-1.5,-1]).reshape(-1,1)

    # Returns the MAP weights (mu), covariance matrix (S) and design matrix (phi)
    mu, S, phi = bayes_regressor(X, Y, gamma, var_y)

    # KL divergence between posterior and prior on the weights
    kl = kl_divergence(mu, S)

    # Gaussian log likelihood
    N = X.shape[0]
    log_p = -(N/2)*np.log(2*np.pi*var_y) - ((0.5/var_y)*(Y - phi.dot(mu))**2).mean()

    # Variational upper bound
    ub = -log_p + kl

    return ub

运行最小化:

x0 = [0, 0]

result = scipy.optimize.minimize(upper_bound, x0)

在每次迭代中打印 x0 显示以下内容:

x0:  [0. 0.]
x0:  [1.49011612e-08 0.00000000e+00] 
x0:  [0.00000000e+00 1.49011612e-08]
...
...
x0:  [-0.03153053 -5.35141768]
x0:  [-0.03153053 -5.35141769]
x0:  [[-0.03153053 -5.35141769]]

最后一行显示形状变化的地方。引发以下错误np.exp(x0)

ValueError: not enough values to unpack (expected 2, got 1)

更新:收敛图显示 4 次最小化运行的目标函数评估(均因相同问题而失败)。显示超参数值在最小化过程中如何变化的超参数图。

目标函数评估

超参数

标签: pythonmachine-learningscipy-optimize-minimize

解决方案


推荐阅读