[PYTHON] Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Teil 1 Polynomregression

Bestätigung des Problems

Involute-Funktion f(\alpha) = tan\ \alpha - \alpha Finden Sie die Umkehrfunktion von $ f ^ {-1} $.

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

Bitte überprüfen Sie den Einführungsabschnitt für Details. Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung - Qiita

Darstellung der Umkehrfunktion

Die erste Methode, die ich mir ausgedacht habe, war eine polymorphe Näherung. Die Umkehrfunktion, die ich finden möchte, ist eine monoton ansteigende Funktion, und ich dachte, dass sogar ein Polypoly mit angemessener Genauigkeit angenähert werden könnte. Das heißt, die Umkehrfunktion $ y = a_0 + a_1x + a_2x^{2} + ...$ Wenn man es so ausdrückt, ist es eine Idee, dass ein enger Wert erhalten werden kann.

Wie man ein polymorphes findet

Das Problem ist, wie die Polynomkoeffizienten $ a_0, a_1, a_2, ... $ bestimmt werden. Die Koeffizienten sollten so bestimmt werden, dass die Differenz zwischen dem durch das Polypoly erhaltenen $ y $ -Wert und dem wahren Wert minimiert wird. Obwohl scikit-learn eine Bibliothek für maschinelles Lernen ist, habe ich festgestellt, dass es verwendet werden kann, um die Koeffizienten von Polynomen automatisch zu bestimmen.

Generierung von Trainingsdaten

Generieren Sie Trainingsdaten für das Training mit der Involute-Funktion.

Notebook


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

Notebook


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

Gemäß der Konvention des maschinellen Lernens ist die Eingabe ($ inv \ alpha $) $ x $ und die Ausgabe ($ \ alpha $) $ y $. Bereiten Sie zuerst den Wert von $ y $ ($ \ alpha $) vor, ermitteln Sie den Wert von $ x $ ($ inv \ alpha $) mithilfe der Evolventenfunktion und verwenden Sie ihn als Trainingsdaten.

Anpassen von Polynomen mit Scikit-Learn

Mit scikit-learn können Sie Polynome leicht anpassen.

Importieren Sie zunächst die erforderlichen Bibliotheken.

Notebook


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

Die oben generierten Trainingsdaten sind ein eindimensionales Array, aber beim Scikit-Lernen sind die Daten im Grunde genommen ein Spaltenvektor, sodass sie in einen Spaltenvektor konvertiert werden.

Notebook


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

Lassen Sie uns zunächst ein Polypoly 10. Ordnung anpassen.

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 (Grad = 10) ist die Konvertierung in ein polymorphes 10. Ordnung, LinearRegression () ist die Erzeugung eines linearen Regressionsmodells und sie werden mit der Funktion make_pipeline kombiniert, um ein polynomielles Regressionsmodell zu erstellen. Die Trainingsdaten werden der Anpassungsmethode des erstellten Modells zur Anpassung an das Polypoly übergeben. Die Bewertungsmethode bewertet numerisch den Grad der Schätzgenauigkeit. Wenn dieser Wert 1,0 ist, bedeutet dies, dass er perfekt geschätzt werden kann.

Darstellung der Schätzungen nach Polypoly-Regressionsmodell

Zeichnen wir nun die vom Polypoly-Regressionsmodell geschätzten Werte.

Notebook


y_pred = model_poly.predict(x_column).flatten()
fig = figure(width=400, height=400)
fig.scatter(x, np.degrees(y), size=1, legend='wahrer Wert')
fig.line(x, np.degrees(y_pred), line_color='orange', legend='Geschätzter Wert')
fig.xaxis.axis_label = 'invα'
fig.yaxis.axis_label = 'Druckwinkel α(deg)'
fig.legend.location = 'top_left'
show(fig)
インボリュート逆関数_10次多項式.png

Der Eingabewert wird an die Vorhersagemethode übergeben, um den geschätzten Wert zu erhalten. Die obige Grafik ist das Ergebnis der Darstellung der erhaltenen Schätzungen. Die Schätzgenauigkeit ist zu schlecht.

Wie wäre es mit einer Erhöhung der Bestellung auf 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='wahrer Wert')
fig.line(x, np.degrees(y_pred), line_color='orange', legend='Geschätzter Wert')
fig.xaxis.axis_label = 'invα'
fig.yaxis.axis_label = 'Druckwinkel α(deg)'
fig.legend.location = 'top_left'
show(fig)
インボリュート逆関数_20次多項式.png

Selbst wenn es auf die 20. Ordnung erhöht wird, ist die Fluktuationswelle nur gering und es gibt keine große Verbesserung. Es ist unwahrscheinlich, dass es besser ist, die Reihenfolge so zu erhöhen, wie sie ist.

Warum die Polypoly-Regression nicht gut abschätzen kann

Ich denke, dass der große Gradient in der Nähe des Ursprungs der Grund ist, warum er durch Polypoly-Regression nicht gut geschätzt werden kann. Die inverse Umkehrfunktion hat am Ursprung einen unendlichen Gradienten, aber solange Sie ein Polypoly verwenden, können Sie niemals einen unendlichen Gradienten ausdrücken.

Quellcode

Das für die Erklärung verwendete Notizbuch wird auf Gist hochgeladen. Involute inverse Funktion Estimation_Polypoly Regression.ipynb

Recommended Posts

Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Teil 1 Polynomregression
Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung
Erstellen Sie eine Funktion, um den Inhalt der Datenbank in Go abzurufen
So erstellen Sie einen Wrapper, der die Signatur der zu umschließenden Funktion beibehält
Erstellen Sie eine Funktion zur Visualisierung / Auswertung des Clustering-Ergebnisses
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
[Los] Erstellen Sie einen CLI-Befehl, um die Erweiterung des Bildes zu ändern
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 1)
[Python] Eine einfache Funktion zum Ermitteln der Mittelkoordinaten eines Kreises
4 Methoden zum Zählen der Anzahl von Ganzzahlen in einem bestimmten Intervall (einschließlich der imos-Methode) [Python-Implementierung]
Python: Ich möchte die Verarbeitungszeit einer Funktion genau messen
Ich habe eine Funktion erstellt, um die Bewegung eines zweidimensionalen Arrays (Python) zu sehen.
10 Methoden zur Verbesserung der Genauigkeit von BERT
Verschiedene Möglichkeiten, ein Wörterbuch zu erstellen (Erinnerungen)
Verschiedene Möglichkeiten, die letzte Zeile einer CSV-Datei in Python zu lesen
[Circuit x Python] So ermitteln Sie die Übertragungsfunktion eines Schaltkreises mit Lcapy
Ermitteln Sie mithilfe der Twitter-API die Anzahl der Tweets, die sich auf ein bestimmtes Keyword beziehen
[Überprüfung] Versuchen Sie, die Punktgruppe an der Optimierungsfunktion von Pytorch Part 1 auszurichten
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
So berechnen Sie die Volatilität einer Marke
[Python] Listenverständnis Verschiedene Möglichkeiten zum Erstellen einer Liste
So erstellen Sie ein Funktionsobjekt aus einer Zeichenfolge
[Python] Erstellen Sie eine Liste mit verschiedenen Zeichentypen
Holen Sie sich den Aufrufer einer Funktion in Python
Erstellen Sie einen Befehl, um das Arbeitsprotokoll abzurufen
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
[Ruby] Wie ersetze ich nur einen Teil der Zeichenkette, der mit dem regulären Ausdruck übereinstimmt?
Kündigen Sie die Wettervorhersage (Regen usw.) von DM als Teil der Funktion des Bots an
Fügen Sie eine Funktion hinzu, um dem Wetter heute mitzuteilen, dass der Bot locker ist (hergestellt von Python).
Lesen Sie die Python-Markdown-Quelle: So erstellen Sie einen Parser
Erstellen Sie einen Datensatz mit Bildern, die für das Training verwendet werden sollen
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 2
Ein Memo zum visuellen Verstehen der Achse von Pandas.Panel
Schneiden Sie einen Teil der Zeichenfolge mit einem Python-Slice aus
So erstellen Sie ein Untermenü mit dem Plug-In [Blender]
Python-Implementierung der Bayes'schen linearen Regressionsklasse
#Eine Funktion, die den Zeichencode einer Zeichenfolge zurückgibt
Erläuterung des Konzepts der Regressionsanalyse mit Python Teil 1
Schritte zur Berechnung der Wahrscheinlichkeit einer Normalverteilung
Tweet die Niederschlagswahrscheinlichkeit als Teil der Funktion des Bots
Ich habe versucht, den negativen Teil von Meros zu löschen
Wie man das Dokument der magischen Funktion (Linienmagie) trifft
Python Hinweis: Das Rätsel, einer Variablen eine Variable zuzuweisen
[Linux] [C / C ++] So ermitteln Sie den Wert der Rücksprungadresse einer Funktion und den Funktionsnamen des Aufrufers
Django super Einführung von Python-Anfängern! Teil 6 Ich habe versucht, die Login-Funktion zu implementieren
Was scheint eine Vorlage für den Standardeingabe-Teil des Competition Pro in Python3 zu sein
Ich habe eine Funktion zum Trimmen des Bildes von Python openCV erstellt. Verwenden Sie sie daher bitte.
Wenn sich eine Zeichenfolge einer bestimmten Reihe im Schlüssel des Wörterbuchs befindet, wird die Zeichenfolge in den Wert des Wörterbuchs konvertiert.
Erstellen Sie ein zweidimensionales Array, indem Sie am Ende eines leeren Arrays mit numpy eine Zeile hinzufügen