[PYTHON] Introduction à l'optimisation non linéaire (I)

1. Résumé

Cette fois, j'ai résumé les grandes lignes de la méthode Newton, qui est la méthode d'optimisation non linéaire la plus connue et la plus couramment utilisée, et j'ai fourni un exemple d'implémentation en R et Python. Je l'ai utilisé (prévu) pour l'estimation des paramètres d'une méthode d'analyse avec analyse multivariée, donc je l'ai implémenté pour l'étude également.

2. Optimisation non linéaire

2.1 Qu'est-ce que c'est?

En l'état, c'est l'optimisation (= minimisation / maximisation) des fonctions non linéaires. Des exemples de fonctions non linéaires incluent $ y = x ^ 2 $ et $ y = x \ log_e x $. Par exemple, en prenant $ y = x \ log_e x $ comme exemple, si vous voulez obtenir un point qui donne la valeur minimale de cette fonction, (en supposant que vous savez que $ 0 <x $ est convexe vers le bas) ) Différencier par rapport à $ x $ $\frac{d}{dx}y = \log_e x + 1$ Tout ce que vous avez à faire est de calculer la valeur de la fonction au point où ce dégradé est de 0 . En d'autres termes $\log x_e + 1 = 0$$ Tout ce que vous avez à faire est de trouver la racine de. Au fait, $ \ hat {x} = 1 / e $. De cette façon, si l'équation peut être résolue simplement comme une étendue (si elle peut être résolue analytiquement), c'est bien, mais dans de nombreux cas, la solution ne peut pas être exprimée explicitement. Les méthodes d'optimisation non linéaires sont utiles dans de tels cas.

2.2 Méthode Newton-Raphson

Parmi les optimisations non linéaires, la méthode Newton (méthode Newton-Raphson, wiki est la méthode la plus connue, la plus simple et la plus largement utilisée. Il y a Newton% 27s_method)). Pour des détails mathématiques, voir Ici (Qu'est-ce que la méthode Newton ?? Solution approximative de l'équation résolue par la méthode Newton). Si vous êtes poliment illustré et que vous comprenez doucement les mathématiques du secondaire, je pense que vous pouvez vous faire une idée générale. Pour mettre en œuvre cela

Deux sont nécessaires. Concernant le premier, pour le moment,

\frac{d}{dx}f(x) = \underset{h\rightarrow 0}\lim \frac{f(x + h) - f(x)}{h}

Implémentons. En R,

numerical.differentiate = function(f.name, x, h = 1e-6){
  return((f.name(x+h) - f.name(x))/h)
}

Donc, en python,

def numerical_diff(func, x, h = 1e-6):
    return (func(x + h)-func(x))/h

C'est comme ça? En utilisant ceux-ci et le calcul séquentiel par la méthode de Newton,

\log_e x + 1 = 0

Résolvons. Un exemple d'exécution dans R est

newton.raphson(f.5, 100, alpha = 1e-3) # 0.3678798

Un exemple d'exécution en python est

newton_m(f_1, 100, alpha = 1e-3) # 0.36787980890600075

Vous pouvez voir que les deux sont proches de la solution de l'équation ci-dessus $ 1 / e \ Fallingdotseq1 / 2.718 = 0.3679176 $.

3. Exemple de code

C'est un code divers ...

{r, newton_raphson.R}


numerical.differentiate = function(f.name, x, h = 1e-6){
  return((f.name(x+h) - f.name(x))/h)
}

newton.raphson = function(equa, ini.val, alpha = 1, tol = 1e-6){
  x = ini.val
  while(abs(equa(x)) > tol){
    #print(x)
    grad = numerical.differentiate(equa, x)
    x = x - alpha * equa(x)/grad
  }
  return(x)
}

f.5 = function(x)return(log(x) + 1)
newton.raphson(f.5, 100, alpha = 1e-3)

{python, newton_raphson.py}


import math
def numerical_diff(func, x, h = 1e-6):
    return (func(x + h)-func(x))/h

def newton_m(func, ini, alpha = 1, tol = 1e-6):
    x = ini
    while abs(func(x)) > tol:
        grad = numerical_diff(func, x)
        x = x - alpha * func(x)/grad
    return x

def f_1(x):
    return math.log(x) + 1

print(newton_m(f_1, 100, alpha = 1e-3))

Pour que la méthode de Newton converge vers une solution optimale globale, la fonction à optimiser doit avoir une solution optimale globale dans l'intervalle d'optimisation $ [a, b] $ et être convexe dans cet intervalle. Faisons attention. Le programme que j'écrivais n'était pas facile à comprendre car il s'agissait d'un cas de variables multiples, mais il est simple et facile à comprendre dans le cas d'une variable. La précision du calcul dépend du paramètre tol et du paramètre h.

Recommended Posts

Introduction à l'optimisation non linéaire (I)
Introduction à l'optimisation bayésienne
Introduction à Scrapy (1)
Introduction à Scrapy (3)
Premiers pas avec Supervisor
Introduction à Tkinter 1: Introduction
Introduction à PyQt
Introduction à Scrapy (2)
[Linux] Introduction à Linux
[Introduction à Pytorch] J'ai joué avec sinGAN ♬
Introduction à Scrapy (4)
Introduction à discord.py (2)
[Introduction à json] Non, j'en étais accro. .. .. ♬
J'ai écrit "Introduction à la vérification des effets" en Python
[Introduction au PID] J'ai essayé de contrôler et de jouer ♬
Introduction à Lightning Pytorch
J'ai commencé à analyser
Introduction aux baies non paramétriques
Introduction à EV3 / MicroPython
Introduction à la reconnaissance d'image TensorFlow
Introduction à OpenCV (python) - (2)
J'ai essayé de déboguer.
Introduction à PyQt4 Partie 1
Introduction à l'injection de dépendances
Introduction à Private Chainer
J'ai essayé l'optimisation bayésienne!
Introduction à l'apprentissage automatique
Je veux gérer l'optimisation avec python et cplex
J'ai essayé de résumer quatre méthodes d'optimisation de réseau neuronal
[Introduction à Pytorch] J'ai essayé de catégoriser Cifar10 avec VGG16 ♬
J'ai essayé de passer par l'optimisation bayésienne. (Avec des exemples)
[Introduction à AWS] J'ai essayé de jouer avec la conversion voix-texte ♪
AOJ Introduction à la programmation Sujet 1, Sujet 2, Sujet 3, Sujet 4
Introduction au module de papier électronique
Introduction à l'algorithme de recherche de dictionnaire
Introduction à la méthode Monte Carlo
Introduction à Python Django (2) Win
Introduction à l'écriture de Cython [Notes]
J'ai essayé d'apprendre PredNet
Introduction à Private TensorFlow
Une super introduction à Linux
Introduction à l'apprentissage automatique avec scikit-learn - De l'acquisition de données à l'optimisation des paramètres
AOJ Introduction à la programmation Sujet n ° 7, Sujet n ° 8
Enquête Star avec optimisation des combinaisons
[J'ai essayé d'utiliser Pythonista 3] Introduction
J'ai essayé de simuler l'optimisation des publicités à l'aide de l'algorithme Bandit
J'ai essayé d'organiser SVM.
J'ai parlé à Raspberry Pi
Introduction à la détection des anomalies 1 principes de base
[Introduction à la simulation] J'ai essayé de jouer en simulant une infection corona ♬
Introduction à RDB avec sqlalchemy Ⅰ
[Introduction au système] Retracement de Fibonacci ♬
Introduction à la communication série [Python]
J'ai appliqué LightFM à Movielens
Je veux résoudre SUDOKU
J'ai essayé de résoudre le problème d'optimisation des combinaisons avec Qiskit