Appelez Matlab depuis Python pour optimiser

introduction

Avez-vous déjà voulu optimiser une fonction créée dans Matlab avec le logiciel d'optimisation (Optune cette fois) en python pour la faire sentir bien? J'ai pensé que je pouvais faire quelque chose, alors j'ai essayé.

Environnement d'exploitation

Matlab R2018a Win10 python 3.6 (Anaconda)

Préparation préalable

Il est supposé que python contient environ 3,5 ou 3,6 (R2020 peut être OK avec un peu plus de ver?) J'ai mis 3,6 dans pyenv.

--Autoriser le chargement de matlabengine http://yusuke-ujitoko.hatenablog.com/entry/2019/08/06/212756
Reportez-vous ici, ouvrez l'invite Anaconda avec "privilèges d'administrateur" et tapez la commande suivante Pour le moment, anaconda3 \ "envs \ py36" est destiné à ceux qui n'ont pas installé anaconda dans l'environnement virtualenv. Est-ce inutile?

cd C:\Program Files\MATLAB\R2018a\extern\engines\python
python setup.py install --prefix="C:\Users\****\anaconda3\envs\py36"

**** est le nom d'utilisateur. Maintenant, python et matlab sont liés.

Code d'exécution

Tout d'abord, la fonction matlab à exécuter est la suivante. Placez-le dans le même dossier que le code python suivant.

function y = func(x)
y = (x-3)^2;

Après cela, démarrez Spyder et exécutez la commande suivante sur spyder

import sys 
sys.path.append("C:\\Users\\****\\anaconda3\\envs\\py36lib\\site-packages")

import matlab.engine
import optuna


def objective(trial):
    x = trial.suggest_uniform('x', -10, 10)
    #Maintenant, lisez la fonction Matlab et renvoyez le score pour x
    score =  eng.func(x)
    return score

#Fonction principale d'ici
eng = matlab.engine.start_matlab()
study = optuna.create_study()
study.optimize(objective, n_trials=1000)

Résultat d'exécution

La fonction Matlab func est appelée sur python comme indiqué ci-dessous, et le résultat est optimisé par Optune. (Dans ce cas, la valeur minimale de 3 peut être prédite avec 1000 essais). Cette fois, c'est une fonction simple, vous n'avez donc pas à la rechercher, mais ce serait plus facile si vous pouviez optimiser les fonctions complexes que vous avez créées dans le passé. Quant à la variable, "x = trial.suggest_uniform ('x', -10, 10)" de python est simplement augmenté à x1, x2 ... Même ceux qui sont bons en Matlab et pas bons en python peuvent optimiser diverses choses.

réduction
[I 2020-09-21 20:52:03,537] Trial 997 finished with value: 0.611554463759686 and parameters: {'x': 2.217980522135359}. Best is trial 551 with value: 3.107692752820123e-07.
[I 2020-09-21 20:52:03,549] Trial 998 finished with value: 1.5139869920248414 and parameters: {'x': 4.230441787336907}. Best is trial 551 with value: 3.107692752820123e-07.
[I 2020-09-21 20:52:03,560] Trial 999 finished with value: 0.5050438774658341 and parameters: {'x': 3.7106643915842654}. Best is trial 551 with value: 3.107692752820123e-07.

study.best_value
Out[14]: 3.107692752820123e-07

study.best_params
Out[15]: {'x': 2.9994425331621684}

en conclusion

Il n'y avait pas d'espace pour coller la licence de sushi. Optuna est incroyable. Mais je suis sûr que Matlab a aussi une fonction (boîte à outils) qui peut le faire ... S'il vous plaît, faites-moi savoir.

Recommended Posts

Appelez Matlab depuis Python pour optimiser
Changements de Python 3.0 à Python 3.5
Changements de Python 2 à Python 3.0
Appelez la bibliothèque Python pour la normalisation de texte depuis MATLAB
Un moyen simple d'appeler Java depuis Python
Appeler CPLEX depuis Python (DO cplex)
Publier de Python vers Slack
Flirter de PHP à Python
Anaconda mis à jour de 4.2.0 à 4.3.0 (python3.5 mis à jour vers python3.6)
Passer de python2.7 à python3.6 (centos7)
Connectez-vous à sqlite depuis python
Je voulais utiliser la bibliothèque Python de MATLAB
[Python] Comment appeler une fonction de c depuis python (édition ctypes)
Appeler des fonctions du langage C depuis Python pour échanger des tableaux multidimensionnels
Appeler C depuis Python avec DragonFFI
Publication de Python sur la chronologie Facebook
[Lambda] [Python] Publier sur Twitter depuis Lambda!
Appeler popcount depuis Ruby / Python / C #
Connectez-vous à la base de données utf8mb4 à partir de python
Python (de la première fois à l'exécution)
Publier une image de Python sur Tumblr
Appelez python de nim avec Nimpy
Comment accéder à wikipedia depuis python
Python pour passer d'une autre langue
Aller au langage pour voir et se souvenir de la partie 8 Appeler le langage GO à partir de Python
Appeler C / C ++ depuis Python sur Mac
Comment appeler Python ou Julia à partir de Ruby (implémentation expérimentale)
Appeler le langage C depuis Python (python.h)
N'a pas changé de Python 2 à 3
Mettre à jour Mac Python de 2 à 3
Appelez dlm depuis python pour exécuter un modèle de régression à coefficient variable dans le temps
[Python] Simulation de fluide: de linéaire à non linéaire
De Python à l'utilisation de MeCab (et CaboCha)
Comment mettre à jour Google Sheets à partir de Python
Manuel Python privé (mis à jour de temps en temps)
Je veux utiliser jar de python
Conversion de katakana en voyelle kana [python]
Notification push du serveur Python vers Android
Connexion de python à MySQL sur CentOS 6.4
Portage et modification du solveur de doublets de python2 vers python3.
Comment accéder à RDS depuis Lambda (python)
Python> Numéros de sortie de 1 à 100, 501 à 600> Pour csv
Convertir de Markdown en HTML en Python
Appeler des commandes depuis Python (édition Windows)
[Amazon Linux] Passage de la série Python 2 à la série Python 3
Explication API pour toucher mastodonte de python
Connectez-vous à l'API Websocket de Coincheck depuis Python
Mis à jour vers Python 2.7.9
Langage C pour voir et se souvenir de la partie 2 Appeler le langage C à partir de la chaîne Python (argument)
Somme de 1 à 10
sql à sql
Langage C pour voir et se souvenir de la partie 1 Appeler le langage C depuis Python (bonjour le monde)
MeCab de Python
Langage C pour voir et se souvenir de la partie 4 Appelez le langage C depuis Python (argument) double
"Backport" vers python 2
Langage C pour voir et se souvenir de la partie 5 Appel du langage C à partir du tableau Python (argument)
Envoyer un message de Slack à un serveur Python