[PYTHON] Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Partie 1 Régression polynomiale

Confirmation du problème

Fonction Involute f(\alpha) = tan\ \alpha - \alpha Trouvez la fonction inverse de $ f ^ {-1} $.

インボリュート逆関数.png

Veuillez consulter la section d'introduction pour plus de détails. Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Introduction --Qiita

Comment représenter la fonction inverse

La première méthode que j'ai proposée était une approximation polymorphe. La fonction inverse que je veux trouver est une fonction à croissance monotone, et j'ai pensé que même un polypole pouvait être approché avec une précision raisonnable. Autrement dit, la fonction inverse $ y = a_0 + a_1x + a_2x^{2} + ...$ En l'exprimant ainsi, c'est une idée qu'une valeur proche peut être obtenue.

Comment trouver un polymorphe

Le problème est de savoir comment déterminer les coefficients polynomiaux $ a_0, a_1, a_2, ... $. Les coefficients doivent être déterminés de manière à minimiser la différence entre la valeur $ y $ obtenue par le polypole et la valeur vraie. Bien que scikit-learn soit une bibliothèque pour l'apprentissage automatique, j'ai trouvé qu'elle peut être utilisée pour déterminer automatiquement les coefficients des polynômes.

Génération de données d'entraînement

Générez des données d'entraînement pour l'entraînement à l'aide de la fonction Involute.

Notebook


def involute(α):
    return np.tan(α) - α

Notebook


y = np.linspace(- np.pi / 4, np.pi / 4, 1000)
x = involute(y)

Selon la convention d'apprentissage automatique, l'entrée ($ inv \ alpha $) est $ x $ et la sortie ($ \ alpha $) est $ y $. Préparez d'abord la valeur de $ y $ ($ \ alpha $), trouvez la valeur de $ x $ ($ inv \ alpha $) à l'aide de la fonction incorporer et utilisez-la comme données d'apprentissage.

Ajuster des polynômes à l'aide de scikit-learn

Vous pouvez facilement ajuster des polynômes avec scikit-learn.

Tout d'abord, importez les bibliothèques requises.

Notebook


from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
from sklearn.pipeline import make_pipeline

Les données d'apprentissage générées ci-dessus sont un tableau unidimensionnel, mais dans scikit-learn, les données sont essentiellement un vecteur de colonne, elles sont donc converties en vecteur de colonne.

Notebook


x_column = x.reshape(-1, 1)
y_column = y.reshape(-1, 1)

Tout d'abord, ajustons un polypole d'ordre 10.

Notebook


model_poly = make_pipeline(PolynomialFeatures(degree=10), LinearRegression())
model_poly.fit(x_column, y_column)
model_poly.score(x_column, y_column)

output


0.95581676585298314

PolynomialFeatures (degree = 10) est la conversion en un polymorphe d'ordre 10, LinearRegression () est la génération d'un modèle de régression linéaire, et ils sont combinés avec la fonction make_pipeline pour créer un modèle de régression polynomiale. Les données d'apprentissage sont données à la méthode d'ajustement du modèle créé pour s'adapter au polypole. La méthode du score évalue numériquement le degré de précision de l'estimation. Si cette valeur est de 1,0, cela signifie qu'elle peut être parfaitement estimée.

Graphique des estimations par modèle de régression polypoly

Tracons maintenant les valeurs estimées par le modèle de régression polypoly.

Notebook


y_pred = model_poly.predict(x_column).flatten()
fig = figure(width=400, height=400)
fig.scatter(x, np.degrees(y), size=1, legend='vraie valeur')
fig.line(x, np.degrees(y_pred), line_color='orange', legend='Valeur estimée')
fig.xaxis.axis_label = 'invα'
fig.yaxis.axis_label = 'Angle de pression α(deg)'
fig.legend.location = 'top_left'
show(fig)
インボリュート逆関数_10次多項式.png

La valeur d'entrée est donnée à la méthode de prédiction pour obtenir la valeur estimée. Le graphique ci-dessus est le résultat du tracé des estimations obtenues. La précision de l'estimation est trop mauvaise.

Que diriez-vous d'augmenter la commande à 20?

Notebook


model_poly = make_pipeline(PolynomialFeatures(degree=20), LinearRegression())
model_poly.fit(x_column, y_column)
model_poly.score(x_column, y_column)

output


0.97492606041826035

Notebook


y_pred = model_poly.predict(x_column).flatten()
fig = figure(width=400, height=400)
fig.scatter(x, np.degrees(y), size=1, legend='vraie valeur')
fig.line(x, np.degrees(y_pred), line_color='orange', legend='Valeur estimée')
fig.xaxis.axis_label = 'invα'
fig.yaxis.axis_label = 'Angle de pression α(deg)'
fig.legend.location = 'top_left'
show(fig)
インボリュート逆関数_20次多項式.png

Même si elle est augmentée au 20e ordre, la vague de fluctuation n'est que faible et il n'y a pas beaucoup d'amélioration. Il est peu probable qu'il soit préférable d'augmenter la commande telle quelle.

Pourquoi la régression polypoly ne peut pas estimer correctement

Je pense que le grand gradient près de l'origine est la raison pour laquelle il ne peut pas être bien estimé par régression polypoly. La fonction inverse inverse a un dégradé infini à l'origine, mais tant que vous utilisez un polypole, vous ne pouvez jamais exprimer un dégradé infini.

Code source

Le bloc-notes utilisé pour l'explication est téléchargé sur Gist. Involute inverse function estimation_polypoly regression.ipynb

Recommended Posts

Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Partie 1 Régression polynomiale
Diverses méthodes pour créer numériquement la fonction inverse d'une certaine fonction Introduction
Créez une fonction pour obtenir le contenu de la base de données dans Go
Comment créer un wrapper qui préserve la signature de la fonction à envelopper
Créer une fonction pour visualiser / évaluer le résultat du clustering
J'ai fait une fonction pour vérifier le modèle de DCGAN
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
[Go] Créez une commande CLI pour changer l'extension de l'image
[Python3] Définition d'un décorateur qui mesure le temps d'exécution d'une fonction
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 1)
[Python] Une fonction simple pour trouver les coordonnées du centre d'un cercle
4 méthodes pour compter le nombre d'occurrences d'entiers dans un certain intervalle (y compris la méthode imos) [implémentation Python]
Python: je souhaite mesurer proprement le temps de traitement d'une fonction
J'ai créé une fonction pour voir le mouvement d'un tableau à deux dimensions (Python)
10 méthodes pour améliorer la précision de BERT
Différentes façons de créer un dictionnaire (mémoires)
Différentes façons de lire la dernière ligne d'un fichier csv en Python
[Circuit x Python] Comment trouver la fonction de transfert d'un circuit en utilisant Lcapy
Obtenez le nombre de tweets liés à un certain mot-clé à l'aide de l'API Twitter
[Vérification] Essayez d'aligner le groupe de points avec la fonction d'optimisation de pytorch Partie 1
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Comment calculer la volatilité d'une marque
[Python] Compréhension de liste Différentes façons de créer une liste
Comment créer un objet fonction à partir d'une chaîne
[python] Créer une liste de différents types de caractères
Récupérer l'appelant d'une fonction en Python
Créez une commande pour obtenir le journal de travail
Essayez de créer une table d'enregistrement de bataille avec matplotlib à partir des données de "Schedule-kun"
[Ruby] Comment remplacer uniquement une partie de la chaîne de caractères correspondant à l'expression régulière?
Annoncer les prévisions météorologiques (pluie, etc.) par DM dans le cadre de la fonction de bot
Ajouter une fonction pour indiquer la météo d'aujourd'hui au bot slack (fabriqué par python)
Lire la source Python-Markdown: Comment créer un analyseur
Créer un ensemble de données d'images à utiliser pour la formation
Explication du concept d'analyse de régression à l'aide de python Partie 2
Un mémo pour comprendre visuellement l'axe des pandas.
Découpez une partie de la chaîne à l'aide d'une tranche Python
Comment créer un sous-menu avec le plug-in [Blender]
Implémentation python de la classe de régression linéaire bayésienne
#Une fonction qui renvoie le code de caractère d'une chaîne de caractères
Explication du concept d'analyse de régression à l'aide de Python Partie 1
Étapes pour calculer la probabilité d'une distribution normale
Tweetez la probabilité de précipitations dans le cadre de la fonction de bot
J'ai essayé d'effacer la partie négative de Meros
Comment frapper le document de Magic Function (Line Magic)
Note Python: Le mystère de l'attribution d'une variable à une variable
[Linux] [C / C ++] Comment obtenir la valeur d'adresse de retour d'une fonction et le nom de fonction de l'appelant
Django super introduction par les débutants Python! Partie 6 J'ai essayé d'implémenter la fonction de connexion
Ce qui semble être un modèle pour la partie d'entrée standard du pro de la concurrence en python3
J'ai créé une fonction pour découper l'image de python openCV, alors veuillez l'utiliser.
Lorsqu'une chaîne de caractères d'une certaine série se trouve dans la clé du dictionnaire, la chaîne de caractères est convertie en valeur du dictionnaire.
Créez un tableau à deux dimensions en ajoutant une ligne à la fin d'un tableau vide avec numpy