🐟

GPyOptによるベイズ最適化+実験計画 (1) ~1変数~

2022/07/05に公開

GPyOptによるベイズ最適化+実験計画 (1) ~1変数~

編集中

参考にしたリンク

ライブラリ

  • python 3.8.13
  • matplotlib 3.1.3
  • gpy 1.10.0
  • gpyopt 1.2.6
  • numpy 1.22.3
  • pandas 1.2.5

(注) GPyOptのplot_aquisition()でエラーが発生。Matplotlib 3.1.3以前では回避できるとのことから各ライブラリをダウングレードして使用。

やりたいこと

  • 下記のようなデータについて、ベイズ最適化を実施。
  • 獲得関数をプロット。
  • 推奨される次のプロットを算出。
  • 想定範囲はx:-1.0 ~ 5.0
Data No. x y
1 1.0 4.0
2 2.0 5.0
3 3.0 2.0

コード

# 必要なライブラリをインポート
import GPy
import GPyOpt
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt

# 得られたx,yを入力。x,yともにnumpyの2D arrayとなることに注意!
x_obs = np.asarray([[1.0],[2.0],[3.0]])
y_obs = np.asarray([[4.0],[5.0],[2.0]])

bounds = [{'name': 'x', 'type': 'continuous', 'domain': (-1.0, 5.0)}]

params = {'acquisition_type':'EI',#獲得関数としてEIを指定
          'f':None, #予測関数はなし
          'domain':bounds, #パラメータの探索範囲の指定
          'model_type':'GP', #標準的なガウシアンプロセスを指定.
          'X':x_obs, #既知データの説明変数(インプットするx)
          'Y':y_obs, #既知データの目的変数(インプットするy)
          'de_duplication':True, #重複したデータをサンプルしないように設定.
          "normalize_Y":False, #defaltはTrue
          "exact_feval":False #defaltはFalse
          } 
myBopt = GPyOpt.methods.BayesianOptimization(**params)
myBopt.plot_acquisition()

# 次点の推奨、予測
x_suggest = myBopt.suggest_next_locations(ignored_X=x_obs) 
y_predict = myBopt.model.model.predict(x_suggest) #y_predictは(予測平均,予測分散)がタプルで返ってくる
y_mean=y_predict[0]
y_variance=y_predict[1]

print(f'つぎは{x_suggest}、yの予測平均は{y_mean}、分散は{y_variance}')


つぎは[[5.]]、yの予測平均は[[-0.28367933]]、分散は[[8.76588952]]

Discussion