Involute-Funktion
Bitte überprüfen Sie den Einführungsabschnitt für Details. Verschiedene Methoden zum numerischen Erstellen der Umkehrfunktion einer bestimmten Funktion Einführung - Qiita
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.
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.
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.
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.
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)
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)
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.
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.
Das für die Erklärung verwendete Notizbuch wird auf Gist hochgeladen. Involute inverse Funktion Estimation_Polypoly Regression.ipynb
Recommended Posts