Fonctions de test unidimensionnelles (1D) pour l'optimisation des fonctions
L'optimisation des fonctions est un domaine d'étude qui recherche une entrée dans une fonction qui aboutit au résultat maximum ou minimum de la fonction.
Il existe un grand nombre d’algorithmes d’optimisation et il est important d’étudier et de développer des intuitions d’algorithmes d’optimisation sur des fonctions de test simples et faciles à visualiser.
Les fonctions unidimensionnelles prennent une seule valeur d'entrée et génèrent une seule évaluation de l'entrée. Il s’agit peut-être du type de fonction de test le plus simple à utiliser lors de l’étude de l’optimisation des fonctions.
L'avantage des fonctions unidimensionnelles est qu'elles peuvent être visualisées sous la forme d'un tracé bidimensionnel avec les entrées de la fonction sur l'axe des x et les sorties de la fonction sur l'axe des y. Les optima connus de la fonction et tout échantillonnage de la fonction peuvent également être dessinés sur le même tracé.
Dans ce didacticiel, vous découvrirez les fonctions unidimensionnelles standard que vous pouvez utiliser lors de l'étude de l'optimisation des fonctions.
Démarrez votre projet avec mon nouveau livre Optimization for Machine Learning, comprenant des tutoriels pas à pas et les fichiers code source Python pour tous exemples.
Présentation du didacticiel
Il existe de nombreux types différents de fonctions de test unidimensionnelles simples que nous pourrions utiliser.
Néanmoins, il existe des fonctions de test standards qui sont couramment utilisées dans le domaine de l'optimisation des fonctions. Il existe également des propriétés spécifiques des fonctions de test que nous pouvons souhaiter sélectionner lors du test de différents algorithmes.
Nous explorerons un petit nombre de fonctions de test unidimensionnelles simples dans ce didacticiel et les organiserons par leurs propriétés avec cinq groupes différents ; ils sont:
- Fonctions unimodales convexes
- Fonctions unimodales non convexes
- Fonctions multimodales
- Fonctions discontinues (non lisses)
- Fonctions bruyantes
Chaque fonction sera présentée à l'aide du code Python avec une implémentation de fonction de la fonction objectif cible et un échantillonnage de la fonction qui est présenté sous forme de tracé linéaire avec les optima de la fonction clairement marqués.
Toutes les fonctions sont présentées comme un problème de minimisation, par ex. recherchez l'entrée qui donne la sortie minimale (la plus petite valeur) de la fonction. Toute fonction de maximisation peut devenir une fonction de minimisation en ajoutant un signe négatif à toutes les sorties. De même, toute fonction de minimisation peut être maximisée de la même manière.
Je n'ai pas inventé ces fonctions ; ils sont tirés de la littérature. Voir la section de lectures complémentaires pour les références.
Vous pouvez ensuite choisir et copier-coller le code d'une ou plusieurs fonctions à utiliser dans votre propre projet pour étudier ou comparer le comportement des algorithmes d'optimisation.
Fonction unimodale convexe
Une fonction convexe est une fonction dans laquelle une ligne peut être tracée entre deux points quelconques du domaine et la ligne reste dans le domaine.
Pour une fonction unidimensionnelle représentée sous forme de tracé bidimensionnel, cela signifie que la fonction a la forme d'un bol et que la ligne entre deux reste au-dessus du bol.
Unimodal signifie que la fonction a un seul optimal. Une fonction convexe peut être unimodale ou non ; de même, une fonction unimodale peut être convexe ou non.
La plage de la fonction ci-dessous est limitée à -5,0 et 5,0 et la valeur d'entrée optimale est 0,0.
# convex unimodal optimization function
from numpy import arange
from matplotlib import pyplot
# objective function
def objective(x):
return x**2.0
# define range for input
r_min, r_max = -5.0, 5.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
L'exécution de l'exemple crée un tracé linéaire de la fonction et marque les optima avec une ligne rouge.
Cette fonction peut être décalée vers l'avant ou vers l'arrière sur la droite numérique en ajoutant ou en soustrayant une valeur constante, par ex. 5 + x^2.
Cela peut être utile si l'on souhaite éloigner l'entrée optimale d'une valeur de 0,0.
Fonctions unimodales non convexes
Une fonction est non convexe si une ligne ne peut pas être tracée entre deux points du domaine et que la ligne reste dans le domaine.
Cela signifie qu'il est possible de trouver deux points dans le domaine où une ligne entre eux croise un tracé linéaire de la fonction.
En règle générale, si le tracé d’une fonction unidimensionnelle comporte plus d’une colline ou d’une vallée, nous savons immédiatement que la fonction est non convexe. Néanmoins, une fonction non convexe peut être unimodale ou non.
La plupart des fonctions réelles que nous souhaitons optimiser sont non convexes.
La plage de la fonction ci-dessous est limitée à -10,0 et 10,0 et la valeur d'entrée optimale est 0,67956.
# non-convex unimodal optimization function
from numpy import arange
from numpy import sin
from numpy import exp
from matplotlib import pyplot
# objective function
def objective(x):
return -(x + sin(x)) * exp(-x**2.0)
# define range for input
r_min, r_max = -10.0, 10.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.67956
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
L'exécution de l'exemple crée un tracé linéaire de la fonction et marque les optima avec une ligne rouge.
Fonctions multimodales
Une fonction multimodale signifie une fonction avec plus d'un « mode » ou optima (par exemple, vallée).
Les fonctions multimodales sont non convexes.
Il peut y avoir un optimal global et un ou plusieurs optimums locaux ou trompeurs. Alternativement, il peut y avoir plusieurs optima globaux, c'est-à-dire plusieurs entrées différentes qui aboutissent à la même sortie minimale de la fonction.
Regardons quelques exemples de fonctions multimodales.
Fonction multimodale 1
La plage est limitée à -2,7 et 7,5 et la valeur d'entrée optimale est 5,145735.
# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot
# objective function
def objective(x):
return sin(x) + sin((10.0 / 3.0) * x)
# define range for input
r_min, r_max = -2.7, 7.5
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 5.145735
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
L'exécution de l'exemple crée un tracé linéaire de la fonction et marque les optima avec une ligne rouge.
Fonction multimodale 2
La plage est limitée à 0,0 et 1,2 et la valeur d'entrée optimale est 0,96609.
# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot
# objective function
def objective(x):
return -(1.4 - 3.0 * x) * sin(18.0 * x)
# define range for input
r_min, r_max = 0.0, 1.2
# sample input range uniformly at 0.01 increments
inputs = arange(r_min, r_max, 0.01)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.96609
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
L'exécution de l'exemple crée un tracé linéaire de la fonction et marque les optima avec une ligne rouge.
Fonction multimodale 3
La plage est limitée à 0,0 et 10,0 et la valeur d'entrée optimale est 7,9787.
# multimodal function
from numpy import sin
from numpy import arange
from matplotlib import pyplot
# objective function
def objective(x):
return -x * sin(x)
# define range for input
r_min, r_max = 0.0, 10.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 7.9787
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
L'exécution de l'exemple crée un tracé linéaire de la fonction et marque les optima avec une ligne rouge.
Fonctions discontinues (non lisses)
Une fonction peut avoir une discontinuité, ce qui signifie que le changement fluide des entrées de la fonction peut entraîner des changements non fluides dans la sortie.
Nous pourrions qualifier les fonctions possédant cette propriété de fonctions non lisses ou de fonctions discontinues.
Il existe de nombreux types de discontinuité, bien qu'un exemple courant soit un saut ou un changement brusque de direction dans les valeurs de sortie de la fonction, facile à voir sur un graphique de la fonction.
Fonction discontinue
La plage est limitée à -2,0 et 2,0 et la valeur d'entrée optimale est 1,0.
# non-smooth optimization function
from numpy import arange
from matplotlib import pyplot
# objective function
def objective(x):
if x > 1.0:
return x**2.0
elif x == 1.0:
return 0.0
return 2.0 - x
# define range for input
r_min, r_max = -2.0, 2.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = [objective(x) for x in inputs]
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 1.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
L'exécution de l'exemple crée un tracé linéaire de la fonction et marque les optima avec une ligne rouge.
Fonctions bruyantes
Une fonction peut avoir du bruit, ce qui signifie que chaque évaluation peut avoir une composante stochastique, qui modifie légèrement le résultat de la fonction à chaque fois.
Toute fonction non bruyante peut être rendue bruyante en ajoutant de petits nombres aléatoires gaussiens aux valeurs d'entrée.
La plage de la fonction ci-dessous est limitée à -5,0 et 5,0 et la valeur d'entrée optimale est 0,0.
# noisy optimization function
from numpy import arange
from numpy.random import randn
from matplotlib import pyplot
# objective function
def objective(x):
return (x + randn(len(x))*0.3)**2.0
# define range for input
r_min, r_max = -5.0, 5.0
# sample input range uniformly at 0.1 increments
inputs = arange(r_min, r_max, 0.1)
# compute targets
results = objective(inputs)
# create a line plot of input vs result
pyplot.plot(inputs, results)
# define optimal input value
x_optima = 0.0
# draw a vertical line at the optimal input
pyplot.axvline(x=x_optima, ls='--', color='red')
# show the plot
pyplot.show()
L'exécution de l'exemple crée un tracé linéaire de la fonction et marque les optima avec une ligne rouge.
Lectures complémentaires
Cette section fournit plus de ressources sur le sujet si vous souhaitez approfondir.
Articles
- Fonctions de test pour l'optimisation, Wikipédia.
- Bibliothèque virtuelle d'expériences de simulation : fonctions de test et ensembles de données
- Benchmarks d'optimisation globale et AMPGO, fonctions de test 1-D
Résumé
Dans ce didacticiel, vous avez découvert les fonctions unidimensionnelles standard que vous pouvez utiliser lors de l'étude de l'optimisation des fonctions.
Utilisez-vous l'une des fonctions ci-dessus ?
Faites-moi savoir laquelle dans les commentaires ci-dessous.
Avez-vous des questions ?
Posez vos questions dans les commentaires ci-dessous et je ferai de mon mieux pour y répondre.