{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# simulatorクラスの定義\n", "\n", "\n", "PHYSBOではSimulator関数を使用して目的関数を定義します。\n", "ここでは、一次元の関数の最小値を求める例題をもとに、simulatorクラスの定義方法について紹介します。\n", "\n", "## 探索空間の定義\n", "\n", "その他のチュートリアルと同じように、最初に関数を探索する空間を定義します。\n", "以下の例では、探索空間``X``を ``x_min = -2.0``から``x_max = 2.0``まで``window_num=10001``分割で刻んだグリッドで定義しています。\n", "なお、``X``は ``window_num`` x ``d`` のndarray形式にする必要があります(``d``は次元数、この場合は2次元)。そのため、reshapeを行って変形しています。" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "#In\n", "import numpy as np\n", "import scipy\n", "import physbo\n", "import os\n", "import urllib\n", "import itertools\n", "\n", "#In\n", "#Create candidate\n", "window_num=10001\n", "x_max = 2.0\n", "x_min = -2.0\n", "\n", "X = np.linspace(x_min,x_max,window_num).reshape(window_num, 1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## simulatorクラスの定義\n", "\n", "目的関数を定義するためのsimulatorクラスをここで定義します。\n", "\n", "今回はf(x) = 3 x^4 + 4 x ^3 + 1.0 が最小となるxを探索するという問題設定にしています(答えはx=-1.0)。\n", "\n", "simulatorクラスでは、``__call__``関数を定義します(初期変数などがある場合は``__init__``を定義します)。\n", "actionは探索空間の中から取り出すグリッドのindex番号を示しており、複数の候補を一度に計算できるように一般的にndarrayの形式を取っています。\n", "今回は一つの候補のみを毎回計算するため、``action_idx=action[0]``として``X``から候補点を一つ選んでいます。\n", "PHYSBOでは目的関数値が最大となるものを求める仕様になっているため、候補点でのf(x)の値に-1をかけたものを返しています。" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Declare the class for calling the simulator.\n", "class simulator:\n", "\n", " def __call__(self, action ):\n", " action_idx = action[0]\n", " x = X[action_idx][0]\n", " fx = 3.0*x**4 + 4.0*x**3 + 1.0\n", " fx_list.append(fx)\n", " x_list.append(X[action_idx][0])\n", "\n", " print (\"*********************\")\n", " print (\"Present optimum interactions\")\n", "\n", " print (\"x_opt=\", x_list[np.argmin(np.array(fx_list))])\n", "\n", " return -fx, x" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ランダムサーチ\n", "\n", "ベイズ最適化を行う前に、探索空間からランダムに候補点を選び目的関数値を評価することで、事前にトレーニングデータを用意します(飛ばすことも可能です)。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "fx_list=[]\n", "x_list = []\n", "#In\n", "# Design of policy\n", "# Declaring the policy by\n", "policy = physbo.search.discrete.policy(test_X=X)\n", "# test_X is the set of candidates which is represented by numpy.array.\n", "# Each row vector represents the feature vector of the corresponding candidate\n", "\n", "# set the seed parameter\n", "policy.set_seed( 1 )\n", "\n", "\n", "# If you want to perform the initial random search before starting the Bayesian optimization,\n", "# the random sampling is performed by\n", "\n", "res = policy.random_search(max_num_probes=50, simulator=simulator())\n", "# Input:\n", "# max_num_probes: number of random search\n", "# simulator = simulator\n", "# output: combo.search.discreate.results (class)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ベイズ最適化\n", "\n", "定義したsimulatorに対してベイズ最適化を実施します。" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# single query Bayesian search\n", "# The single query version of COMBO is performed by\n", "res = policy.bayes_search(max_num_probes= 150, simulator=simulator(), score='TS',\n", " interval=20, num_rand_basis=5000)\n", "\n", "# Input\n", "# max_num_probes: number of searching by Bayesian optimization\n", "# simulator: the class of simulator which is defined above\n", "# score: the type of aquision funciton. TS, EI and PI are available\n", "# interval: the timing for learning the hyper parameter.\n", "# In this case, the hyper parameter is learned at each 20 steps\n", "# If you set the negative value to interval, the hyper parameter learning is not performed\n", "# If you set zero to interval, the hyper parameter learning is performed only at the first step\n", "# num_rand_basis: the number of basis function. If you choose 0, ordinary Gaussian process runs" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 結果表示\n", "\n", "得られた結果のうち、一番よいスコアを持つものは``export_all_sequence_best_fx()``を用いることで取り出すことができます。\n", "また、これまでの全ての履歴をみたい場合には、``chosed_actions``を呼び出すことで表示することができます。以下、結果を表示するサンプルスクリプトを記載します。" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#In\n", "best_fx, best_action = res.export_all_sequence_best_fx()\n", "\n", "import matplotlib.pyplot as plt\n", "# The result of searching is summarized in the class combo.search.discrete.results.history()\n", "# res.fx: observed negative energy at each step\n", "# res.chosed_actions: history of choosed actions\n", "# fbest, best_action= res.export_all_sequence_best_fx(): current best fx and current best action\n", "# that has been observed until each step\n", "# res.total_num_search: total number of search\n", "plt.plot(res.fx[0:res.total_num_search])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(best_fx)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.plot(best_action)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "最後に、一番よいスコアを持つ候補は以下のようにして表示することができます。正しい解 x=-1に行き着いていることがわかります。" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[-1.]\n" ] } ], "source": [ "print(X[int(best_action[-1])])" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.16" } }, "nbformat": 4, "nbformat_minor": 4 }