From 55a1310e1ab95448cf3c19d7a0a0f07b507ba83b Mon Sep 17 00:00:00 2001 From: stm Date: Mon, 7 Mar 2016 09:21:17 +0100 Subject: [PATCH 1/3] Instead of minimizing the acquisition function at 100 random starting points the minimum of 100k random points is selected. --- bayes_opt/bayesian_optimization.py | 54 ++++++++++++++++++------------ bayes_opt/helpers.py | 14 ++++++-- 2 files changed, 45 insertions(+), 23 deletions(-) diff --git a/bayes_opt/bayesian_optimization.py b/bayes_opt/bayesian_optimization.py index 09881926e..ffa3d58e6 100644 --- a/bayes_opt/bayesian_optimization.py +++ b/bayes_opt/bayesian_optimization.py @@ -8,7 +8,7 @@ __author__ = 'fmfn' -def acq_max(ac, gp, y_max, bounds): +def acq_max(ac, gp, y_max, bounds, test_random_points): """ A function to find the maximum of the acquisition function using the 'L-BFGS-B' method. @@ -33,24 +33,33 @@ def acq_max(ac, gp, y_max, bounds): :return: x_max, The arg max of the acquisition function. """ - # Start with the lower bound as the argmax - x_max = bounds[:, 0] - max_acq = None - - x_tries = np.random.uniform(bounds[:, 0], bounds[:, 1], - size=(100, bounds.shape[0])) - - for x_try in x_tries: - # Find the minimum of minus the acquisition function - res = minimize(lambda x: -ac(x.reshape(1, -1), gp=gp, y_max=y_max), - x_try.reshape(1, -1), - bounds=bounds, - method="L-BFGS-B") - - # Store it if better than previous minimum(maximum). - if max_acq is None or -res.fun >= max_acq: - x_max = res.x - max_acq = -res.fun + if test_random_points: + x_tries = np.random.uniform(bounds[:, 0], bounds[:, 1], + size=(100000, bounds.shape[0])) + + ys = ac(x_tries, gp=gp, y_max=y_max) + + + x_max = x_tries[ys.argmax()] + else: + # Start with the lower bound as the argmax + x_max = bounds[:, 0] + max_acq = None + + x_tries = np.random.uniform(bounds[:, 0], bounds[:, 1], + size=(100, bounds.shape[0])) + + for x_try in x_tries: + # Find the minimum of minus the acquisition function + res = minimize(lambda x: -ac(x.reshape(1, -1), gp=gp, y_max=y_max), + x_try.reshape(1, -1), + bounds=bounds, + method="L-BFGS-B") + + # Store it if better than previous minimum(maximum). + if max_acq is None or -res.fun >= max_acq: + x_max = res.x + max_acq = -res.fun # Clip output to make sure it lies within the bounds. Due to floating # point technicalities this is not always the case. @@ -242,6 +251,7 @@ def maximize(self, n_iter=25, acq='ucb', kappa=2.576, + test_random_points=False, **gp_params): """ Main optimization method. @@ -293,7 +303,8 @@ def maximize(self, x_max = acq_max(ac=self.util.utility, gp=self.gp, y_max=y_max, - bounds=self.bounds) + bounds=self.bounds, + test_random_points=test_random_points) # Print new header if self.verbose: @@ -332,7 +343,8 @@ def maximize(self, x_max = acq_max(ac=self.util.utility, gp=self.gp, y_max=y_max, - bounds=self.bounds) + bounds=self.bounds, + test_random_points=test_random_points) # Print stuff if self.verbose: diff --git a/bayes_opt/helpers.py b/bayes_opt/helpers.py index 03ec53fd8..4ffdf7c4b 100644 --- a/bayes_opt/helpers.py +++ b/bayes_opt/helpers.py @@ -15,7 +15,7 @@ def __init__(self, kind='ucb', kappa=1.96): If UCB is to be used, a constant kappa is needed. """ self.kappa = kappa - + if kind not in ['ucb', 'ei', 'poi']: err = "The utility function " \ "{} has not been implemented, " \ @@ -39,7 +39,17 @@ def _ucb(x, gp, kappa): @staticmethod def _ei(x, gp, y_max): - mean, var = gp.predict(x, eval_MSE=True) + #mean, var = gp.predict(x, eval_MSE=True) + + cuts = list(range(0, len(x), 1000)) + [len(x)] + + mean, var = [], [] + for a, b in zip(cuts, cuts[1:]): + m, v = gp.predict(x[a:b], eval_MSE=True) + mean += m + var += v + mean = np.concatenate(mean) + var = np.concatenate(var) # Avoid points with zero variance var = np.maximum(var, 1e-9 + 0 * var) From bfac53eb8b169399186226022b96da1653ad165c Mon Sep 17 00:00:00 2001 From: stm Date: Mon, 7 Mar 2016 09:44:59 +0100 Subject: [PATCH 2/3] adjusted POI and UCB acquisition functions to use batch-wise predictions --- bayes_opt/helpers.py | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/bayes_opt/helpers.py b/bayes_opt/helpers.py index 4ffdf7c4b..89fd022f8 100644 --- a/bayes_opt/helpers.py +++ b/bayes_opt/helpers.py @@ -34,22 +34,12 @@ def utility(self, x, gp, y_max): @staticmethod def _ucb(x, gp, kappa): - mean, var = gp.predict(x, eval_MSE=True) + mean, var = self._gp_predict(gp, x) return mean + kappa * np.sqrt(var) @staticmethod def _ei(x, gp, y_max): - #mean, var = gp.predict(x, eval_MSE=True) - - cuts = list(range(0, len(x), 1000)) + [len(x)] - - mean, var = [], [] - for a, b in zip(cuts, cuts[1:]): - m, v = gp.predict(x[a:b], eval_MSE=True) - mean += m - var += v - mean = np.concatenate(mean) - var = np.concatenate(var) + mean, var = self._gp_predict(gp, x) # Avoid points with zero variance var = np.maximum(var, 1e-9 + 0 * var) @@ -59,7 +49,7 @@ def _ei(x, gp, y_max): @staticmethod def _poi(x, gp, y_max): - mean, var = gp.predict(x, eval_MSE=True) + mean, var = self._gp_predict(gp, x) # Avoid points with zero variance var = np.maximum(var, 1e-9 + 0 * var) @@ -67,6 +57,23 @@ def _poi(x, gp, y_max): z = (mean - y_max)/np.sqrt(var) return norm.cdf(z) + @staticmethod + def _gp_predict(gp, x): + # gp.predict takes a lot of memory, so we feed batches to it. + # gp.predict(x, batch_size=1000) would be preferable, but that + # doesn't work with python 3 as of sklearn 0.17.1. + cuts = list(range(0, len(x), 1000)) + [len(x)] + + mean, var = [], [] + for a, b in zip(cuts, cuts[1:]): + m, v = gp.predict(x[a:b], eval_MSE=True) + mean += m + var += v + mean = np.concatenate(mean) + var = np.concatenate(var) + + return mean, var + def unique_rows(a): """ From 032ad2aa229607a915516c7fe051512e8ec9c8c5 Mon Sep 17 00:00:00 2001 From: stm Date: Mon, 7 Mar 2016 13:14:45 +0100 Subject: [PATCH 3/3] bugfixes and example notebook --- bayes_opt/bayesian_optimization.py | 3 +- bayes_opt/helpers.py | 35 +-- .../acquisition function optimization.ipynb | 215 ++++++++++++++++++ 3 files changed, 234 insertions(+), 19 deletions(-) create mode 100644 examples/acquisition function optimization.ipynb diff --git a/bayes_opt/bayesian_optimization.py b/bayes_opt/bayesian_optimization.py index ffa3d58e6..e5acb8be8 100644 --- a/bayes_opt/bayesian_optimization.py +++ b/bayes_opt/bayesian_optimization.py @@ -35,10 +35,9 @@ def acq_max(ac, gp, y_max, bounds, test_random_points): if test_random_points: x_tries = np.random.uniform(bounds[:, 0], bounds[:, 1], - size=(100000, bounds.shape[0])) + size=(test_random_points, bounds.shape[0])) ys = ac(x_tries, gp=gp, y_max=y_max) - x_max = x_tries[ys.argmax()] else: diff --git a/bayes_opt/helpers.py b/bayes_opt/helpers.py index 89fd022f8..dabd51e83 100644 --- a/bayes_opt/helpers.py +++ b/bayes_opt/helpers.py @@ -34,12 +34,12 @@ def utility(self, x, gp, y_max): @staticmethod def _ucb(x, gp, kappa): - mean, var = self._gp_predict(gp, x) + mean, var = UtilityFunction._gp_predict(gp, x) return mean + kappa * np.sqrt(var) @staticmethod def _ei(x, gp, y_max): - mean, var = self._gp_predict(gp, x) + mean, var = UtilityFunction._gp_predict(gp, x) # Avoid points with zero variance var = np.maximum(var, 1e-9 + 0 * var) @@ -49,7 +49,7 @@ def _ei(x, gp, y_max): @staticmethod def _poi(x, gp, y_max): - mean, var = self._gp_predict(gp, x) + mean, var = UtilityFunction._gp_predict(gp, x) # Avoid points with zero variance var = np.maximum(var, 1e-9 + 0 * var) @@ -59,20 +59,21 @@ def _poi(x, gp, y_max): @staticmethod def _gp_predict(gp, x): - # gp.predict takes a lot of memory, so we feed batches to it. - # gp.predict(x, batch_size=1000) would be preferable, but that - # doesn't work with python 3 as of sklearn 0.17.1. - cuts = list(range(0, len(x), 1000)) + [len(x)] - - mean, var = [], [] - for a, b in zip(cuts, cuts[1:]): - m, v = gp.predict(x[a:b], eval_MSE=True) - mean += m - var += v - mean = np.concatenate(mean) - var = np.concatenate(var) - - return mean, var + if len(x) == 1: + return gp.predict(x, eval_MSE=True) + else: + # gp.predict takes a lot of memory, so we feed batches to it. + # gp.predict(x, batch_size=1000) would be preferable, but that + # doesn't work with python 3 as of sklearn 0.17.1. + cuts = list(range(0, len(x), 1000)) + [len(x)] + + mean, var = [], [] + for a, b in zip(cuts, cuts[1:]): + m, v = gp.predict(x[a:b], eval_MSE=True) + mean.append(m) + var.append(v) + + return np.concatenate(mean), np.concatenate(var) def unique_rows(a): diff --git a/examples/acquisition function optimization.ipynb b/examples/acquisition function optimization.ipynb new file mode 100644 index 000000000..ff3df6673 --- /dev/null +++ b/examples/acquisition function optimization.ipynb @@ -0,0 +1,215 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Acquisition Function Optimization" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "%matplotlib inline\n", + "\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "\n", + "from bayes_opt import BayesianOptimization\n", + "\n", + "# use sklearn's default parameters for theta and random_start\n", + "gp_params = {\"corr\": \"cubic\", \"theta0\": 0.1, \"thetaL\": None, \"thetaU\": None, \"random_start\": 1}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Target function" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYEAAAEACAYAAABVtcpZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xm81nP+//HHq02YpBgiCuNnF0KWwqksxzLWkOzGMka2\nGSMMykxM9ZU9S2RXSaU9pXIyIbIWEyqGCjVpUUZpef/+eF3VcZzOuTrnc12f67o+z/vtdm7OdZ3P\n9f68rk/HeV2f9/J6WwgBERFJphpxByAiIvFREhARSTAlARGRBFMSEBFJMCUBEZEEUxIQEUmwSpOA\nmfUxs3lmNrWCY4rM7AMz+9jMXos2RBERyRSrbJ2AmbUClgHPhhCalfPz+sCbwLEhhLlmtnUIYUFG\nohURkUhVeicQQpgELKrgkA7AoBDC3NTxSgAiInkiijGB3YCGZvaamU0xs/MjaFNERLKgVkRtNAfa\nAJsDb5nZWyGEmRG0LSIiGRRFEpgDLAghLAeWm9nrwH7Ar5KAmalQkYhIFYQQLBPtptsdZKmv8gwF\nWplZTTPbDDgEmL6hhkII+gqBzp07xx5DrnzpWuha6FpU/JVJld4JmFlfoAjYysy+BjoDdfzveegd\nQvjUzMYAU4HVQO8Qwr8zGLOIiESk0iQQQuiQxjF3A3dHEpGIiGSNVgzHpKioKO4QcoauxXq6Fuvp\nWmRHpYvFIj2ZWcjm+URECoGZEWIeGBYRkQKkJCAikmBKAiIiCaYkICKSYEoCIiIJpiQgIpJgSgIi\nIgmmJCAikmBKAiIiCaYkICKSYEoCIiIJpiQgIpJgSgIiIgmmJCAikmBKAiIiCaYkICKSYEoCIiIJ\npiQgIpJgSgIiIgmmJCAikmBKAiIiCVZpEjCzPmY2z8ymVnLcwWa20sxOjy48ERHJpHTuBJ4Cjqvo\nADOrAXQDxkQRlIiIZEelSSCEMAlYVMlhVwMDgflRBCUiItlR7TEBM9seODWE8Ahg1Q9Jcs2iRTB2\nLLz9NqxeHXc0IhKlWhG0cR/QqdTjChNBly5d1n1fVFREUVFRBCFIJoQAPXpA9+6w337w/ffw88/w\nzDNwyCFxRydSuEpKSigpKcnKuSyEUPlBZk2B4SGEZuX87Iu13wJbAz8Cl4cQhpVzbEjnfBK/EOBP\nf4L334cBA6BpU39+4EC48kp46SVQ/hbJDjMjhJCRnpZ07wSMDXzCDyHssu4gs6fwZPGrBCD55YEH\n4M03YdIkqFdv/fPt2kGDBtC+vXcPrU0OIpKfKr0TMLO+QBGwFTAP6AzUAUIIoXeZY58ERoQQBm+g\nLd0J5IHPPoOWLWHKFNh55/KPuesueP11GD0aTCNBIhmVyTuBtLqDIjuZkkDOCwHatIHTToNrrtnw\ncStXQvPmcPvtcOaZ2YtPJIkymQS0Ylh+YcwYmDcPrrqq4uNq14Z77oFbb4VVq7ITm4hET0lA1gkB\nbrsN7rgDatas/Pijj4Ztt4W+fTMfm4hkhpKArDNmDKxYAWeckd7xZt4d1KOHJxARyT9KArLOAw/A\n9ddDjY34rWjb1hPAa69lLi4RyRwlAQFgxgx4912f+rkxzODqq+HBBzMTl4hklmYHCQDXXQebbgr/\n/OfGv/bHH2HHHeGTT2C77aKPTSTpNEVUMurnn2H77f1OYKedqtbGJZfA3nvDX/4SaWgigqaISoaN\nGuV/wKuaAAAuuACefTaykEQkS5QEhOeeg/PPr14bRx4JixfD1Aq3HhKRXKPuoIRbuNBLQ3z1FWy5\nZfXauuUWLzXdvXs0sYmIU3eQZMxLL0FxcfUTAHhxucGDtWZAJJ8oCSTcSy/B2WdH09YBB3hNoU8+\niaY9Eck8JYEE+/57rxRaXBxNe2ZeeG5wuTVkRSQXKQkk2PDhvuJ3s82ia/O00+Dll6NrT0QyS0kg\nwV5+GU4/Pdo2W7aEb76BL7+Mtl0RyQwlgYRatszr/Zx0UrTt1qwJJ5wAI0dG266IZIaSQEKNHg2H\nHRbNrKCyjj/e2xeR3KckkFCDB3v/fSYccwz861+wfHlm2heR6CgJJNCqVb53wO9/n5n2GzSAZs18\nD2IRyW1KAgn09tte9bNx48ydo7hYXUIi+UBJIIFGj/Z++0zSuIBIflASSKBsJIEDDoBFizRVVCTX\nKQkkzHffwaxZcPjhmT1PjRpw7LHw6quZPY+IVE+lScDM+pjZPDMrt0iwmXUws49SX5PMbN/ow5So\nvPIKHH001K6d+XO1bQsTJmT+PCJSdencCTwFHFfBz78Ajgwh7Ad0BR6PIjDJjGx0Ba3VurUngTVr\nsnM+Edl4lSaBEMIkYFEFP58cQliSejgZyOCcE6mOVau8eyaqgnGVadoUtthCVUVFclnUYwKXApoT\nkqOyMTW0rLZtYfz47J1PRDZOragaMrPWwMVAq4qO69Kly7rvi4qKKCoqiioEqUQ2u4LWatMGXngB\nrrsuu+cVyWclJSWUlJRk5VxpbS9pZk2B4SGEZhv4eTNgEFAcQphVQTvaXjJGBx4I99wDRx2VvXPO\nnw+77QYLFkCtyD5yiCRLLmwvaamvX//ArAmeAM6vKAFIvLI1NbSsbbaBJk3gvfeye14RSU+ln83M\nrC9QBGxlZl8DnYE6QAgh9AZuAxoCD5uZAStDCC0yF7JUxZgx3j+fjamhZa0dFzjkkOyfW0QqllZ3\nUGQnU3dQbNq39/UBl16a/XMPHw733w/jxmX/3CKFIJPdQUoCCbBqFWy7LUydmt2ZQWstWeLnXbAA\n6tbN/vlF8l0ujAlIHnvnHf8jHEcCAKhfH/bay6eoikhuURJIgDimhpbVurVvZykiuUVJIAFeeUVJ\nQETKpzGBArd2nv78+VCnTnxxLFsGjRrBf/8Lm24aXxwi+UhjAlJlY8f6p/A4EwDAb37jW06++Wa8\ncYjILykJFLhcGA9YS11CIrlHSaCArV7tdwLZqhpaGSUBkdyjJFDA3ntvfdmGXHD44fDRRz4+ICK5\nQUmggI0enTt3AQCbbQbNm8Mbb8QdiYispSRQwHJhamhZ6hISyS1KAgXq++99R68jjog7kl8qKlIS\nEMklSgIF6tVXfd+ATTaJO5JfOuwwT04//BB3JCICSgIFa+TI3OsKAi8gd/DB8K9/xR2JiICSQEFa\ntQpGjYKTT447kvJpXEAkdygJFKA33oCddoIddog7kvK1bg1Z2j5VRCqhJFCAhg7N3bsAgBYt4LPP\nYPHiuCMRESWBAhMCDBsGp5wSdyQbtskmcOih8PrrcUciIkoCEVu1Ctasie/806fDzz/DfvvFF0M6\nNC4gkhuUBCIybpx3c9StCw0bwmWXwbx52Y9j2DDvCrKMFJ2NjpKASG5QEohAr15w0UVwyy2wfLn3\nd2+5pZdIeO+97MYyZEhujwesddBB8MUXvqhNROKjTWWqadgw6NjR+7d32umXP3v5ZfjjH33hVrNm\nmY/lP//xOfjffAO1a2f+fNV1/PF+x3T66XFHIpLbMrmpTK1MNJoU337rf8SGDPl1AgA47TT46Sf/\n75Qp3k2USQMG+LnyIQHA+i4hJYForF4Ns2b5neisWbBwISxZ4l2Dm24KDRr47+nvfgf77hv/RkOS\nGyq9EzCzPsBJwLwQQrmfZ83sAeB44EfgohDChxs4rqDuBC66yLdM7Nat4uP+/Gf/n3LIkMz21R94\nIPToAW3bZu4cUZoyBS6+GD7+OO5I8tfXX8OgQTBhgq/CbtAA9tgDdt0VttoK6tf34376yZPCl1/C\njBn++7j//nDMMf7BoVmz3B9HSrJM3gmkkwRaAcuAZ8tLAmZ2PNAxhHCimR0C3B9COHQDbRVMEpgy\nBU49FT79FOrVq/jYFSu8m+bGG+G88zITz8yZ0LIlzJ0LtfLk/m7VKth6a/j8c9/3QNKzfDn06wd9\n+vhssNNOg+OOgyOPhG23Ta+NpUvhnXd8ZfngwX73eMUVnpQzfccqGy/WPYZDCJOARRUccgrwbOrY\nt4H6Zpbmr2L+uvNOuPnmyhMA+Lz4p5/2O4Jvv81MPC++CO3a5U8CAI/1iCO0ejhdS5bA3//uXTov\nvgidOvnv0xNPwJlnpp8AwH9v27aFnj19gP7pp+HDD2GXXeCaazL3eyq5J4rZQY2B2aUez009V7D+\n/W946y245JL0X9O8OVx6KdxwQ/TxhADPPgvnnht925mmqaKVW7EC7rsPdtvNu3EmTPC9In7/+2j6\n9c1817fnnvM725o1Ye+9/c516dLqty+5LeufG7t06bLu+6KiIoqKirIdQrXdfTdcfbXvlLUx/vY3\n2HNPmDjRyzxH5Y03oEYNL9Ocb1q3ht69444id02Y4N00u+/ua1H23Tez52vUCO691z+srP19vfde\nv8vUmEH2lJSUUJKlW+S0poiaWVNg+AbGBB4FXgshvJh6/ClwVAjhV0ulCmFMYMkSaNq06v3YL73k\nt/Tvvx/dLJ5LLvH/Wf/612jay6Y1a3xc4OOPYfvt444mdyxcCH/5iyeBXr3gpJPiiWPSJLjySth5\nZ+920thNPGIdE1gbQ+qrPMOACwDM7FBgcXkJoFD06wdHH131/xnatfO+24cfjiaepUt9PcIFF0TT\nXrbVqOF3RRoXWO/1133mTr16nhzjSgAArVr5gse99/aYRo2KLxbJjHRmB/UFioCtgHlAZ6AOEEII\nvVPHPAQU41NELw4hvL+BtvL+TuCgg3xQ+Ljjqt7G9Ok+k2PqVNhuu+rF06uXf1ocNKh67cTpgQdg\n2jR4/PG4I4nX6tXQtSs8+ig8+WTubQr0+utw/vnQoYPHWbNm3BElR6xTRCM9WZ4ngalT/VPZl19W\n/3+Am2/2Fb79+lW9jdWrva/4mWd8emi+mjbNpznOnBl3JPFZtAjat/dps88/X/0PB5myYAGcdZbP\neOvb19clSOblQneQ4NPyzjknmk9At90Gkyd7SYmqGj7cFwQdfnj144nT3nv73gKzZ1d+bCH6/HMv\nrb3nnjBmTO4mAPDxm7FjfUFaixbJTtyFQkkgTSF4WYazzoqmvc02gwcfhKuu8sU/VYnnn//0wcN8\nn7VRowYUFSVzquj48d7vfsMNPg00H9Z51KrlM4b++lfv1sx2kUSJlpJAmj780GeyNG8eXZsnneSf\ngrt33/jXDhniyaNdu+jiiVMS1wsMHOh3lgMGeA2qfHP55T7B4fjjq3dHK/FSEkjTgAG+KjPqT90P\nPOCDuxvzaWrlSp/Dfddd/im6ECQtCfTuDdde610rebhUZp1TT/WyE+ed5xV1Jf8UyJ+QzArB5/dH\n1RVU2o47erfQOefAsmXpvaZnT3/dCSdEH09c9tzT72y+/DLuSDKvWzf/mjjRp13mu1atYORIv5tR\nIsg/SgJp+Phjn4lzwAGZaf/ss72GzsUXV7415bRpvmL5scfyfyygNDP/RFzo6wXuvNNnc02a5JU+\nC8VBBykR5CslgTSMHOn995n8o9urF8yfD9dd53ce5fnvf/32+777yt+/IN8VepdQt25e42nChMJc\nHV06EYwZE3c0ki4lgTSMHAknnpjZc9StC0OHennfc8+FH3745c9nzfJPyueem7ly1HFr3dr/QObx\nUpINuvtuL/08YUJuTwGtroMOWj9G8PbbcUcj6dBisUp8/72X1503z/9QZ9pPP3lxulGj4MILvWbL\nhx/6wHTnzv6zQhWC73o1ZEh2tuPMlgcf9Lu3iRNhhx3ijiY7RozwqrmvvebjPVI9WiwWozFj/BN4\nNhIA+DaATzwBo0f7fOy334YmTeCDDwo7AYB3t/3+974IrlD07eu7vU2YkJwEAN592qMHFBcndxFg\nvtCdQCU6dPBuinycx52Pxo2DW2/11dT5buxYr7Uzfjzss0/c0cTj//7Py2BMmpTeBkxSPtUOismq\nVV7xc+pUaFzQ2+Tkjp9/9gqtn322cTtl5ZopU3wcafBgn0KZVCH4orJ587zarYrOVY26g2IyebLv\nHaAEkD116vjm5/lcsvizz+Dkk30gOMkJALyLr1cvL3l+001xRyPlURKowNix1SsZLVWTz+MC8+d7\nGYU77/T3IZ7YBw3yAf8+feKORspSEqjAuHH+qVSy6/jjvR99xYq4I9k4y5f7Oo7zztu4/aeToGFD\n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\nQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "np.random.seed(42)\n", + "xs = np.linspace(-2, 10, 10000)\n", + "f = np.exp(-(xs - 2)**2) + np.exp(-(xs - 6)**2/10) + 1/ (xs**2 + 1)\n", + "\n", + "plt.plot(f)\n", + "plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Utility function for plotting" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "def plot_bo(f, bo):\n", + " xs = [x[\"x\"] for x in bo.res[\"all\"][\"params\"]]\n", + " ys = bo.res[\"all\"][\"values\"]\n", + "\n", + " mean, var = bo.gp.predict(np.arange(len(f)).reshape(-1, 1), eval_MSE=True)\n", + " \n", + " plt.plot(f)\n", + " plt.plot(np.arange(len(f)), mean)\n", + " plt.fill_between(np.arange(len(f)), mean+var, mean-var, alpha=0.1)\n", + " plt.scatter(bo.X.flatten(), bo.Y, c=\"red\", s=50, zorder=10)\n", + " plt.xlim(0, len(f))\n", + " plt.ylim(f.min()-0.1*(f.max()-f.min()), f.max()+0.1*(f.max()-f.min()))\n", + " plt.show()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Optimization of the acquisition function using scipy.minimize" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": false, + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wall time: 18.2 s\n" + ] + }, + { + "data": { + "image/png": "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\nCCHc2P8BVsncTU7fmTcAAAAASUVORK5CYII=\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "np.random.seed(42)\n", + "\n", + "bo = BayesianOptimization(f=lambda x: f[int(x)],\n", + " pbounds={\"x\": (0, len(f)-1)},\n", + " verbose=0)\n", + "\n", + "%time bo.maximize(init_points=5, n_iter=25, test_random_points=False, acq=\"ei\", **gp_params)\n", + "\n", + "plot_bo(f, bo)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Optimization of the acquisition function by testing random points\n", + "\n", + "**This should be much faster...**" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Wall time: 96.5 ms\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "np.random.seed(42)\n", + "\n", + "bo = BayesianOptimization(f=lambda x: f[int(x)],\n", + " pbounds={\"x\": (0, len(f)-1)},\n", + " verbose=0)\n", + "\n", + "%time bo.maximize(init_points=5, n_iter=25, test_random_points=1000, acq=\"ei\", **gp_params)\n", + "\n", + "plot_bo(f, bo)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.5.1" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +}