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)
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:
Optimisation des baies Une méthode pour trouver la valeur minimale (valeur maximale) de la fonction objectif à l'aide de la régression de processus gaussien. Pour la prédiction (distribution de probabilité) obtenue à partir de la régression du processus gaussien La fonction d'acquisition est appliquée et le point où la valeur de la fonction est maximisée est recherché comme point suivant.
Retour du processus Gauss Un type d'estimation bayésienne. La valeur de la fonction objectif $ f (x) $ pour chaque point d'entrée ($ x $) est considérée comme une variable de probabilité une par une. Considérons $ (f (x_ {1}), f (x_ {2}),…, f (x_ {n}),…) $ comme une distribution normale multivariée $ N (μ, Σ) $.
Points d'entrée acquis
--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."
#[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
#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.
#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.
#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')
myBopt.run_optimization(max_iter=10)
#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])
#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.
(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