[PYTHON] Comment réparer la population initiale avec un algorithme génétique utilisant DEAP

En utilisant la bibliothèque Python DEAP, vous pouvez facilement effectuer des simulations à l'aide de l'algorithme génétique (GA). A ce moment, il peut être souhaitable de fixer le groupe initial en raison de circonstances telles que le fait d'avoir une certaine connaissance préalable de la solution optimale et de vouloir raccourcir le temps de calcul.

Par exemple, lorsque j'applique à la sélection de fonctionnalités d'apprentissage automatique telles que cet exemple, je souhaite commencer par le meilleur modèle que j'ai essayé jusqu'à présent. Peut être considéré. Si elle est de 100 à plusieurs centaines, il n'est pas nécessaire de définir la valeur initiale, mais il existe une demande pour des humains qui ont créé mécaniquement environ 100 000 fonctionnalités sans réfléchir à l'avance.

Il existe un guide dans Document officiel pour savoir comment traiter de tels cas. Il n'y a pas beaucoup d'informations sur le Web que j'ai réellement testées, je vais donc les énumérer ici.

Expérience avec le modèle One-Max de document officiel

Implémentation GA qui maximise la valeur totale du tableau constitué de 0 ou 1 comme fonction d'évaluation La solution optimale est un tableau de 1 et la valeur maximale de la fonction d'évaluation est la longueur du tableau. http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax.html http://deap.gel.ulaval.ca/doc/default/examples/ga_onemax_short.html

1. GA d'une population initiale aléatoire selon la documentation officielle

#Import de bibliothèque
import numpy as np
import random

from deap import algorithms
from deap import base
from deap import creator
from deap import tools

1-1. Création de la fonction d'évaluation

Valeur totale d'un tableau de 100 éléments composé de 0 ou 1

def evalOneMax(individual):
    return sum(individual), #Ajoutez une virgule même s'il n'y a qu'une seule valeur de retour

1-2. Créer un créateur

Ajoutez des méthodes FitnessMax et Individual au créateur avec create. Évaluez la maximisation de la fonction d'évaluation en définissant des poids = (1,0,).

creator.create("FitnessMax", base.Fitness, weights=(1.0,)) #Ajoutez une virgule même s'il n'y a qu'un seul argument
creator.create("Individual", list, fitness=creator.FitnessMax)

1-3. Créer une boîte à outils

Ajoutez une méthode avec le nom de la première variable à la boîte à outils avec resister. toolbox.attr_bool: random.randint(0,1) toolbox.individual: 01 nombre aléatoire en utilisant toolbox.attr_bool> Répéter 100 fois avec tools.initRepeat Créer une liste de 100 éléments (= génération individuelle) toolbox.polulation: Répétez la génération individuelle par toolbox.individual pour créer une population

del toolbox
toolbox = base.Toolbox()
# Attribute generator
toolbox.register("attr_bool", random.randint, 0.0, 1.0)
# Structure initializers
toolbox.register("individual", tools.initRepeat, creator.Individual, 
    toolbox.attr_bool, 100)
toolbox.register("population", tools.initRepeat, list, toolbox.individual)

Ensuite, la méthode requise pour l'exécution GA par ʻalgorithms.eaMuPlusLambda Définisseztoolbox.evaluate (évaluation), toolbox.mate(crossover),toolbox.mutate (mutation), toolbox.select(sélection). Vous pouvez écrire comme ci-dessous en utilisantdeap.tools`.

toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selNSGA2)

1-4. Statistiques et création initiale de la population

pop: groupe initial hof: Préservation des meilleurs individus stats: sauvegarde des statistiques pour les fonctions d'évaluation de la population

"""Réglage de l'algorithme génétique
Jusqu'à la génération NGEN
Population de 1ère génération LAMBDA
Nombre d'individus à transmettre à la nouvelle génération d'UM
Probabilité de croisement CXPB
Probabilité de mutation MUTPB
"""
random.seed(4)
NGEN = 10
MU = 50
LAMBDA = 100
CXPB = 0.7
MUTPB = 0.3

#Création de population

pop = toolbox.population(n=MU)
hof = tools.HallOfFame(1)
stats = tools.Statistics(lambda ind: ind.fitness.values)
stats.register("avg", np.mean, axis=0)
stats.register("std", np.std, axis=0)
stats.register("min", np.min, axis=0)
stats.register("max", np.max, axis=0)

1-5. Exécution GA par ʻalgorithms.eaMuPlusLambda`

pop, log = algorithms.eaMuPlusLambda(pop,
                                     toolbox,
                                     mu=MU,
                                     lambda_=LAMBDA,
                                     cxpb=CXPB,
                                     mutpb=MUTPB,
                                     ngen=NGEN,
                                     stats=stats,
                                     halloffame=hof)
gen	nevals	avg    	std         	min  	max  
0  	50    	[50.32]	[4.71355492]	[41.]	[63.]
1  	100   	[56.]  	[2.02977831]	[53.]	[63.]
2  	100   	[59.3] 	[2.3]       	[57.]	[68.]
3  	100   	[62.56]	[2.03135423]	[60.]	[69.]
4  	100   	[65.58]	[1.96051014]	[63.]	[72.]
5  	100   	[68.46]	[1.52590956]	[66.]	[73.]
6  	100   	[70.4] 	[1.34164079]	[69.]	[74.]
7  	100   	[72.36]	[1.10923397]	[71.]	[76.]
8  	100   	[74.06]	[1.06602064]	[73.]	[77.]
9  	100   	[75.38]	[0.79724526]	[74.]	[77.]
10 	100   	[76.36]	[0.62481997]	[76.]	[78.]

Puisqu'il a commencé avec un nombre aléatoire, la valeur d'évaluation de l'individu initial se situe entre 41 et 63. Il n'a pas convergé dans la 10e génération, mais c'est OK car le but n'est pas de converger.

2. Comment définir votre propre population initiale

Si vous souhaitez fixer le groupe initial à une valeur spécifique et commencer, réécrivez la partie pertinente du document officiel comme suit.

2-1. Préparation du groupe initial auto-conçu

Créez une liste de population initiale = individus. Par exemple, si vous souhaitez démarrer l'algorithme génétique à partir de la population clonée L00 d'un individu composé de tous les 0, ce sera comme suit.

MU = 50
# individual
L0 = [0] * 100
# list of individuals
L00 = [L0] * MU

2-2. Création du créateur

Identique à 1-2.

2-3. Créer une boîte à outils

Définissez une méthode toolbox.population_guess qui remplace toolbox.population.

toolbox = base.Toolbox()

# population_Fonctions utilisées pour deviner
def initPopulation(pcls, ind_init, file):    
    return pcls(ind_init(c) for c in file)

# population_Créer une méthode d'estimation
# creator.Ajouter la forme physique à chaque individu par individu
toolbox.register("population_guess", initPopulation, list, creator.Individual, L00)
#Ici ensemble
toolbox.register("evaluate", evalOneMax)
toolbox.register("mate", tools.cxTwoPoint)
toolbox.register("mutate", tools.mutFlipBit, indpb=0.05)
toolbox.register("select", tools.selNSGA2)

2-4. Création du groupe initial

hof et stat sont identiques, donc omis

#Population de la génération individuelle initiale_Changer pour deviner
#pop = toolbox.population(n=MU)
pop = toolbox.population_guess()

2-5. Exécution GA par ʻalgorithms.eaMuPlusLambda`

pop, log = algorithms.eaMuPlusLambda(pop,
                                     toolbox,
                                     mu=MU,
                                     lambda_=LAMBDA,
                                     cxpb=CXPB,
                                     mutpb=MUTPB,
                                     ngen=NGEN,
                                     stats=stats,
                                     halloffame=hof)
gen	nevals	avg 	std 	min 	max 
0  	50    	[0.]	[0.]	[0.]	[0.]
1  	100   	[3.54]	[3.04111822]	[0.]	[9.]
2  	100   	[8.3] 	[2.0808652] 	[6.]	[15.]
3  	100   	[12.4]	[2.45764115]	[10.]	[21.]
4  	100   	[16.38]	[1.92758917]	[14.]	[22.]
5  	100   	[20.36]	[2.10485154]	[18.]	[29.]
6  	100   	[24.52]	[1.5651198] 	[22.]	[29.]
7  	100   	[28.02]	[1.74917123]	[26.]	[33.]
8  	100   	[31.3] 	[2.21133444]	[29.]	[39.]
9  	100   	[35.]  	[1.69705627]	[33.]	[40.]
10 	100   	[38.16]	[1.71300905]	[36.]	[43.]

Groupe avec des valeurs d'évaluation minimale et maximale de 0 = j'ai pu démarrer l'AG à partir de mon propre groupe initial.

Recommended Posts

Comment réparer la population initiale avec un algorithme génétique utilisant DEAP
Trouver une solution au problème N-Queen avec un algorithme génétique (2)
Trouver une solution au problème N-Queen avec un algorithme génétique (1)
Comment essayer l'algorithme des amis d'amis avec pyfof
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (code Python)
Comment écrire une interface graphique à l'aide de la commande maya
Comment créer un sous-menu avec le plug-in [Blender]
Comment générer une requête à l'aide de l'opérateur IN dans Django
Une histoire sur la façon de traiter le problème CORS
Essayez de modéliser une distribution multimodale à l'aide de l'algorithme EM
Résolution du problème d'horaire des infirmières (optimisation des équipes) avec un algorithme génétique
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
Comment faire une commande pour lire le fichier de paramètres avec pyramide
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 1)
Comment envoyer une requête à l'API DMM (FANZA) avec python
Comment ajouter un package avec PyCharm
Comment dessiner un graphique avec Matplotlib
Rechercher le labyrinthe avec l'algorithme python A *
Comment installer un package à l'aide d'un référentiel
Comment diviser et traiter une trame de données à l'aide de la fonction groupby
[Python] Qu'est-ce qu'un argument formel? Comment définir la valeur initiale
Réfléchissez à la façon d'écrire un filtre avec les versions Shotgun API-Contact
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
[Introduction à Python] Comment écrire une chaîne de caractères avec la fonction format
[2015/11/19] Comment enregistrer un service localement à l'aide du SDK python avec naoqi os
Comment calculer la volatilité d'une marque
Comment lire un fichier CSV avec Python 2/3
Comment coder un drone en utilisant la reconnaissance d'image
Comment publier un blog sur Amazon S3 avec le moteur de blog statique `` Pélican '' pour Pythonista
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Comment développer une application de panier avec Django
Comment créer un dictionnaire avec une structure hiérarchique.
[Algorithm x Python] Comment utiliser la liste
Enregistrer l'objet dans un fichier avec pickle
Procédure de création d'application multi-plateforme avec kivy
[AWS] Comment gérer Wordpress "La réponse n'est pas la bonne réponse JSON"
Comment mettre en ligne sur un Drive partagé à l'aide de pydrive
Comment entraîner Kaldi avec JUST Corpus
Comment désinstaller un module installé à l'aide de setup.py
Comment obtenir une liste de fichiers dans le même répertoire avec python
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
Comment définir un dossier partagé avec le système d'exploitation hôte dans CentOS7 sur Virtual BOX
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
Comment créer rapidement un environnement d'apprentissage automatique à l'aide de Jupyter Notebook avec UbuntuServer 16.04 LTS
Un mémo sur la façon de surmonter le problème difficile de la capture d'effets avec l'IA
Lire la source Python-Markdown: Comment créer un analyseur
Comment convertir / restaurer une chaîne avec [] en python
Comment supprimer la chaîne de caractères spécifiée avec la commande sed! !! !!
[Python] Comment dessiner un graphique linéaire avec Matplotlib
Comment configurer un environnement Python à l'aide de pyenv
[Introduction à Python] Comment itérer avec la fonction range?
Comment obtenir un utilisateur connecté avec les forms.py de Django
Comment convertir un objet de classe en dictionnaire avec SQLAlchemy
[Python] Comment spécifier l'emplacement de téléchargement avec youtube-dl
Comment faire un jeu de tir avec toio (partie 1)
Comment organiser un séminaire pratique à l'aide de Jupyter à l'aide de Docker
Comment créer un package Python à l'aide de VS Code
Comment analyser avec Google Colaboratory à l'aide de l'API Kaggle