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
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.
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
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)
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="")
La méthode d'ajustement est OLS (méthode de l'erreur quadratique minimale).
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)
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="")
Ça va comme ça.
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