import warnings
warnings.filterwarnings("ignore")
import json
import numpy as np
from spotoptim import SpotOptim
from spotoptim.function import rosenbrock5 Benchmarking SpotOptim with Sklearn Kriging (Matern Kernel) on 6D Rosenbrock and 10D Michalewicz Functions
These test functions were used during the Dagstuhl Seminar 25451 Bayesian Optimisation (Nov 02 – Nov 07, 2025), see here.
This notebook demonstrates the use of SpotOptim with sklearn’s Gaussian Process Regressor as a surrogate model.
5.1 SpotOptim with Sklearn Kriging in 6 Dimensions: Rosenbrock Function
This section demonstrates how to use the SpotOptim class with sklearn’s Gaussian Process Regressor (using Matern kernel) as a surrogate on the 6-dimensional Rosenbrock function. We use a maximum of 100 function evaluations.
5.1.1 Define the 6D Rosenbrock Function
dim = 6
lower = np.full(dim, -2.0)
upper = np.full(dim, 2.0)
bounds = list(zip(lower, upper))
fun = rosenbrock
max_iter = 1005.1.2 Set up SpotOptim Parameters
n_initial = dim
seed = 3215.1.3 Sklearn Gaussian Process Regressor as Surrogate
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern, ConstantKernel
# Use a Matern kernel instead of the standard RBF kernel
kernel = ConstantKernel(1.0, (1e-2, 1e12)) * Matern(
length_scale=1.0,
length_scale_bounds=(1e-4, 1e2),
nu=2.5
)
surrogate = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=100)
# Create SpotOptim instance with sklearn surrogate
opt_rosen = SpotOptim(
fun=fun,
bounds=bounds,
n_initial=n_initial,
max_iter=max_iter,
surrogate=surrogate,
seed=seed,
verbose=1
)
# Run optimization
result_rosen = opt_rosen.optimize()TensorBoard logging disabled
Initial best: f(x) = 321.834153
Iter 1 | Best: 321.834153 | Curr: 3523.030600 | Rate: 0.00 | Evals: 7.0%
Iter 2 | Best: 321.834153 | Curr: 1535.228299 | Rate: 0.00 | Evals: 8.0%
Iter 3 | Best: 321.834153 | Curr: 326.969698 | Rate: 0.00 | Evals: 9.0%
Iter 4 | Best: 179.356120 | Rate: 0.25 | Evals: 10.0%
Iter 5 | Best: 147.216512 | Rate: 0.40 | Evals: 11.0%
Iter 6 | Best: 126.879058 | Rate: 0.50 | Evals: 12.0%
Iter 7 | Best: 106.910445 | Rate: 0.57 | Evals: 13.0%
Iter 8 | Best: 77.690090 | Rate: 0.62 | Evals: 14.0%
Iter 9 | Best: 67.650765 | Rate: 0.67 | Evals: 15.0%
Iter 10 | Best: 67.650765 | Curr: 70.996531 | Rate: 0.60 | Evals: 16.0%
Iter 11 | Best: 66.959383 | Rate: 0.64 | Evals: 17.0%
Iter 12 | Best: 66.886607 | Rate: 0.67 | Evals: 18.0%
Iter 13 | Best: 63.396091 | Rate: 0.69 | Evals: 19.0%
Iter 14 | Best: 53.830939 | Rate: 0.71 | Evals: 20.0%
Iter 15 | Best: 53.480172 | Rate: 0.73 | Evals: 21.0%
Iter 16 | Best: 52.741893 | Rate: 0.75 | Evals: 22.0%
Iter 17 | Best: 51.637049 | Rate: 0.76 | Evals: 23.0%
Iter 18 | Best: 48.385433 | Rate: 0.78 | Evals: 24.0%
Iter 19 | Best: 48.385433 | Curr: 48.448189 | Rate: 0.74 | Evals: 25.0%
Iter 20 | Best: 48.057586 | Rate: 0.75 | Evals: 26.0%
Iter 21 | Best: 48.057586 | Curr: 48.216762 | Rate: 0.71 | Evals: 27.0%
Iter 22 | Best: 47.104651 | Rate: 0.73 | Evals: 28.0%
Iter 23 | Best: 45.850796 | Rate: 0.74 | Evals: 29.0%
Iter 24 | Best: 45.062114 | Rate: 0.75 | Evals: 30.0%
Iter 25 | Best: 43.538121 | Rate: 0.76 | Evals: 31.0%
Iter 26 | Best: 43.468547 | Rate: 0.77 | Evals: 32.0%
Iter 27 | Best: 43.468547 | Curr: 43.881459 | Rate: 0.74 | Evals: 33.0%
Iter 28 | Best: 39.919635 | Rate: 0.75 | Evals: 34.0%
Iter 29 | Best: 39.496653 | Rate: 0.76 | Evals: 35.0%
Iter 30 | Best: 39.003451 | Rate: 0.77 | Evals: 36.0%
Iter 31 | Best: 39.003451 | Curr: 39.521005 | Rate: 0.74 | Evals: 37.0%
Iter 32 | Best: 37.363045 | Rate: 0.75 | Evals: 38.0%
Iter 33 | Best: 29.875362 | Rate: 0.76 | Evals: 39.0%
Iter 34 | Best: 28.627645 | Rate: 0.76 | Evals: 40.0%
Iter 35 | Best: 26.549126 | Rate: 0.77 | Evals: 41.0%
Iter 36 | Best: 26.451449 | Rate: 0.78 | Evals: 42.0%
Iter 37 | Best: 26.352199 | Rate: 0.78 | Evals: 43.0%
Iter 38 | Best: 26.352199 | Curr: 26.389132 | Rate: 0.76 | Evals: 44.0%
Iter 39 | Best: 22.726275 | Rate: 0.77 | Evals: 45.0%
Iter 40 | Best: 22.075592 | Rate: 0.78 | Evals: 46.0%
Iter 41 | Best: 17.693068 | Rate: 0.78 | Evals: 47.0%
Iter 42 | Best: 15.583451 | Rate: 0.79 | Evals: 48.0%
Iter 43 | Best: 15.583451 | Curr: 16.376784 | Rate: 0.77 | Evals: 49.0%
Iter 44 | Best: 15.127598 | Rate: 0.77 | Evals: 50.0%
Iter 45 | Best: 14.524074 | Rate: 0.78 | Evals: 51.0%
Iter 46 | Best: 13.422546 | Rate: 0.78 | Evals: 52.0%
Iter 47 | Best: 13.018001 | Rate: 0.79 | Evals: 53.0%
Iter 48 | Best: 11.472323 | Rate: 0.79 | Evals: 54.0%
Iter 49 | Best: 6.578769 | Rate: 0.80 | Evals: 55.0%
Iter 50 | Best: 6.463796 | Rate: 0.80 | Evals: 56.0%
Iter 51 | Best: 6.330959 | Rate: 0.80 | Evals: 57.0%
Iter 52 | Best: 6.187917 | Rate: 0.81 | Evals: 58.0%
Iter 53 | Best: 6.187917 | Curr: 6.205608 | Rate: 0.79 | Evals: 59.0%
Iter 54 | Best: 6.181832 | Rate: 0.80 | Evals: 60.0%
Iter 55 | Best: 6.040090 | Rate: 0.80 | Evals: 61.0%
Iter 56 | Best: 6.040090 | Curr: 6.083338 | Rate: 0.79 | Evals: 62.0%
Iter 57 | Best: 6.040090 | Curr: 6.270033 | Rate: 0.77 | Evals: 63.0%
Iter 58 | Best: 5.772204 | Rate: 0.78 | Evals: 64.0%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 59 | Best: 5.772204 | Curr: 5.824228 | Rate: 0.76 | Evals: 65.0%
Iter 60 | Best: 5.772204 | Curr: 5.796713 | Rate: 0.75 | Evals: 66.0%
Iter 61 | Best: 5.753931 | Rate: 0.75 | Evals: 67.0%
Iter 62 | Best: 5.707030 | Rate: 0.76 | Evals: 68.0%
Iter 63 | Best: 5.707030 | Curr: 5.747185 | Rate: 0.75 | Evals: 69.0%
Iter 64 | Best: 5.654227 | Rate: 0.75 | Evals: 70.0%
Iter 65 | Best: 5.615682 | Rate: 0.75 | Evals: 71.0%
Iter 66 | Best: 5.615682 | Curr: 5.624633 | Rate: 0.74 | Evals: 72.0%
Iter 67 | Best: 5.611737 | Rate: 0.75 | Evals: 73.0%
Iter 68 | Best: 5.611737 | Curr: 5.625726 | Rate: 0.74 | Evals: 74.0%
Iter 69 | Best: 5.601843 | Rate: 0.74 | Evals: 75.0%
Iter 70 | Best: 5.601843 | Curr: 5.616520 | Rate: 0.73 | Evals: 76.0%
Iter 71 | Best: 5.601843 | Curr: 5.604705 | Rate: 0.72 | Evals: 77.0%
Iter 72 | Best: 5.597105 | Rate: 0.72 | Evals: 78.0%
Iter 73 | Best: 5.589008 | Rate: 0.73 | Evals: 79.0%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 74 | Best: 5.579764 | Rate: 0.73 | Evals: 80.0%
Iter 75 | Best: 5.579764 | Curr: 5.608069 | Rate: 0.72 | Evals: 81.0%
Iter 76 | Best: 5.579764 | Curr: 5.602025 | Rate: 0.71 | Evals: 82.0%
Iter 77 | Best: 5.563297 | Rate: 0.71 | Evals: 83.0%
Iter 78 | Best: 5.563297 | Curr: 5.568654 | Rate: 0.71 | Evals: 84.0%
Iter 79 | Best: 5.563297 | Curr: 5.565515 | Rate: 0.70 | Evals: 85.0%
Iter 80 | Best: 5.560309 | Rate: 0.70 | Evals: 86.0%
Iter 81 | Best: 5.557822 | Rate: 0.70 | Evals: 87.0%
Iter 82 | Best: 5.556375 | Rate: 0.71 | Evals: 88.0%
Iter 83 | Best: 5.556375 | Curr: 5.564786 | Rate: 0.70 | Evals: 89.0%
Iter 84 | Best: 5.548422 | Rate: 0.70 | Evals: 90.0%
Iter 85 | Best: 5.546971 | Rate: 0.71 | Evals: 91.0%
Iter 86 | Best: 5.537676 | Rate: 0.71 | Evals: 92.0%
Iter 87 | Best: 5.514886 | Rate: 0.71 | Evals: 93.0%
Iter 88 | Best: 5.514886 | Curr: 5.531799 | Rate: 0.70 | Evals: 94.0%
Iter 89 | Best: 5.489434 | Rate: 0.71 | Evals: 95.0%
Iter 90 | Best: 5.459248 | Rate: 0.71 | Evals: 96.0%
Iter 91 | Best: 5.459248 | Curr: 5.477179 | Rate: 0.70 | Evals: 97.0%
Iter 92 | Best: 5.459248 | Curr: 5.994070 | Rate: 0.70 | Evals: 98.0%
Iter 93 | Best: 5.441836 | Rate: 0.70 | Evals: 99.0%
Iter 94 | Best: 5.441836 | Curr: 5.456146 | Rate: 0.69 | Evals: 100.0%
print(f"[6D] Sklearn Kriging: min y = {result_rosen.fun:.4f} at x = {result_rosen.x}")
print(f"Number of function evaluations: {result_rosen.nfev}")
print(f"Number of iterations: {result_rosen.nit}")[6D] Sklearn Kriging: min y = 5.4418 at x = [-0.28213319 0.08559236 0.02001498 0.0070064 0.00738124 0.00269643]
Number of function evaluations: 100
Number of iterations: 94
5.1.4 Visualize Optimization Progress
import matplotlib.pyplot as plt
# Plot the optimization progress
plt.figure(figsize=(10, 6))
plt.semilogy(np.minimum.accumulate(opt_rosen.y_), 'b-', linewidth=2)
plt.xlabel('Function Evaluations', fontsize=12)
plt.ylabel('Best Objective Value (log scale)', fontsize=12)
plt.title('6D Rosenbrock: Sklearn Kriging Progress', fontsize=14)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
5.1.5 Evaluation of Multiple Repeats
To perform 30 repeats and collect statistics:
# Perform 30 independent runs
n_repeats = 30
results = []
print(f"Running {n_repeats} independent optimizations...")
for i in range(n_repeats):
kernel_i = ConstantKernel(1.0, (1e-2, 1e12)) * Matern(
length_scale=1.0,
length_scale_bounds=(1e-4, 1e2),
nu=2.5
)
surrogate_i = GaussianProcessRegressor(kernel=kernel_i, n_restarts_optimizer=100)
opt_i = SpotOptim(
fun=fun,
bounds=bounds,
n_initial=n_initial,
max_iter=max_iter,
surrogate=surrogate_i,
seed=seed + i, # Different seed for each run
verbose=0
)
result_i = opt_i.optimize()
results.append(result_i.fun)
if (i + 1) % 10 == 0:
print(f" Completed {i + 1}/{n_repeats} runs")
# Compute statistics
mean_result = np.mean(results)
std_result = np.std(results)
min_result = np.min(results)
max_result = np.max(results)
print(f"\nResults over {n_repeats} runs:")
print(f" Mean of best values: {mean_result:.6f}")
print(f" Std of best values: {std_result:.6f}")
print(f" Min of best values: {min_result:.6f}")
print(f" Max of best values: {max_result:.6f}")5.2 SpotOptim with Sklearn Kriging in 10 Dimensions: Michalewicz Function
This section demonstrates how to use the SpotOptim class with sklearn’s Gaussian Process Regressor (using Matern kernel) as a surrogate on the 10-dimensional Michalewicz function. We use a maximum of 300 function evaluations.
5.2.1 Define the 10D Michalewicz Function
from spotoptim.function import michalewicz
dim = 10
lower = np.full(dim, 0.0)
upper = np.full(dim, np.pi)
bounds = list(zip(lower, upper))
fun = michalewicz
max_iter = 3005.2.2 Set up SpotOptim Parameters
n_initial = dim
seed = 3215.2.3 Sklearn Gaussian Process Regressor as Surrogate
from sklearn.gaussian_process import GaussianProcessRegressor
from sklearn.gaussian_process.kernels import Matern, ConstantKernel
# Use a Matern kernel instead of the standard RBF kernel
kernel = ConstantKernel(1.0, (1e-2, 1e12)) * Matern(
length_scale=1.0,
length_scale_bounds=(1e-4, 1e2),
nu=2.5
)
surrogate = GaussianProcessRegressor(kernel=kernel, n_restarts_optimizer=100)
# Create SpotOptim instance with sklearn surrogate
opt_micha = SpotOptim(
fun=fun,
bounds=bounds,
n_initial=n_initial,
max_iter=max_iter,
surrogate=surrogate,
seed=seed,
verbose=1
)
# Run optimization
result_micha = opt_micha.optimize()TensorBoard logging disabled
Initial best: f(x) = -1.909129
Iter 1 | Best: -1.909129 | Curr: -0.467202 | Rate: 0.00 | Evals: 3.7%
Iter 2 | Best: -2.778262 | Rate: 0.50 | Evals: 4.0%
Iter 3 | Best: -2.778262 | Curr: -1.592337 | Rate: 0.33 | Evals: 4.3%
Iter 4 | Best: -2.778262 | Curr: -1.662544 | Rate: 0.25 | Evals: 4.7%
Iter 5 | Best: -3.211991 | Rate: 0.40 | Evals: 5.0%
Iter 6 | Best: -3.211991 | Curr: -2.798917 | Rate: 0.33 | Evals: 5.3%
Iter 7 | Best: -3.211991 | Curr: -2.988576 | Rate: 0.29 | Evals: 5.7%
Iter 8 | Best: -3.350611 | Rate: 0.38 | Evals: 6.0%
Iter 9 | Best: -3.350611 | Curr: -3.217390 | Rate: 0.33 | Evals: 6.3%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 10 | Best: -3.350611 | Curr: -1.168629 | Rate: 0.30 | Evals: 6.7%
Iter 11 | Best: -3.420176 | Rate: 0.36 | Evals: 7.0%
Iter 12 | Best: -3.477838 | Rate: 0.42 | Evals: 7.3%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 13 | Best: -3.477838 | Curr: -1.449586 | Rate: 0.38 | Evals: 7.7%
Iter 14 | Best: -3.477838 | Curr: -1.352781 | Rate: 0.36 | Evals: 8.0%
Iter 15 | Best: -3.477838 | Curr: -3.471892 | Rate: 0.33 | Evals: 8.3%
Iter 16 | Best: -3.541510 | Rate: 0.38 | Evals: 8.7%
Iter 17 | Best: -3.541510 | Curr: -1.622355 | Rate: 0.35 | Evals: 9.0%
Iter 18 | Best: -3.541510 | Curr: -3.502476 | Rate: 0.33 | Evals: 9.3%
Iter 19 | Best: -3.541510 | Curr: -3.497143 | Rate: 0.32 | Evals: 9.7%
Iter 20 | Best: -3.541510 | Curr: -1.760444 | Rate: 0.30 | Evals: 10.0%
Iter 21 | Best: -3.541510 | Curr: -1.832617 | Rate: 0.29 | Evals: 10.3%
Iter 22 | Best: -3.623121 | Rate: 0.32 | Evals: 10.7%
Iter 23 | Best: -3.623121 | Curr: -0.786191 | Rate: 0.30 | Evals: 11.0%
Iter 24 | Best: -3.645627 | Rate: 0.33 | Evals: 11.3%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 25 | Best: -3.645627 | Curr: -0.913552 | Rate: 0.32 | Evals: 11.7%
Iter 26 | Best: -3.879398 | Rate: 0.35 | Evals: 12.0%
Iter 27 | Best: -4.717449 | Rate: 0.37 | Evals: 12.3%
Iter 28 | Best: -4.717449 | Curr: -4.065064 | Rate: 0.36 | Evals: 12.7%
Iter 29 | Best: -4.755992 | Rate: 0.38 | Evals: 13.0%
Iter 30 | Best: -4.755992 | Curr: -4.749787 | Rate: 0.37 | Evals: 13.3%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 31 | Best: -4.755992 | Curr: -0.884913 | Rate: 0.35 | Evals: 13.7%
Iter 32 | Best: -4.760523 | Rate: 0.38 | Evals: 14.0%
Iter 33 | Best: -4.760523 | Curr: -4.601348 | Rate: 0.36 | Evals: 14.3%
Iter 34 | Best: -4.855653 | Rate: 0.38 | Evals: 14.7%
Iter 35 | Best: -4.909507 | Rate: 0.40 | Evals: 15.0%
Iter 36 | Best: -4.915291 | Rate: 0.42 | Evals: 15.3%
Iter 37 | Best: -4.915291 | Curr: -4.854324 | Rate: 0.41 | Evals: 15.7%
Iter 38 | Best: -4.959107 | Rate: 0.42 | Evals: 16.0%
Iter 39 | Best: -4.959107 | Curr: -1.855336 | Rate: 0.41 | Evals: 16.3%
Iter 40 | Best: -4.959107 | Curr: -2.006735 | Rate: 0.40 | Evals: 16.7%
Iter 41 | Best: -4.959408 | Rate: 0.41 | Evals: 17.0%
Iter 42 | Best: -4.959408 | Curr: -4.928736 | Rate: 0.40 | Evals: 17.3%
Iter 43 | Best: -4.989346 | Rate: 0.42 | Evals: 17.7%
Iter 44 | Best: -4.996114 | Rate: 0.43 | Evals: 18.0%
Iter 45 | Best: -5.008915 | Rate: 0.44 | Evals: 18.3%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 46 | Best: -5.008915 | Curr: -1.825027 | Rate: 0.43 | Evals: 18.7%
Iter 47 | Best: -5.008915 | Curr: -1.925606 | Rate: 0.43 | Evals: 19.0%
Iter 48 | Best: -5.136332 | Rate: 0.44 | Evals: 19.3%
Iter 49 | Best: -5.136332 | Curr: -5.096829 | Rate: 0.43 | Evals: 19.7%
Iter 50 | Best: -5.383622 | Rate: 0.44 | Evals: 20.0%
Iter 51 | Best: -5.383622 | Curr: -2.137949 | Rate: 0.43 | Evals: 20.3%
Iter 52 | Best: -5.383622 | Curr: -2.196596 | Rate: 0.42 | Evals: 20.7%
Iter 53 | Best: -5.383622 | Curr: -2.218551 | Rate: 0.42 | Evals: 21.0%
Iter 54 | Best: -5.783182 | Rate: 0.43 | Evals: 21.3%
Iter 55 | Best: -5.783182 | Curr: -5.759380 | Rate: 0.42 | Evals: 21.7%
Iter 56 | Best: -5.796553 | Rate: 0.43 | Evals: 22.0%
Iter 57 | Best: -5.844842 | Rate: 0.44 | Evals: 22.3%
Iter 58 | Best: -5.891383 | Rate: 0.45 | Evals: 22.7%
Iter 59 | Best: -5.891383 | Curr: -1.971752 | Rate: 0.44 | Evals: 23.0%
Iter 60 | Best: -5.953072 | Rate: 0.45 | Evals: 23.3%
Iter 61 | Best: -5.954150 | Rate: 0.46 | Evals: 23.7%
Iter 62 | Best: -5.954150 | Curr: -1.994472 | Rate: 0.45 | Evals: 24.0%
Iter 63 | Best: -5.954150 | Curr: -2.006233 | Rate: 0.44 | Evals: 24.3%
Iter 64 | Best: -5.954150 | Curr: -5.936416 | Rate: 0.44 | Evals: 24.7%
Iter 65 | Best: -5.954150 | Curr: -2.012008 | Rate: 0.43 | Evals: 25.0%
Iter 66 | Best: -6.038555 | Rate: 0.44 | Evals: 25.3%
Iter 67 | Best: -6.038555 | Curr: -6.022975 | Rate: 0.43 | Evals: 25.7%
Iter 68 | Best: -6.042427 | Rate: 0.44 | Evals: 26.0%
Iter 69 | Best: -6.066953 | Rate: 0.45 | Evals: 26.3%
Iter 70 | Best: -6.066953 | Curr: -2.224803 | Rate: 0.44 | Evals: 26.7%
Iter 71 | Best: -6.066953 | Curr: -2.016115 | Rate: 0.44 | Evals: 27.0%
Iter 72 | Best: -6.066953 | Curr: -0.786251 | Rate: 0.43 | Evals: 27.3%
Iter 73 | Best: -6.088524 | Rate: 0.44 | Evals: 27.7%
Iter 74 | Best: -6.088563 | Rate: 0.45 | Evals: 28.0%
Iter 75 | Best: -6.126040 | Rate: 0.45 | Evals: 28.3%
Iter 76 | Best: -6.166016 | Rate: 0.46 | Evals: 28.7%
Iter 77 | Best: -6.166016 | Curr: -2.058285 | Rate: 0.45 | Evals: 29.0%
Iter 78 | Best: -6.166016 | Curr: -2.074430 | Rate: 0.45 | Evals: 29.3%
Iter 79 | Best: -6.166016 | Curr: -2.225887 | Rate: 0.44 | Evals: 29.7%
Iter 80 | Best: -6.166016 | Curr: -6.156707 | Rate: 0.44 | Evals: 30.0%
Iter 81 | Best: -6.166016 | Curr: -2.224898 | Rate: 0.43 | Evals: 30.3%
Iter 82 | Best: -6.202985 | Rate: 0.44 | Evals: 30.7%
Iter 83 | Best: -6.202985 | Curr: -2.079543 | Rate: 0.43 | Evals: 31.0%
Iter 84 | Best: -6.236539 | Rate: 0.44 | Evals: 31.3%
Iter 85 | Best: -6.236539 | Curr: -2.344428 | Rate: 0.44 | Evals: 31.7%
Iter 86 | Best: -6.236539 | Curr: -6.231977 | Rate: 0.43 | Evals: 32.0%
Iter 87 | Best: -6.323436 | Rate: 0.44 | Evals: 32.3%
Iter 88 | Best: -6.334711 | Rate: 0.44 | Evals: 32.7%
Iter 89 | Best: -6.336443 | Rate: 0.45 | Evals: 33.0%
Iter 90 | Best: -6.336443 | Curr: -2.423947 | Rate: 0.44 | Evals: 33.3%
Iter 91 | Best: -6.336443 | Curr: -0.795597 | Rate: 0.44 | Evals: 33.7%
Iter 92 | Best: -6.336812 | Rate: 0.45 | Evals: 34.0%
Iter 93 | Best: -6.336812 | Curr: -2.460027 | Rate: 0.44 | Evals: 34.3%
Iter 94 | Best: -6.336812 | Curr: -2.080300 | Rate: 0.44 | Evals: 34.7%
Iter 95 | Best: -6.337062 | Rate: 0.44 | Evals: 35.0%
Iter 96 | Best: -6.337062 | Curr: -2.480598 | Rate: 0.44 | Evals: 35.3%
Iter 97 | Best: -6.337621 | Rate: 0.44 | Evals: 35.7%
Iter 98 | Best: -6.337621 | Curr: -2.080720 | Rate: 0.44 | Evals: 36.0%
Iter 99 | Best: -6.337621 | Curr: -6.337026 | Rate: 0.43 | Evals: 36.3%
Iter 100 | Best: -6.351705 | Rate: 0.44 | Evals: 36.7%
Iter 101 | Best: -6.351705 | Curr: -6.349891 | Rate: 0.44 | Evals: 37.0%
Iter 102 | Best: -6.351705 | Curr: -2.515227 | Rate: 0.43 | Evals: 37.3%
Iter 103 | Best: -6.362374 | Rate: 0.44 | Evals: 37.7%
Iter 104 | Best: -6.362405 | Rate: 0.45 | Evals: 38.0%
Iter 105 | Best: -6.362405 | Curr: -2.621538 | Rate: 0.44 | Evals: 38.3%
Iter 106 | Best: -6.362405 | Curr: -6.362320 | Rate: 0.44 | Evals: 38.7%
Iter 107 | Best: -6.362923 | Rate: 0.45 | Evals: 39.0%
Iter 108 | Best: -6.364422 | Rate: 0.45 | Evals: 39.3%
Iter 109 | Best: -6.365452 | Rate: 0.46 | Evals: 39.7%
Iter 110 | Best: -6.365452 | Curr: -2.651848 | Rate: 0.46 | Evals: 40.0%
Iter 111 | Best: -6.365452 | Curr: -2.091675 | Rate: 0.45 | Evals: 40.3%
Iter 112 | Best: -6.365452 | Curr: -6.363803 | Rate: 0.44 | Evals: 40.7%
Iter 113 | Best: -6.368242 | Rate: 0.45 | Evals: 41.0%
Iter 114 | Best: -6.370445 | Rate: 0.46 | Evals: 41.3%
Iter 115 | Best: -6.370445 | Curr: -2.651503 | Rate: 0.46 | Evals: 41.7%
Iter 116 | Best: -6.370449 | Rate: 0.46 | Evals: 42.0%
Iter 117 | Best: -6.370449 | Curr: -2.099261 | Rate: 0.46 | Evals: 42.3%
Iter 118 | Best: -6.370449 | Curr: -2.140510 | Rate: 0.46 | Evals: 42.7%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 119 | Best: -6.370449 | Curr: -1.664755 | Rate: 0.46 | Evals: 43.0%
Iter 120 | Best: -6.370449 | Curr: -6.370431 | Rate: 0.46 | Evals: 43.3%
Iter 121 | Best: -6.370533 | Rate: 0.47 | Evals: 43.7%
Iter 122 | Best: -6.370533 | Curr: -2.188518 | Rate: 0.46 | Evals: 44.0%
Iter 123 | Best: -6.370852 | Rate: 0.47 | Evals: 44.3%
Iter 124 | Best: -6.370852 | Curr: -0.938897 | Rate: 0.46 | Evals: 44.7%
Iter 125 | Best: -6.371240 | Rate: 0.47 | Evals: 45.0%
Iter 126 | Best: -6.371240 | Curr: -2.701838 | Rate: 0.46 | Evals: 45.3%
Iter 127 | Best: -6.371240 | Curr: -6.371234 | Rate: 0.45 | Evals: 45.7%
Iter 128 | Best: -6.371240 | Curr: -2.259184 | Rate: 0.45 | Evals: 46.0%
Iter 129 | Best: -6.371455 | Rate: 0.45 | Evals: 46.3%
Iter 130 | Best: -6.371641 | Rate: 0.46 | Evals: 46.7%
Iter 131 | Best: -6.371763 | Rate: 0.47 | Evals: 47.0%
Iter 132 | Best: -6.371823 | Rate: 0.47 | Evals: 47.3%
Iter 133 | Best: -6.372020 | Rate: 0.48 | Evals: 47.7%
Iter 134 | Best: -6.374629 | Rate: 0.48 | Evals: 48.0%
Iter 135 | Best: -6.374629 | Curr: -2.748870 | Rate: 0.47 | Evals: 48.3%
Iter 136 | Best: -6.374737 | Rate: 0.47 | Evals: 48.7%
Iter 137 | Best: -6.374737 | Rate: 0.48 | Evals: 49.0%
Iter 138 | Best: -6.374737 | Curr: -1.009466 | Rate: 0.47 | Evals: 49.3%
Iter 139 | Best: -6.374737 | Curr: -2.343139 | Rate: 0.47 | Evals: 49.7%
Iter 140 | Best: -6.374737 | Curr: -0.945674 | Rate: 0.47 | Evals: 50.0%
Iter 141 | Best: -6.374847 | Rate: 0.47 | Evals: 50.3%
Iter 142 | Best: -6.377577 | Rate: 0.48 | Evals: 50.7%
Iter 143 | Best: -6.377577 | Curr: -2.413194 | Rate: 0.47 | Evals: 51.0%
Iter 144 | Best: -6.380897 | Rate: 0.47 | Evals: 51.3%
Iter 145 | Best: -6.380897 | Curr: -2.433176 | Rate: 0.46 | Evals: 51.7%
Iter 146 | Best: -6.380897 | Curr: -0.887917 | Rate: 0.46 | Evals: 52.0%
Iter 147 | Best: -6.381467 | Rate: 0.47 | Evals: 52.3%
Iter 148 | Best: -6.382068 | Rate: 0.47 | Evals: 52.7%
Iter 149 | Best: -6.382073 | Rate: 0.48 | Evals: 53.0%
Iter 150 | Best: -6.382125 | Rate: 0.48 | Evals: 53.3%
Iter 151 | Best: -6.382126 | Rate: 0.49 | Evals: 53.7%
Iter 152 | Best: -6.382126 | Curr: -6.382025 | Rate: 0.49 | Evals: 54.0%
Iter 153 | Best: -6.382756 | Rate: 0.50 | Evals: 54.3%
Iter 154 | Best: -6.382756 | Curr: -2.747178 | Rate: 0.49 | Evals: 54.7%
Iter 155 | Best: -6.382756 | Curr: -2.830227 | Rate: 0.49 | Evals: 55.0%
Iter 156 | Best: -6.382756 | Curr: -1.175775 | Rate: 0.48 | Evals: 55.3%
Iter 157 | Best: -6.382756 | Curr: -2.433719 | Rate: 0.47 | Evals: 55.7%
Iter 158 | Best: -6.382756 | Curr: -6.382673 | Rate: 0.46 | Evals: 56.0%
Iter 159 | Best: -6.384091 | Rate: 0.47 | Evals: 56.3%
Iter 160 | Best: -6.384091 | Curr: -2.878350 | Rate: 0.46 | Evals: 56.7%
Iter 161 | Best: -6.384091 | Curr: -2.875264 | Rate: 0.45 | Evals: 57.0%
Iter 162 | Best: -6.384091 | Curr: -0.945677 | Rate: 0.45 | Evals: 57.3%
Iter 163 | Best: -6.385078 | Rate: 0.46 | Evals: 57.7%
Iter 164 | Best: -6.385542 | Rate: 0.47 | Evals: 58.0%
Iter 165 | Best: -6.385542 | Curr: -2.812457 | Rate: 0.47 | Evals: 58.3%
Iter 166 | Best: -6.389023 | Rate: 0.47 | Evals: 58.7%
Iter 167 | Best: -6.389023 | Curr: -1.857015 | Rate: 0.47 | Evals: 59.0%
Iter 168 | Best: -6.389850 | Rate: 0.47 | Evals: 59.3%
Iter 169 | Best: -6.389850 | Curr: -2.559919 | Rate: 0.46 | Evals: 59.7%
Iter 170 | Best: -6.389850 | Curr: -6.389498 | Rate: 0.46 | Evals: 60.0%
Iter 171 | Best: -6.389850 | Curr: -2.439094 | Rate: 0.46 | Evals: 60.3%
Iter 172 | Best: -6.389850 | Curr: -2.979798 | Rate: 0.46 | Evals: 60.7%
Iter 173 | Best: -6.389850 | Curr: -2.434510 | Rate: 0.45 | Evals: 61.0%
Iter 174 | Best: -6.389850 | Curr: -2.436195 | Rate: 0.44 | Evals: 61.3%
Iter 175 | Best: -6.389850 | Curr: -2.478410 | Rate: 0.43 | Evals: 61.7%
Iter 176 | Best: -6.389850 | Curr: -2.503607 | Rate: 0.42 | Evals: 62.0%
Iter 177 | Best: -6.389850 | Curr: -3.001307 | Rate: 0.42 | Evals: 62.3%
Iter 178 | Best: -6.390949 | Rate: 0.43 | Evals: 62.7%
Iter 179 | Best: -6.391019 | Rate: 0.44 | Evals: 63.0%
Iter 180 | Best: -6.391019 | Curr: -6.390981 | Rate: 0.44 | Evals: 63.3%
Iter 181 | Best: -6.393934 | Rate: 0.45 | Evals: 63.7%
Iter 182 | Best: -6.394335 | Rate: 0.45 | Evals: 64.0%
Iter 183 | Best: -6.395039 | Rate: 0.46 | Evals: 64.3%
Iter 184 | Best: -6.395039 | Curr: -2.774302 | Rate: 0.45 | Evals: 64.7%
Iter 185 | Best: -6.395975 | Rate: 0.46 | Evals: 65.0%
Iter 186 | Best: -6.397775 | Rate: 0.47 | Evals: 65.3%
Iter 187 | Best: -6.397775 | Curr: -2.775104 | Rate: 0.46 | Evals: 65.7%
Iter 188 | Best: -6.397775 | Curr: -2.991754 | Rate: 0.45 | Evals: 66.0%
Iter 189 | Best: -6.397775 | Curr: -2.158195 | Rate: 0.44 | Evals: 66.3%
Iter 190 | Best: -6.398971 | Rate: 0.45 | Evals: 66.7%
Iter 191 | Best: -6.401635 | Rate: 0.46 | Evals: 67.0%
Iter 192 | Best: -6.405145 | Rate: 0.46 | Evals: 67.3%
Iter 193 | Best: -6.405145 | Curr: -2.509044 | Rate: 0.46 | Evals: 67.7%
Optimizer candidate 1/3 was duplicate/invalid.
Iter 194 | Best: -6.405145 | Curr: -6.375941 | Rate: 0.46 | Evals: 68.0%
Iter 195 | Best: -6.405145 | Curr: -3.146202 | Rate: 0.45 | Evals: 68.3%
Iter 196 | Best: -6.412156 | Rate: 0.46 | Evals: 68.7%
Iter 197 | Best: -6.412840 | Rate: 0.46 | Evals: 69.0%
Iter 198 | Best: -6.416547 | Rate: 0.47 | Evals: 69.3%
Iter 199 | Best: -6.416547 | Curr: -2.775514 | Rate: 0.47 | Evals: 69.7%
Iter 200 | Best: -6.416547 | Curr: -6.415164 | Rate: 0.46 | Evals: 70.0%
Iter 201 | Best: -6.416547 | Curr: -2.526674 | Rate: 0.46 | Evals: 70.3%
Iter 202 | Best: -6.416547 | Curr: -0.945604 | Rate: 0.46 | Evals: 70.7%
Iter 203 | Best: -6.419275 | Rate: 0.46 | Evals: 71.0%
Iter 204 | Best: -6.419302 | Rate: 0.46 | Evals: 71.3%
Iter 205 | Best: -6.419464 | Rate: 0.47 | Evals: 71.7%
Iter 206 | Best: -6.419464 | Curr: -2.526391 | Rate: 0.47 | Evals: 72.0%
Iter 207 | Best: -6.420941 | Rate: 0.47 | Evals: 72.3%
Iter 208 | Best: -6.421033 | Rate: 0.47 | Evals: 72.7%
Iter 209 | Best: -6.421033 | Curr: -2.036540 | Rate: 0.46 | Evals: 73.0%
Iter 210 | Best: -6.421033 | Curr: -6.419700 | Rate: 0.46 | Evals: 73.3%
Iter 211 | Best: -6.429620 | Rate: 0.47 | Evals: 73.7%
Iter 212 | Best: -6.429620 | Curr: -6.429260 | Rate: 0.47 | Evals: 74.0%
Iter 213 | Best: -6.431046 | Rate: 0.47 | Evals: 74.3%
Iter 214 | Best: -6.431046 | Curr: -2.533706 | Rate: 0.46 | Evals: 74.7%
Iter 215 | Best: -6.432089 | Rate: 0.47 | Evals: 75.0%
Iter 216 | Best: -6.448281 | Rate: 0.47 | Evals: 75.3%
Iter 217 | Best: -6.448281 | Curr: -6.375596 | Rate: 0.47 | Evals: 75.7%
Iter 218 | Best: -6.448281 | Curr: -1.957119 | Rate: 0.47 | Evals: 76.0%
Iter 219 | Best: -6.448281 | Curr: -2.534268 | Rate: 0.47 | Evals: 76.3%
Iter 220 | Best: -6.475155 | Rate: 0.48 | Evals: 76.7%
Iter 221 | Best: -6.475155 | Curr: -2.775557 | Rate: 0.47 | Evals: 77.0%
Iter 222 | Best: -6.475155 | Curr: -2.526853 | Rate: 0.47 | Evals: 77.3%
Iter 223 | Best: -6.475155 | Curr: -3.168341 | Rate: 0.46 | Evals: 77.7%
Iter 224 | Best: -6.475155 | Curr: -3.237866 | Rate: 0.46 | Evals: 78.0%
Iter 225 | Best: -6.475155 | Curr: -6.472036 | Rate: 0.45 | Evals: 78.3%
Iter 226 | Best: -6.475155 | Curr: -2.535189 | Rate: 0.45 | Evals: 78.7%
Iter 227 | Best: -6.475155 | Curr: -3.267316 | Rate: 0.45 | Evals: 79.0%
Iter 228 | Best: -6.475155 | Curr: -2.541259 | Rate: 0.45 | Evals: 79.3%
Iter 229 | Best: -6.532354 | Rate: 0.45 | Evals: 79.7%
Iter 230 | Best: -6.532354 | Curr: -2.775881 | Rate: 0.44 | Evals: 80.0%
Iter 231 | Best: -6.535906 | Rate: 0.44 | Evals: 80.3%
Iter 232 | Best: -6.535906 | Curr: -3.273150 | Rate: 0.43 | Evals: 80.7%
Iter 233 | Best: -6.535906 | Curr: -1.887555 | Rate: 0.42 | Evals: 81.0%
Iter 234 | Best: -6.535906 | Curr: -1.910663 | Rate: 0.41 | Evals: 81.3%
Iter 235 | Best: -6.535906 | Curr: -2.779849 | Rate: 0.41 | Evals: 81.7%
Iter 236 | Best: -6.535906 | Curr: -3.263569 | Rate: 0.40 | Evals: 82.0%
Iter 237 | Best: -6.535906 | Curr: -6.457111 | Rate: 0.39 | Evals: 82.3%
Iter 238 | Best: -6.535906 | Curr: -6.524416 | Rate: 0.39 | Evals: 82.7%
Iter 239 | Best: -6.547474 | Rate: 0.40 | Evals: 83.0%
Iter 240 | Best: -6.547474 | Curr: -2.777997 | Rate: 0.40 | Evals: 83.3%
Iter 241 | Best: -6.547474 | Curr: -3.344208 | Rate: 0.39 | Evals: 83.7%
Iter 242 | Best: -6.547474 | Curr: -6.546095 | Rate: 0.38 | Evals: 84.0%
Iter 243 | Best: -6.547474 | Curr: -2.797371 | Rate: 0.38 | Evals: 84.3%
Iter 244 | Best: -6.587038 | Rate: 0.38 | Evals: 84.7%
Iter 245 | Best: -6.587038 | Curr: -6.584563 | Rate: 0.38 | Evals: 85.0%
Iter 246 | Best: -6.587038 | Curr: -1.129636 | Rate: 0.38 | Evals: 85.3%
Iter 247 | Best: -6.596976 | Rate: 0.38 | Evals: 85.7%
Iter 248 | Best: -6.596976 | Curr: -6.589330 | Rate: 0.37 | Evals: 86.0%
Iter 249 | Best: -6.596976 | Curr: -6.574176 | Rate: 0.36 | Evals: 86.3%
Iter 250 | Best: -6.596976 | Curr: -2.805781 | Rate: 0.35 | Evals: 86.7%
Iter 251 | Best: -6.597843 | Rate: 0.35 | Evals: 87.0%
Iter 252 | Best: -6.597843 | Curr: -2.525862 | Rate: 0.35 | Evals: 87.3%
Iter 253 | Best: -6.597843 | Curr: -3.387525 | Rate: 0.34 | Evals: 87.7%
Iter 254 | Best: -6.639627 | Rate: 0.35 | Evals: 88.0%
Iter 255 | Best: -6.639627 | Curr: -3.369866 | Rate: 0.35 | Evals: 88.3%
Iter 256 | Best: -6.657587 | Rate: 0.36 | Evals: 88.7%
Iter 257 | Best: -6.662785 | Rate: 0.37 | Evals: 89.0%
Iter 258 | Best: -6.662785 | Curr: -6.647518 | Rate: 0.37 | Evals: 89.3%
Iter 259 | Best: -6.662785 | Curr: -1.996392 | Rate: 0.36 | Evals: 89.7%
Iter 260 | Best: -6.693279 | Rate: 0.37 | Evals: 90.0%
Iter 261 | Best: -6.693279 | Curr: -2.443848 | Rate: 0.37 | Evals: 90.3%
Iter 262 | Best: -6.695190 | Rate: 0.38 | Evals: 90.7%
Iter 263 | Best: -6.695197 | Rate: 0.38 | Evals: 91.0%
Iter 264 | Best: -6.695197 | Curr: -2.855366 | Rate: 0.37 | Evals: 91.3%
Iter 265 | Best: -6.695197 | Curr: -6.695157 | Rate: 0.37 | Evals: 91.7%
Iter 266 | Best: -6.695197 | Curr: -2.864327 | Rate: 0.36 | Evals: 92.0%
Iter 267 | Best: -6.695197 | Curr: -3.457031 | Rate: 0.36 | Evals: 92.3%
Iter 268 | Best: -6.699930 | Rate: 0.36 | Evals: 92.7%
Iter 269 | Best: -6.699930 | Curr: -2.520308 | Rate: 0.36 | Evals: 93.0%
Iter 270 | Best: -6.699930 | Curr: -3.488428 | Rate: 0.36 | Evals: 93.3%
Iter 271 | Best: -6.724062 | Rate: 0.37 | Evals: 93.7%
Iter 272 | Best: -6.725705 | Rate: 0.38 | Evals: 94.0%
Iter 273 | Best: -6.725705 | Curr: -6.661926 | Rate: 0.38 | Evals: 94.3%
Iter 274 | Best: -6.728063 | Rate: 0.39 | Evals: 94.7%
Iter 275 | Best: -6.732919 | Rate: 0.40 | Evals: 95.0%
Iter 276 | Best: -6.732919 | Curr: -2.865333 | Rate: 0.40 | Evals: 95.3%
Iter 277 | Best: -6.732919 | Curr: -2.961175 | Rate: 0.40 | Evals: 95.7%
Iter 278 | Best: -6.733197 | Rate: 0.40 | Evals: 96.0%
Iter 279 | Best: -6.740444 | Rate: 0.40 | Evals: 96.3%
Iter 280 | Best: -6.740444 | Curr: -3.533983 | Rate: 0.40 | Evals: 96.7%
Iter 281 | Best: -6.740444 | Curr: -3.556964 | Rate: 0.39 | Evals: 97.0%
Iter 282 | Best: -6.741447 | Rate: 0.39 | Evals: 97.3%
Iter 283 | Best: -6.741447 | Curr: -3.554608 | Rate: 0.38 | Evals: 97.7%
Iter 284 | Best: -6.741447 | Curr: -3.594427 | Rate: 0.38 | Evals: 98.0%
Iter 285 | Best: -6.741447 | Curr: -3.718281 | Rate: 0.37 | Evals: 98.3%
Iter 286 | Best: -6.742886 | Rate: 0.37 | Evals: 98.7%
Iter 287 | Best: -6.742886 | Curr: -2.992121 | Rate: 0.37 | Evals: 99.0%
Iter 288 | Best: -6.742886 | Curr: -3.874328 | Rate: 0.37 | Evals: 99.3%
Iter 289 | Best: -6.742902 | Rate: 0.38 | Evals: 99.7%
Iter 290 | Best: -6.742902 | Curr: -1.944843 | Rate: 0.37 | Evals: 100.0%
print(f"[10D] Sklearn Kriging: min y = {result_micha.fun:.4f} at x = {result_micha.x}")
print(f"Number of function evaluations: {result_micha.nfev}")
print(f"Number of iterations: {result_micha.nit}")[10D] Sklearn Kriging: min y = -6.7429 at x = [2.23898704 2.72731853 2.21790626 2.4875217 2.62895197 1.93373346
2.22237879 1.36219549 1.28254757 1.21633643]
Number of function evaluations: 300
Number of iterations: 290
5.2.4 Visualize Optimization Progress
import matplotlib.pyplot as plt
# Plot the optimization progress
plt.figure(figsize=(10, 6))
plt.plot(np.minimum.accumulate(opt_micha.y_), 'b-', linewidth=2)
plt.xlabel('Function Evaluations', fontsize=12)
plt.ylabel('Best Objective Value', fontsize=12)
plt.title('10D Michalewicz: Sklearn Kriging Progress', fontsize=14)
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.show()
5.2.5 Evaluation of Multiple Repeats
To perform 30 repeats and collect statistics:
# Perform 30 independent runs
n_repeats = 30
results = []
print(f"Running {n_repeats} independent optimizations...")
for i in range(n_repeats):
kernel_i = ConstantKernel(1.0, (1e-2, 1e12)) * Matern(
length_scale=1.0,
length_scale_bounds=(1e-4, 1e2),
nu=2.5
)
surrogate_i = GaussianProcessRegressor(kernel=kernel_i, n_restarts_optimizer=100)
opt_i = SpotOptim(
fun=fun,
bounds=bounds,
n_initial=n_initial,
max_iter=max_iter,
surrogate=surrogate_i,
seed=seed + i, # Different seed for each run
verbose=0
)
result_i = opt_i.optimize()
results.append(result_i.fun)
if (i + 1) % 10 == 0:
print(f" Completed {i + 1}/{n_repeats} runs")
# Compute statistics
mean_result = np.mean(results)
std_result = np.std(results)
min_result = np.min(results)
max_result = np.max(results)
print(f"\nResults over {n_repeats} runs:")
print(f" Mean of best values: {mean_result:.6f}")
print(f" Std of best values: {std_result:.6f}")
print(f" Min of best values: {min_result:.6f}")
print(f" Max of best values: {max_result:.6f}")5.3 Comparison: SpotOptim vs SpotPython
The SpotOptim package provides a scipy-compatible interface for Bayesian optimization with the following key features:
- Scipy-compatible API: Returns
OptimizeResultobjects that work seamlessly with scipy’s optimization ecosystem - Custom Surrogates: Supports any sklearn-compatible surrogate model (as demonstrated with GaussianProcessRegressor)
- Flexible Interface: Simplified parameter specification with bounds, n_initial, and max_iter
- Analytical Test Functions: Built-in test functions (rosenbrock, ackley, michalewicz) for benchmarking
The main differences from spotpython are:
- SpotOptim: Uses
bounds,n_initial,max_iterparameters with scipy-style interface - SpotPython: Uses
fun_control,design_control,surrogate_controlwith more complex configuration
Both packages support custom surrogates and provide powerful Bayesian optimization capabilities.
5.4 Summary
This notebook demonstrated how to:
- Use
SpotOptimwith sklearn’s Gaussian Process Regressor (Matern kernel) as a surrogate - Optimize 6D Rosenbrock function with 100 evaluations
- Optimize 10D Michalewicz function with 300 evaluations
- Visualize optimization progress
- Perform multiple independent runs for statistical analysis
The results show that SpotOptim with sklearn surrogates provides effective Bayesian optimization for challenging benchmark functions.
5.5 Jupyter Notebook
- The Jupyter-Notebook of this chapter is available on GitHub in the Sequential Parameter Optimization Cookbook Repository