Python-Evolutionsberechnungsbibliothek Deap (3)

CMA-ES Ich werde vom letzten und vom letzten Mal an die Einführung von [Python Evolution Calculation Library Deap] fortsetzen (http://qiita.com/neka-nat@github/items/0cb8955bd85027d58c8e). Dieses Mal schauen wir uns [CMA-ES] an (http://en.wikipedia.org/wiki/CMA-ES). Zunächst möchte ich erklären, wie CMA-ES ist. CMA-ES steht für * Covariance Matrix Adaptation Evolution Strategy * und ist eine Optimierungsberechnung für nichtlineare / diskontinuierliche Funktionen. Kurz gesagt wird die Suchpopulation unter Verwendung der multivariaten Normalverteilung erzeugt, und die mittlere und diversifizierte Kovarianzmatrix der multivariaten Normalverteilung wird aus der Bewertung der Population aktualisiert. Unter der Annahme, dass der Suchraum die Dimension $ n $ hat und die Bevölkerungsgenerierung $ \ lambda (> 1) $ im Schritt $ k $ durchgeführt wird, werden die Lösungskandidaten $ x_i \ in {\ aus der folgenden multivariaten Normalverteilung ausgewählt bf R} ^ n (i = 1, ..., \ lambda) $ wird erzeugt.

x_i ~ \sim N(m_k, \sigma_k^2 C_k)

In CMA-ES wird dieses $ m_k, \ sigma_k ^ 2, C_k $ Schritt für Schritt aktualisiert.

Rastrigin-Funktion

Dieses Mal werden wir eine Funktion optimieren, die als Rastrigin-Funktion bezeichnet wird. Die Rastrigin-Funktion wird häufig als Benchmark-Funktion für Optimierungsalgorithmen verwendet und wird durch die folgende Formel ausgedrückt.

f(x) = An + \sum_{i=1}^n [ x_i^2 - A\cos(2\pi x_i ) ]

Hier ist $ A = 10, x_i \ in [-5.12, 5.12] $ und der Mindestpunkt ist $ x = 0 $ und $ f (x) = 0 $. Wenn ich versuche, ein wenig mit matplotlib zu zeichnen ...

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import matplotlib.pyplot as plt

from deap import benchmarks
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
X = np.arange(-5.12, 5.12, 0.1)
Y = np.arange(-5.12, 5.12, 0.1)
X, Y = np.meshgrid(X, Y)
Z = [[benchmarks.rastrigin((x, y))[0] for x, y in zip(xx, yy)] for xx, yy in zip(X, Y)]
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.coolwarm, linewidth=0, antialiased=False)
plt.show()

rastrigin.png

Eine Funktion, die so aussieht, wird herauskommen.

Beispielcode

Um zu bestätigen, welche Art von verteilter co-verteilter Matrix in der Mitte von CMA-ES erzeugt wird, versuche ich, die verteilte co-verteilte Matrix bei jedem Schritt zu zeichnen.

# -*- coding: utf-8 -*-
import numpy

from deap import algorithms
from deap import base
from deap import benchmarks
from deap import cma
from deap import creator
from deap import tools

import matplotlib.pyplot as plt

N = 2  #Problemdimension
NGEN = 50  #Gesamtzahl der Schritte

creator.create("FitnessMin", base.Fitness, weights=(-1.0,))
creator.create("Individual", list, fitness=creator.FitnessMin)

toolbox = base.Toolbox()
toolbox.register("evaluate", benchmarks.rastrigin)

def main():
    numpy.random.seed(64)

    # The CMA-ES algorithm 
    strategy = cma.Strategy(centroid=[5.0]*N, sigma=3.0, lambda_=20*N)
    toolbox.register("generate", strategy.generate, creator.Individual)
    toolbox.register("update", strategy.update)

    halloffame = tools.HallOfFame(1)

    halloffame_array = []
    C_array = []
    centroid_array = []
    for gen in range(NGEN):
        #Generieren Sie eine neue Generation von Bevölkerung
        population = toolbox.generate()
        #Bevölkerungsbewertung
        fitnesses = toolbox.map(toolbox.evaluate, population)
        for ind, fit in zip(population, fitnesses):
            ind.fitness.values = fit
        
        #Parameteraktualisierung für die Berechnung der nächsten Generation aus der Bevölkerungsbewertung
        toolbox.update(population)
        
        # hall-of-Update des Ruhmes
        halloffame.update(population)

        halloffame_array.append(halloffame[0])
        C_array.append(strategy.C)
        centroid_array.append(strategy.centroid)

    #Berechnungsergebnis zeichnen
    import matplotlib.pyplot as plt
    import matplotlib.cm as cm
    from matplotlib.patches import Ellipse
    plt.ion()
    fig = plt.figure()
    ax = fig.add_subplot(111)
    X = numpy.arange(-5.12, 5.12, 0.1)
    Y = numpy.arange(-5.12, 5.12, 0.1)
    X, Y = numpy.meshgrid(X, Y)
    Z = [[benchmarks.rastrigin((x, y))[0] for x, y in zip(xx, yy)]
         for xx, yy in zip(X, Y)]
    ax.imshow(Z, cmap=cm.jet, extent=[-5.12, 5.12, -5.12, 5.12])
    for x, sigma, xmean in zip(halloffame_array, C_array, centroid_array):
        #Zeichnen Sie die Varianz der multivariaten Verteilung als Ellipse
        Darray, Bmat = numpy.linalg.eigh(sigma)
        ax.add_artist(Ellipse((xmean[0], xmean[1]),
                              numpy.sqrt(Darray[0]),
                              numpy.sqrt(Darray[1]),
                              numpy.arctan2(Bmat[1, 0], Bmat[0, 0]) * 180 / numpy.pi,
                              color="g",
                              alpha=0.7))
        ax.plot([x[0]], [x[1]], c='r', marker='o')
        ax.axis([-5.12, 5.12, -5.12, 5.12])
        plt.draw()
    plt.show(block=True)

if __name__ == "__main__":
    main()

cma-es.png

Sie können sehen, dass die grüne Ellipse die Varianz-co-verteilte Matrix jedes Schritts darstellt. Wenn sie sich der optimalen Lösung $ [0,0] $ nähert, wird die Ellipse kleiner und der Suchbereich enger. Wenn Sie das obige Skript tatsächlich ausführen, werden die Ellipsen in den neuen Schritten hinzugefügt und in einer Animation gezeichnet, sodass ich denke, dass die Änderungen in den Ellipsen leichter zu verstehen sind. Die roten Punkte stellen die beste Lösung für jeden Schritt dar, der auch in $ [0,0] $ endet.

Referenz

CMA-ES-Beispiel: http://deap.gel.ulaval.ca/doc/default/examples/cmaes_plotting.html

Recommended Posts

Python-Evolutionsberechnungsbibliothek Deap
Python-Evolutionsberechnungsbibliothek Deap (3)
Python-Evolutionsberechnungsbibliothek Deap (2)
Python 3.6 E-Mail-Bibliothek
Python ast Bibliothek
Python Library Hinweis
Berechnungsbohrpython
Python-Algorithmus Handelsbibliothek
Installieren einer externen Bibliothek für Python
Python-Optimierungsbibliothek Pulp
Berechnungsbohrpython (Erweiterung)
Ziel Python Library Master (36) json2html
Ziel Python-Master (49) psidialogs
Deep Python hat von DEAP gelernt
Ziel Python Library Master (26) easyxml
Ziel Python Library Master (29) table_printer
Ziel Python Library Master (46) Browserplus
Ziel Python Library Master (30) Chronyk
Ziel Python Library Master (3) Arbeitskalender
Ziel Python Speed Master (42) Speedrecorder
Ziel Python Library Master (37) Slimurl
Empfehlung der binpacking Bibliothek von Python
Ziel Python Library Master (44) Pynetviz
Ziel Python Library Master (8) Rolex
Ziel Python Library Master (52) Marktime
Ziel Python Library Master (7) Numparser
Ziel Python Library Master (21) hy
Richten Sie die Anforderungen des Python Library Master (18) aus
Windows 10: Installieren der DLIB-Bibliothek für Python
Ziel Python Library Master (13) easydev
Ziel Python Library Master (20) Pyyaml
Zielen Sie gleichzeitig auf den Python-Bibliotheksmaster (34)
Ziel ist die Wortsegmentierung des Python Library Master (40)
Ziel Python Library Master (43) cpmoptimize
Ziel Python Library Master (68) Pazudorasolver
Ziel Python Library Master (58) Fälscher
Ziel Python Library Master (11) nlist
Ziel Python Library Master (38) beautiful_print
Ziel Python Library Master (65) Geopy
Ziel Python Library Master (2) Vincent
Zielen Sie auf das Logbuch des Python Library Master (59)
Ziel Python Library Master (51) Pyautogui
Ziel Python Library Master (10) Timeit
Ziel Python Python Master (0) Links
Ziel Python Library Master (66) youtube-dl
Überschreiben Sie Bibliotheksfunktionen in Python
Ziel Python Library Master (53) Psutil
Ziel Python Library Master (22) htmltag
Ziel Python Library Master (67) httpie
Ziel Python Library Master (45) xlsxwriter
Ziel Python Library Master (9) WebHelpers
Ziel Python Library Master (32) SQL
Ziel Python Library Master (60) Colourettu
Ziel Python Library Master (64) Pretty_cron
Ziel Python Library Master (56) Colorthief
Ziel Python Library Master (61) verschachtelte Suche
Ziel Python Range Master (17) RangeParser
Ziel Python Library Master (47) Deckor
Ziel Python Library Master (25) bestellte Menge