Standard Bayesian optimization
- Driver:
- Download script:
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
6jcm_optimizer_path = r"<JCM_OPTIMIZER_PATH>"
7sys.path.insert(0, os.path.join(jcm_optimizer_path, "interface", "python"))
8from jcmoptimizer import Server, Client, Study, Observation
9server = Server()
10client = Client(server.host)
11
12# Definition of the search domain
13design_space = [
14 {'name': 'x1', 'type': 'continuous', 'domain': (-1.5,1.5)},
15 {'name': 'x2', 'type': 'continuous', 'domain': (-1.5,1.5)},
16]
17
18# Definition of fixed environment parameter
19environment = [
20 {'name': 'radius', 'type': 'fixed', 'domain': 1.5},
21]
22
23# Definition of a constraint on the search domain
24constraints = [
25 {'name': 'circle', 'expression': 'sqrt(x1^2 + x2^2) <= radius'}
26]
27
28# Creation of the study object with study_id 'vanilla_bayesian_optimization'
29study = client.create_study(
30 design_space=design_space,
31 environment=environment,
32 constraints=constraints,
33 driver="BayesianOptimization",
34 name="Standard Bayesian optimization",
35 study_id="vanilla_bayesian_optimization"
36)
37
38# Evaluation of the black-box function for specified design parameters
39def evaluate(study: Study, x1: float, x2: float, radius: float) -> Observation:
40
41 time.sleep(2) # make objective expensive
42 observation = study.new_observation()
43 observation.add(10*2
44 + (x1**2-10*np.cos(2*np.pi*x1))
45 + (x2**2-10*np.cos(2*np.pi*x2))
46 )
47 return observation
48
49# Run the minimization
50study.set_evaluator(evaluate)
51study.run()
52
53best = study.driver.best_sample
54print(f"Best sample at: x1={best['x1']:.3f}, x2={best['x2']:.3f}")
55#print information on all found local minima
56minima = study.driver.get_minima(num_initial_samples=20)
57print(pd.DataFrame(minima))
58
59#get information on best value under uncertain inputs with standard deviation 0.1
60study.configure(parameter_distribution=dict(
61 distributions =[
62 dict(type="normal", parameter="x1", mean=best["x1"], stddev=0.01),
63 dict(type="normal", parameter="x2", mean=best["x2"], stddev=0.02)
64 ]
65))
66stats = study.driver.get_statistics(quantiles=[0.5])
67print(f"Objective mean {stats['mean'][0]:.2f}, "
68 f"standard deviation {np.sqrt(stats['variance'][0]):.2f}, "
69 f"median {stats['quantiles'][0][0]:.2f}")