Standard Bayesian optimization

Driver:

BayesianOptimization

Download script:

vanilla_bayesian_optimization.py

The target of the study is to run a standard Bayesian optimization of a scalar function. As an example, the 2D Rastrigin function on a circular domain is minimized,

\[ \begin{align}\begin{aligned}&\text{min.}\,& f(x_1,x_2) = 2\cdot10 + \sum_{i=1,2} \left(x_i^2 - 10\cos(2\pi x_i)\right)\\&\text{s.t.}\,& \sqrt{x_1^2 + x_2^2} \leq 1.5.\end{aligned}\end{align} \]
 1import sys,os
 2import numpy as np
 3import time
 4import pandas as pd
 5
 6from jcmoptimizer import Client, Study, Observation
 7client = Client()
 8
 9
10# Definition of the search domain
11design_space = [
12    {'name': 'x1', 'type': 'continuous', 'domain': (-1.5,1.5)}, 
13    {'name': 'x2', 'type': 'continuous', 'domain': (-1.5,1.5)},
14]
15
16# Definition of fixed environment parameter
17environment = [
18    {'name': 'radius', 'type': 'fixed', 'domain': 1.5},
19]
20
21# Definition of a constraint on the search domain
22constraints = [
23    {'name': 'circle', 'expression': 'sqrt(x1^2 + x2^2) <= radius'}
24]
25
26# Creation of the study object with study_id 'vanilla_bayesian_optimization'
27study = client.create_study(
28    design_space=design_space,
29    environment=environment,
30    constraints=constraints,
31    driver="BayesianOptimization",
32    study_name="Standard Bayesian optimization",
33    study_id="vanilla_bayesian_optimization"
34)
35
36# Configure study parameters
37study.configure(max_iter=80, num_parallel=2)
38
39# Evaluation of the black-box function for specified design parameters
40def evaluate(study: Study, x1: float, x2: float, radius: float) -> Observation:
41
42    time.sleep(2) # make objective expensive
43    observation = study.new_observation()
44    observation.add(10*2
45                + (x1**2-10*np.cos(2*np.pi*x1)) 
46                + (x2**2-10*np.cos(2*np.pi*x2))
47            )
48    return observation
49
50# Run the minimization
51study.set_evaluator(evaluate)
52study.run()
53
54best = study.driver.best_sample
55print(f"Best sample at: x1={best['x1']:.3f}, x2={best['x2']:.3f}")
56#print information on all found local minima
57minima = study.driver.get_minima(num_initial_samples=20)
58print(pd.DataFrame(minima))
59
60#get information on best value under uncertain inputs with standard deviation 0.1
61study.configure(parameter_distribution=dict(
62    distributions =[
63        dict(type="normal", parameter="x1", mean=best["x1"], stddev=0.01),
64        dict(type="normal", parameter="x2", mean=best["x2"], stddev=0.02)
65    ]
66))
67stats = study.driver.get_statistics(quantiles=[0.5])
68print(f"Objective mean {stats['mean'][0]:.2f}, "
69      f"standard deviation {np.sqrt(stats['variance'][0]):.2f}, "
70      f"median {stats['quantiles'][0][0]:.2f}")
71client.shutdown_server()