GPyOpt, ein Paket zur Bayes'schen Optimierung in Python

Was ist Bayes-Optimierung?

Die Bayes'sche Optimierung ist eine Methode zur Optimierung einer Funktion unter Verwendung einer maschinellen Lernmethode namens Gauß'scher Prozess, die eine Bayes'sche Kernel-Regression durchführt. Die Vorteile dieser Bayes'schen Optimierung sind vielfältig. Sie kann beispielsweise auf Funktionen angewendet werden, deren Eingaben nicht kontinuierlich (nicht differenzierbar) sind, und sie ist stark für Funktionen mit lokalen Lösungen. Aufgrund dieser Vorzüge wird davon ausgegangen, dass es in Zukunft auf verschiedene Probleme angewendet werden kann. Hier erklären wir, wie GPyOpt verwendet wird, ein Paket, das die Bayes'sche Optimierung in Python durchführt.

GPyOpt-Installation

Verwenden Sie Anakonda als Umgebung. Sie benötigen die neuesten Scipy- und GPy-Pakete (Gaußscher Prozess).

$ conda update scipy
$ pip install GPy
$ pip install gpyopt

Funktionsoptimierung mit eindimensionaler Eingabe (Erklärung)

Zunächst optimieren wir eine nichtlineare Funktion, deren Eingabe eindimensional ist. Dieses Mal minimieren wir die Funktion von $ f (x) = \ cos (1,5x) + 0,1x $ im Bereich von $ 0 \ leq x \ leq 10 $. image

Bei der Bayes'schen Optimierung werden zunächst einige Eingaben innerhalb eines bestimmten Bereichs zufällig ausgewählt. Führen Sie als Nächstes das Eingabe-Sample durch die Funktion und erhalten Sie das Output-Sample. Dann führen wir anhand dieser Stichprobe eine Regression im Gaußschen Prozess durch. In dieser Abbildung ist Grün die Funktion, die Sie optimieren möchten, und Blau ist die Funktion, die im Gaußschen Prozess wiederholt wird. image

Lassen Sie uns nun herausfinden, wo die Funktion minimiert ist. Wir bestimmen das kleinste x und finden das y und so weiter. Es gibt verschiedene Kriterien dafür, wo x wahrscheinlich das Minimum ist, aber dieses Mal wird x, das sich bis zum kleinsten y im blauen Bereich in dieser Figur erstreckt, auf x gesetzt, das wahrscheinlich das Minimum ist. Ich werde. Dieser blaue Bereich ist der Bereich, der wahrscheinlich eine grüne Linie enthält, wenn nur die Daten der roten Punkte angegeben werden.

Lassen Sie uns nun eine mit dieser Methode testen. image Nach dem Abtasten ist es wichtig, dass sich der blaue Bereich ändert. In diesem Zustand ist es dann durch Durchführen einer Abtastung → Aktualisierung des blauen Bereichs → Abtastung → Aktualisierung des blauen Bereichs → ... möglich, x zu finden, das das Minimum von $ f (x) $ ist.

Dann wird die Figur nach einigen Abtastungen gezeigt. Viele Stichproben werden tatsächlich um $ x = 2 $ abgetastet, und die optimale Lösung ist die, bei der $ f (x) $ bei dieser Stichprobe tatsächlich minimiert wird. image

Eindimensionale Funktionsoptimierung (GPyOpt)

Machen wir es mit GPyOpt.

Importieren Sie es zuerst.

import GPy
import GPyOpt
import numpy as np 

Definieren Sie dann die Funktion, die Sie optimieren möchten. Hier können Sie die Numpy-Funktion angeben.

def f(x):
    '''
Nichtlineare Funktion muss diesmal optimiert werden
    '''
    return np.cos(1.5*x) + 0.1*x

Definieren wir nun zunächst den Definitionsbereich von x. 'Typ': 'stetig' gibt an, dass es stetig ist, und 'Domäne': (0,10) gibt an, dass es $ 0 \ leq x \ leq 10 $ ist. In der zweiten Zeile erhalten wir das Objekt für die Bayes'sche Optimierung. f ist die Funktion, die Sie optimieren möchten, domain ist der zuvor definierte Definitionsbereich und initial_design_numdata ist die Anzahl der zuerst zu erfassenden Stichproben. Undquisitionstyp bezieht sich auf die Auswahl von x, das als nächstes abgetastet werden soll ('LCB' ist die Auswahl der Stelle, an der der blaue Bereich minimiert wird).

bounds = [{'name': 'x', 'type': 'continuous', 'domain': (0,10)}]
myBopt = GPyOpt.methods.BayesianOptimization(f=f, domain=bounds,initial_design_numdata=5,acquisition_type='LCB')

Wiederholen Sie dann die Probenahme mit dem folgenden Befehl, um sie zu optimieren. max_iter gibt die Anzahl der Abtastungen an.

myBopt.run_optimization(max_iter=15)

Die optimale Lösung wird angezeigt.

print(myBopt.x_opt) #[ 2.05769988]
print(myBopt.fx_opt) #[-0.79271554]

Andere Funktionsvariablen, die verwendet werden können

myBopt.model.model #Gaußsches Prozessmodell für die Bayes'sche Optimierung(GPy-Objekt)
myBopt.model.model.predict #Gaußsche Prozessregressionsfunktion
myBopt.X,myBopt.Y #Abtastung von x und y

Funktionsoptimierung mit zweidimensionaler Eingabe

Die Bayes'sche Optimierung kann auch in mehreren Dimensionen angewendet werden. Hier wird eine zweidimensionale Bayes'sche Optimierung durchgeführt. Da die Eingangsvariable eine diskrete Variable sein kann, werde ich auch eine diskrete Variable für eine Dimension verwenden.

Die Funktion ist $ f (x) = \ log (10.5-x_0) + 0.1 \ sin (15x_0) $, wenn $ x_1 = 0 $, und $ f (x) = \ cos (wenn $ x_1 = 1 $). 1,5x_0) + 0,1x_0 $. Außerdem werden wir es im Bereich von $ 0 \ leq x_1 \ leq 10 $ minimieren ($ x_0 $ ist 0 oder 1).

image

Nach der Optimierung sieht es wie im folgenden Bild aus.

image

Machen wir es mit GPyOpt.

import GPy
import GPyOpt
import numpy as np 

def f(x):
    '''
Nichtlineare Funktion muss diesmal optimiert werden
    '''
    x0,x1 = x[:,0],x[:,1]
    f0 = np.log(10.5-x0) + 0.1*np.sin(15*x0)
    f1 = np.cos(1.5*x0) + 0.1*x0
    return (1-x1)*f0 + x1*f1

bounds = [{'name': 'x0', 'type': 'continuous', 'domain': (0,10)},
          {'name': 'x1', 'type': 'discrete', 'domain': (0,1)}]
myBopt = GPyOpt.methods.BayesianOptimization(f=f, domain=bounds)

myBopt.run_optimization(max_iter=30)

Es ist nicht so anders als der eindimensionale Fall. Was sich geändert hat, ist, dass die Funktion auch zwei Eingänge hat und Grenzen eine Liste mit zwei Elementen sind. 'Typ': 'diskret' steht für eine Auswahl, 0 oder 1.

Die optimale Lösung wird angezeigt.

print(myBopt.x_opt) #[ 2.0539031  1.       ]
print(myBopt.fx_opt) #[-0.7927657]

Recommended Posts

GPyOpt, ein Paket zur Bayes'schen Optimierung in Python
Python in der Optimierung
Ich habe versucht, die Bayes'sche Optimierung von Python zu verwenden
Python-Paketverwaltung mit IntelliJ
Lösen Sie Optimierungsprobleme mit Python
Optimierung der FX-Systolenparameter in Python
Bayesianische Optimierung, die mit Python sehr einfach ist
Implementiert in Python PRML Kapitel 1 Bayesianische Schätzung
Quadtree in Python --2
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
Metaanalyse in Python
Unittest in Python
Epoche in Python
Zwietracht in Python
Deutsch in Python
DCI in Python
Quicksort in Python
nCr in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
In Python flach drücken
Installieren Sie das Python-Paket in einer persönlichen Umgebung unter Ubuntu
Installieren Sie das Python-Paket in einer Offline-Umgebung
Erstellen Sie in Python ein Paket mit globalen Befehlen
Sortierte Liste in Python
Täglicher AtCoder # 36 mit Python
Clustertext in Python
AtCoder # 2 jeden Tag mit Python
Täglicher AtCoder # 32 in Python
"Lineare Regression" und "Probabilistische Version der linearen Regression" in Python "Bayes lineare Regression"
Täglicher AtCoder # 6 in Python