|
1 | 1 | from __future__ import print_function
|
2 | 2 | from __future__ import division
|
3 | 3 | import unittest
|
| 4 | +import numpy as np |
4 | 5 | from sklearn.gaussian_process import GaussianProcessRegressor
|
5 | 6 | from sklearn.gaussian_process.kernels import Matern
|
| 7 | +import sys |
| 8 | +sys.path.append("./") |
| 9 | +from bayes_opt.helpers import UtilityFunction, acq_max |
| 10 | + |
| 11 | + |
| 12 | +def get_globals(): |
| 13 | + X = np.array([ |
| 14 | + [0.00, 0.00], |
| 15 | + [0.99, 0.99], |
| 16 | + [0.00, 0.99], |
| 17 | + [0.99, 0.00], |
| 18 | + [0.50, 0.50], |
| 19 | + [0.25, 0.50], |
| 20 | + [0.50, 0.25], |
| 21 | + [0.75, 0.50], |
| 22 | + [0.50, 0.75], |
| 23 | + ]) |
| 24 | + |
| 25 | + def get_y(X): |
| 26 | + return -(X[:, 0] - 0.3) ** 2 - 0.5 * (X[:, 1] - 0.6)**2 + 2 |
| 27 | + y = get_y(X) |
| 28 | + |
| 29 | + mesh = np.dstack( |
| 30 | + np.meshgrid(np.arange(0, 1, 0.01), np.arange(0, 1, 0.01)) |
| 31 | + ).reshape(-1, 2) |
| 32 | + |
| 33 | + GP = GaussianProcessRegressor( |
| 34 | + kernel=Matern(), |
| 35 | + n_restarts_optimizer=25, |
| 36 | + ) |
| 37 | + GP.fit(X, y) |
| 38 | + |
| 39 | + return {'x': X, 'y': y, 'gp': GP, 'mesh': mesh} |
| 40 | + |
| 41 | + |
| 42 | +def brute_force_maximum(MESH, GP, kind='ucb', kappa=1.0, xi=1e-6): |
| 43 | + uf = UtilityFunction(kind=kind, kappa=kappa, xi=xi) |
| 44 | + |
| 45 | + mesh_vals = uf.utility(MESH, GP, 2) |
| 46 | + max_val = mesh_vals.max() |
| 47 | + max_arg_val = MESH[np.argmax(mesh_vals)] |
| 48 | + |
| 49 | + return max_val, max_arg_val |
| 50 | + |
| 51 | + |
| 52 | +GLOB = get_globals() |
| 53 | +X, Y, GP, MESH = GLOB['x'], GLOB['y'], GLOB['gp'], GLOB['mesh'] |
6 | 54 |
|
7 | 55 |
|
8 | 56 | class TestMaximizationOfAcquisitionFunction(unittest.TestCase):
|
9 | 57 |
|
10 |
| - def setUp(self, msg=""): |
11 |
| - self.gp = GaussianProcessRegressor( |
12 |
| - kernel=Matern(), |
13 |
| - n_restarts_optimizer=25, |
| 58 | + def setUp(self, kind='ucb', kappa=1.0, xi=1e-6): |
| 59 | + self.util = UtilityFunction(kind=kind, kappa=kappa, xi=xi) |
| 60 | + self.episilon = 1e-2 |
| 61 | + self.y_max = 2.0 |
| 62 | + |
| 63 | + def test_acq_max_function_with_ucb_algo(self): |
| 64 | + self.setUp(kind='ucb', kappa=1.0, xi=1.0) |
| 65 | + max_arg = acq_max( |
| 66 | + self.util.utility, GP, self.y_max, bounds=np.array([[0, 1], [0, 1]]) |
14 | 67 | )
|
| 68 | + _, brute_max_arg = brute_force_maximum(MESH, GP) |
15 | 69 |
|
16 |
| - X = np.array([ |
17 |
| - [1, 2], |
18 |
| - [2, 3], |
19 |
| - [0, -1], |
20 |
| - ]) |
| 70 | + self.assertTrue( all(abs(brute_max_arg - max_arg) < self.episilon)) |
21 | 71 |
|
22 |
| - y = X[:, 0]**2 - 2 * X[:, 1] |
| 72 | + def test_ei_max_function_with_ucb_algo(self): |
| 73 | + self.setUp(kind='ei', kappa=1.0, xi=1e-6) |
| 74 | + max_arg = acq_max( |
| 75 | + self.util.utility, GP, self.y_max, bounds=np.array([[0, 1], [0, 1]]) |
| 76 | + ) |
| 77 | + _, brute_max_arg = brute_force_maximum(MESH, GP, kind='ei') |
23 | 78 |
|
24 |
| - def test_something(self): |
25 |
| - pass |
| 79 | + self.assertTrue( all(abs(brute_max_arg - max_arg) < self.episilon)) |
26 | 80 |
|
27 | 81 |
|
28 | 82 | if __name__ == '__main__':
|
|
0 commit comments