scipy.optimize.minimize在最小化过程中更改x0的形状(初始猜测)

时间:2019-06-29 14:05:30

标签: python machine-learning scipy-optimize-minimize

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

问题::在优化过程中,x0参数(初始猜测)将形状从[gamma,var_y]更改为[[gamma,var_y]],从而导致最小化过程失败。这是因为解压缩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次最小化运行的目标函数评估(均因相同问题而失败)。超参数图显示了超参数值在最小化期间​​的变化。

objective function evaluations

hyperparameters

0 个答案:

没有答案