Modélisation de fonctions non linéaires en Python

Choses à faire

J'expliquerai comment approximer et modéliser la valeur observée (ensemble de x, y) avec la fonction spécifiée en Python.

Diagramme d'image: je vais faire quelque chose comme ça image

L'ajustement des fonctions est la base de la modélisation. S'il s'agit d'une approximation linéaire, vous pouvez généralement utiliser le package de régression linéaire, Ici, nous expliquerons comment s'adapter à toute fonction que vous spécifiez, y compris les fonctions non linéaires.

Quoi utiliser

Utilisez le module "curve_fit" dans le paquet Python scipy. Plus précisément, il fait partie du module scipy.optimize.

Commencez par charger le package à utiliser cette fois.

import.py


##Quoi utiliser pour le montage
from scipy.optimize import curve_fit
import numpy as np

##Quoi utiliser pour l'illustration
import seaborn as sns
import matplotlib.pyplot as plt

numpy est utilisé pour représenter des fonctions exponentielles. Si vous n'êtes pas familier avec la méthode d'illustration utilisant seaborn, veuillez cliquer ici.

Beau dessin graphique avec python http://qiita.com/hik0107/items/3dc541158fceb3156ee0

Comment faire - Essayez d'abord avec une fonction linéaire

Voyons en fait comment faire un ajustement de fonction Tout d'abord, je vais essayer une approximation linéaire pour le nivellement des bras.

Créez les données d'observation à ajuster comme suit. Puisqu'elle se rapproche linéairement, préparez une forme proche d'une ligne droite.

linear.py


list_linear_x = range(0,20,2)

array_error = np.random.normal(size=len(list_linear_x))

array_x = np.array(list_linear_x)
array_y = array_x + array_error ##Terminer y=Je crée des données cahoteuses en ajoutant un terme d'erreur à la ligne droite de x

Jetons un coup d'œil aux données réellement complétées.

linear.py


sns.pointplot(x=array_x, y=array_y, join=False)

image

Maintenant, ajustons cela sous la forme Y = ax + b. C'est là qu'intervient curve_fit.

fitting.py


##Définissez l'expression de fonction que vous souhaitez adapter en tant que fonction
def linear_fit(x, a, b):
    return a*x + b

param, cov = curve_fit(linear_fit, array_x, array_y)

Seulement ça. Les résultats de l'estimation des paramètres a et b sont stockés au format liste dans la première valeur de retour param. Le contenu de curve_fit s'écrit (fonction utilisée pour l'ajustement, x pour l'ajustement, y pour l'ajustement). Si les 2ème et 3ème arguments sont décrits dans la liste d'inclusion de liste, il est possible de traiter le cas de plusieurs variables.

Voyons le résultat du montage.

fitting.py


array_y_fit = param[0] * array_x + param[1]

sns.pointplot(x=array_x, y=array_y, join=False)
sns.pointplot(x=array_x, y=array_y_fit, markers="")

image

La méthode d'ajustement est OLS (méthode de l'erreur quadratique minimale).

Méthode-Try avec une fonction non linéaire

Ensuite, essayons une approximation avec une fonction non linéaire légèrement plus compliquée. Par exemple, considérons une fonction telle que f (x) = b * exp (x / (a + x)).

nonlinear.py


list_y = []

for num in array_x:
    list_y.append( param[1] * np.exp( num /(param[0] + num) ) + np.random.rand() )

array_y= np.array(list_y)
sns.pointplot(x=array_x, y=array_y, join=False)

image

J'ai des données comme ça. D'une manière ou d'une autre, une fonction non linéaire du type qui converge semble mieux convenir qu'une fonction linéaire.

Maintenant, ajustons cela sous la forme f (x) = b * exp (x / (a + x)).

fitting.py


def nonlinear_fit(x,a,b):
    return  b * np.exp(x / (a+x)  )

param, cov = curve_fit(nonlinear_fit, array_x, array_y)

draw.py


list_y = []
for num in array_x:
    list_y.append( param[1] * np.exp( num /(param[0] + num) ))

sns.pointplot(x=array_x, y=array_y, join=False)
sns.pointplot(x=array_x, y=np.array(list_y), markers="")

image

Ça va comme ça.

Cet article aussi

Un résumé rudimentaire de la manipulation des données dans Python Pandas http://qiita.com/hik0107/items/d991cc44c2d1778bb82e

Analyse des données en Python Résumé des sources que les débutants devraient d'abord consulter http://qiita.com/hik0107/items/0bec82cc09d0e05d5357

Si vous êtes intéressé par les data scientists, regardez d'abord ici, un résumé de la littérature et des vidéos http://qiita.com/hik0107/items/ef5e044d2f47940ba712

Recommended Posts

Modélisation de fonctions non linéaires en Python
Modélisation Uplift en Python
Créer une fonction en Python
Utiliser la fonction de rappel en Python
Fonction ntile (décile) en python
Dessiner la fonction Yin en python
Fonction immédiate (lie) en python
fonction python ①
[Python] fonction
fonction python ②
Implémenter la fonction power.prop.test de R en python
Définition du type d'argument de fonction en python
Notation inclusive dans l'argument de la fonction Python
Ecrire une fonction AWS Lambda en Python
Mesurer le temps d'exécution de la fonction en Python
Synthèse de fonctions et application en Python
Quadtree en Python --2
CURL en Python
Métaprogrammation avec Python
Python 3.3 avec Anaconda
Géocodage en python
SendKeys en Python
fonction d'énumération python
Méta-analyse en Python
Précautions lors du décapage d'une fonction en python
Unittest en Python
Implémenté en Python PRML Chapitre 7 SVM non linéaire
Prenez la somme logique de List en Python (fonction zip)
Python> fonction> Fermeture
Discord en Python
[Python] Fonction de générateur
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
Python> fonction> Fonction interne
CSV en Python
Assemblage inversé avec Python
Réflexion en Python
Dualité en fonction
Constante en Python
nCr en Python.
format en python
Scons en Python 3
Puyopuyo en python
python dans virtualenv
PPAP en Python
Décorateur de fonction Python
Quad-tree en Python
Réflexion en Python
Chimie avec Python
Hashable en Python