[PYTHON] J'ai essayé l'optimisation bayésienne!

Aperçu

En utilisant la bibliothèque d'optimisation bayésienne, En fait, j'ai essayé de voir si cela pouvait être optimisé pour une bonne sensation.

La bibliothèque utilisée est "GPyOpt".

Les livres suivants ont été utilisés comme références pour la théorie. "Processus de Gauss et apprentissage automatique" (Auteur: Daichi Mochihashi, Seisei Ohba)

Aperçu de l'expérience

Créez une fonction objectif et trouvez sa valeur minimale (dans la plage de définition spécifiée) par optimisation bayésienne. Les paramètres détaillés sont les suivants. --Bibliothèque d'optimisation de Bayes: GPyOpt (.methods.BayesianOptimization) --Fonction objective:    y=f(x)=(x-300)(x-200)(x-15)(x-5)(x+6)(x+10)(x+100) --Politique d'optimisation: minimisation --Zone de définition (x): [-100, 300] --Fonction d'acquisition: EI (valeur d'amélioration attendue) --Données initiales (x, y):    x = -50 , 0 , 50 , 100 , 150 , 200 , 250 --Kernel: non spécifié. (Les paramètres par défaut de la bibliothèque n'ont pas été étudiés.) Cette fois, je vais laisser le noyau de côté et voir les résultats.

supposition

Points d'entrée acquis  x_{1} , x_{2} , … , x_{n} Ensuite, la valeur de la fonction objectif (distribution normale) du nouveau point d'entrée $ x_ {n + 1} $ est définie.  f(x_{n+1}) 〜 p( f(x_{n+1}) | x_{n+1} , f(x_{1}) , f(x_{2}) , …  ,f(x_{n}) ) Une méthode de régression qui est considérée comme.   Il est parfois utilisé sous la forme de prédiction de la valeur attendue de la valeur de la fonction objectif (distribution normale). (La fonction $ f $ ci-dessus est appelée "processus gaussien".)

--Noyau En régression de processus gaussien $ (f (x_ {1}), f (x_ {2}),…, f (x_ {n}),…) Une fonction pour spécifier chaque composante de la matrice de covariance $ Σ $ de $. Le composant $ (i, j) $, c'est-à-dire la covariance de $ f (x_ {i}) $ et $ f (x_ {j}) $ dépend de $ x_ {i} $ et $ x_ {j} $ Défini par la fonction $ k (x_ {i}, x_ {j}) $ La fonction $ k $ s'appelle le "noyau". Il existe plusieurs noyaux couramment utilisés, Comme propriété de base "Si les points d'entrée $ x_ {i}, x_ {j} $ sont proches, alors $ f (x_ {i}), f (x_ {j}) $ sont également proches."

Détails de l'expérience

1. Importation de la bibliothèque

#[document] https://gpyopt.readthedocs.io/en/latest/index.html
#[La source] https://github.com/SheffieldML/GPyOpt/blob/master/GPyOpt/methods/bayesian_optimization.py

#pip install Gpyopt
import GPyOpt

import matplotlib.pyplot as plt
import numpy as np

2. Fonction objective

#Définition de la fonction objective
def f(x):
    y = (x-300)*(x-200)*(x-15)*(x-5)*(x+6)*(x+10)*(x+100)
    return y

#Définition de la zone de définition
xlim_fr = -100
xlim_to = 300

#Graphique
x = [i for i in range(xlim_fr , xlim_to + 1)]
y = [f(_x) for _x in x]

figsize = (10 , 5)
fig , ax = plt.subplots(1 , 1 , figsize=figsize)
ax.set_title('Outline of f')
ax.grid()
ax.plot(x , y)
ax.set_xlim(xlim_fr , xlim_to)
plt.show()

À partir du graphique, dans la zone de définition Il semble que x ait une valeur minimale d'environ 270. Assurez-vous que l'optimisation bayésienne vous donne ce point. obj_func.jpg

3. Données initiales

#Donnée initiale
init_X = [i for i in range(-50 , 300 , 50)]
init_X_np = np.array(init_X).reshape((len(init_X) , 1))

init_Y = [f(i) for i in init_X]
init_Y_np = np.array(init_Y).reshape((len(init_Y) , 1))

print(len(init_X))
print(len(init_Y))

print(init_X_np[:5])
print(init_Y_np[:5])

#Tracer la position des données initiales
figsize = (10 , 5)
fig , ax = plt.subplots(1 , 1 , figsize=figsize)
ax.set_title('Outline of f and Initial Data')
ax.grid()
ax.plot(x , y , label="f" , color="y")

#Donnée initiale
for init_x , init_y in zip(init_X , init_Y):
    ax.plot(init_x , init_y , marker="o" , color="r")

ax.set_xlim(xlim_fr , xlim_to)
plt.show()

Le point rouge est donné comme donnée initiale.

Le flux d'optimisation est le suivant.

(1) Calculez la prédiction (distribution de probabilité) de la valeur f dans la zone définie à partir des données acquises. (2) Calculez la valeur de la fonction d'acquisition à partir de chaque prédiction. (3) Acquérir le point (x) où la valeur de la fonction acquise est maximisée comme point suivant et rechercher. init_data_1.jpg init_data_2.jpg

4. Initialisation bayésienne du modèle d’optimisation

#Zone de définition
bounds = [{'name': 'x', 'type': 'continuous', 'domain': (xlim_fr,xlim_to)}]

# X , Y :Donnée initiale
# initial_design_numdata :Le nombre de données initiales à définir. X ci-dessus,Aucun réglage n'est requis lorsque Y est spécifié.
# normalize_Y :Fonction objective(Processus gaussien)Fidèle à normaliser.(Cette fois, False pour faciliter la comparaison de la prédiction avec la vraie valeur)
myBopt = GPyOpt.methods.BayesianOptimization(f=f
                                             , domain=bounds
                                             , X=init_X_np
                                             , Y=init_Y_np
                                             , normalize_Y=False
                                             , maximize=False
                                             #, initial_design_numdata=50
                                             , acquisition_type='EI')

5. Bayes optimisation_train

myBopt.run_optimization(max_iter=10)

6. Résultats / processus bayésiens d’optimisation_learning

#Solution optimale obtenue
x_opt = myBopt.x_opt
fx_opt = myBopt.fx_opt
print("x_opt" , ":" , x_opt)
print("fx_opt" , ":" , fx_opt)

#Trajectoire d'optimisation
print("X.shape" , ":" , myBopt.X.shape)
print("Y.shape" , ":" , myBopt.Y.shape)

print("-" * 50)
print("X[:5]" , ":")
print(myBopt.X[:5])
print("-" * 50)
print("Y[:5]" , ":")
print(myBopt.Y[:5])

opt_result_1.jpg opt_result_2.jpg

7. Prediction_Graphing

#Modèle de régression de processus gaussien
model = myBopt.model.model

#Prédiction (première composante: moyenne, deuxième composante: std)
np_x = np.array(x).reshape(len(x) , 1)
pred = model.predict(np_x)

model.plot()
myBopt.plot_acquisition()

model.plot()
plt.plot(x , y , label="f" , color="y")
plt.plot(x_opt , fx_opt , label="Optimal solution" , marker="o" , color="r")
plt.xlim(xlim_fr , xlim_to)
plt.legend()
plt.grid()
plt.title("f of True & Predict")
plt.show()

Le point rouge dans le troisième graphique est la solution optimale obtenue. En regardant le graphique, la valeur minimale a été trouvée correctement. predict_1.jpg predict_2.jpg predict_3.jpg

Résumé

(Mis à part les erreurs détaillées) Nous avons pu trouver la valeur minimale par optimisation bayésienne.

Cependant, cette fois en tant que données initiales, Il a une valeur proche de la solution optimale (valeur minimale) de $ x = 250 $. Cela peut avoir facilité l'optimisation.

Si les données initiales ne sont "que des données éloignées de la solution optimale" Vous devrez peut-être augmenter le nombre d'essais.

Recommended Posts

J'ai essayé l'optimisation bayésienne!
J'ai essayé d'utiliser l'optimisation bayésienne de Python
J'ai essayé de passer par l'optimisation bayésienne. (Avec des exemples)
J'ai essayé de gratter
J'ai essayé PyQ
J'ai essayé AutoKeras
J'ai essayé le moulin à papier
J'ai essayé django-slack
J'ai essayé spleeter
J'ai essayé cgo
J'ai essayé d'utiliser paramétré
J'ai essayé d'utiliser argparse
J'ai essayé d'utiliser la mimesis
J'ai essayé d'utiliser anytree
J'ai essayé d'exécuter pymc
J'ai essayé le spoofing ARP
J'ai essayé d'utiliser aiomysql
J'ai essayé d'utiliser Summpy
J'ai essayé Python> autopep8
J'ai essayé d'utiliser coturn
J'ai essayé d'utiliser Pipenv
J'ai essayé d'utiliser matplotlib
J'ai essayé d'utiliser "Anvil".
J'ai essayé d'utiliser Hubot
J'ai essayé PyCaret2.0 (pycaret-nightly)
J'ai essayé d'utiliser openpyxl
J'ai essayé le deep learning
J'ai essayé AWS CDK!
J'ai essayé d'utiliser Ipython
J'ai essayé de déboguer.
J'ai essayé d'utiliser PyCaret
J'ai essayé d'utiliser cron
J'ai essayé la mapview de Kivy
J'ai essayé d'utiliser ngrok
J'ai essayé d'utiliser face_recognition
J'ai essayé de déplacer EfficientDet
J'ai essayé la programmation shell
J'ai essayé d'utiliser doctest
J'ai essayé d'exécuter TensorFlow
J'ai essayé Auto Gluon
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser jinja2
J'ai essayé d'utiliser du folium
J'ai essayé d'utiliser la fenêtre de temps
J'ai essayé de résumer quatre méthodes d'optimisation de réseau neuronal
J'ai essayé les réseaux d'itération de valeur
J'ai essayé fp-growth avec python
J'ai essayé de gratter avec Python
J'ai essayé la classification d'image d'AutoGluon
J'ai essayé d'apprendre PredNet
J'ai essayé Learning-to-Rank avec Elasticsearch!
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé d'organiser SVM.
J'ai essayé d'utiliser RandomForest
J'ai essayé le clustering avec PyCaret
J'ai essayé d'utiliser BigQuery ML
J'ai essayé "K-Fold Target Encoding"