def suggest(self, utility_function):
        """Most promissing point to probe next"""
        if len(self._space) == 0:
            continuous_sample = self._space.random_sample()
            discrete_sample = np.array([
                CustomBayesianOptimization.round_to_step(
                    x, self.parameter_step_sizes[i])
                for i, x in enumerate(continuous_sample)
            ])
            return self._space.array_to_params(discrete_sample)

        # Sklearn's GP throws a large number of warnings at times, but
        # we don't really need to see them here.
        with warnings.catch_warnings():
            warnings.simplefilter("ignore")
            self._gp.fit(self._space.params, self._space.target)

        try:
            # Finding argmax of the acquisition function.
            continuous_suggestion = acq_max(ac=utility_function.utility,
                                            gp=self._gp,
                                            y_max=self._space.target.max(),
                                            bounds=self._space.bounds,
                                            random_state=self._random_state)

            # transform each value in suggestion into the
            # discrete value closed to the defined step size
            discrete_suggestion: np.ndarray = np.array([
                CustomBayesianOptimization.round_to_step(
                    x, self.parameter_step_sizes[i])
                for i, x in enumerate(continuous_suggestion)
            ])
            if discrete_suggestion in self._space:
                raise KeyError("Already probed suggestion.")
            return self._space.array_to_params(discrete_suggestion)
        except:
            number_retries = 0
            max_number_retries = 20
            while (number_retries < max_number_retries):
                try:
                    continuous_sample = self._space.random_sample()
                    discrete_sample = np.array([
                        CustomBayesianOptimization.round_to_step(
                            x, self.parameter_step_sizes[i])
                        for i, x in enumerate(continuous_sample)
                    ])
                    if discrete_sample in self._space:
                        raise KeyError("Already probed suggestion.")
                    return self._space.array_to_params(discrete_sample)
                except:
                    number_retries += 1
            raise KeyError(
                "Even with retries no unique sample could be probed.")
Esempio n. 2
0
def test_acq_with_poi():
    util = UtilityFunction(kind="poi", kappa=1.0, xi=1e-4)
    episilon = 1e-2
    y_max = 2.0

    max_arg = acq_max(
        util.utility,
        GP,
        y_max,
        bounds=np.array([[0, 1], [0, 1]]),
        random_state=ensure_rng(0),
        n_iter=200,
    )
    _, brute_max_arg = brute_force_maximum(MESH, GP, kind='poi', kappa=1.0, xi=1e-4)

    assert all(abs(brute_max_arg - max_arg) < episilon)
Esempio n. 3
0
def test_acq_with_ucb():
    util = UtilityFunction(kind="ucb", kappa=1.0, xi=1.0)
    episilon = 1e-2
    y_max = 2.0

    max_arg = acq_max(util.utility,
                      GP,
                      y_max,
                      bounds=np.array([[0, 1], [0, 1]]),
                      btypes=[float, float],
                      random_state=ensure_rng(0),
                      n_iter=20)
    _, brute_max_arg = brute_force_maximum(MESH,
                                           GP,
                                           kind='ucb',
                                           kappa=1.0,
                                           xi=1.0)

    assert all(abs(brute_max_arg - max_arg) < episilon)