def evaluate(self, theta_new, t=None):
"""Evaluate the acquisition function at the location theta_new.
Parameters
----------
theta_new : array_like
Evaluation coordinates.
t : int, optional
Current iteration, (unused).
Returns
-------
array_like
Expected loss's term dependent on theta_new.
"""
gp = self.model
n_imp, n_dim = self.points_int.shape
# Alter the shape of theta_new.
if n_dim != 1 and theta_new.ndim == 1:
theta_new = theta_new[np.newaxis, :]
elif n_dim == 1 and theta_new.ndim == 1:
theta_new = theta_new[:, np.newaxis]
# Calculate the integrand term w.
# Note: w's second term (given in Järvenpää et al., 2017) is dismissed
# because it is constant with respect to theta_new.
_, var_new = gp.predict(theta_new, noiseless=True)
k_old_new = self._K(self.thetas_old, theta_new)
k_int_new = self._K(self.points_int, theta_new).T
# Using the Cholesky factorisation to avoid computing matrix inverse.
term_chol = sl.cho_solve(sl.cho_factor(self.K), k_old_new)
cov_int = k_int_new - np.dot(self.k_int_old.T, term_chol).T
delta_var_int = cov_int**2 / (self.sigma2_n + var_new)
a = np.sqrt((self.sigma2_n + self.var_int.T - delta_var_int) /
(self.sigma2_n + self.var_int.T + delta_var_int))
# Using the skewnorm's cdf to substitute the Owen's T function.
phi_skew_imp = ss.skewnorm.cdf(self.eps, a, loc=self.mean_int.T,
scale=np.sqrt(self.sigma2_n + self.var_int.T))
w = ((self.phi_int - phi_skew_imp) / 2)
loss_theta_new = 2 * np.sum(self.omegas_int * self.priors_int * w, axis=1)
return loss_theta_new
评论列表
文章目录