Sie müssen Sympy verwenden: sympy.org/en/index.html Numpy ist eine numerische Berechnungsbibliothek für Python
prrao
Möchten Sie alternativ eine Methode zur Schätzung des numerischen Werts der Ableitung? Hierfür können Sie eine Finite-Differenzen-Methode verwenden, aber denken Sie daran, dass sie dazu neigen, schrecklich laut zu sein.
Endliche Unterschiede erfordern keine externen Tools, sind jedoch anfällig für numerische Fehler und können in einer multivariaten Situation eine Weile dauern.
Die symbolische Differenzierung ist ideal, wenn Ihr Problem einfach genug ist. Symbolische Methoden werden heutzutage ziemlich robust. SymPy ist hierfür ein hervorragendes Projekt, das sich gut in NumPy integrieren lässt. Schauen Sie sich die Autowrap- oder Lambdify-Funktionen an oder lesen Sie Jensens Blogpost über eine ähnliche Frage .
Automatische Ableitungen sind sehr cool, nicht anfällig für numerische Fehler, erfordern jedoch einige zusätzliche Bibliotheken (Google gibt dafür einige gute Optionen). Dies ist die robusteste, aber auch die raffinierteste / am schwierigsten einzurichtende Wahl. Wenn Sie sich auf die numpySyntax beschränken möchten, ist Theano möglicherweise eine gute Wahl.
Hier ist ein Beispiel mit SymPy
In[1]:from sympy import*In[2]:import numpy as npIn[3]: x =Symbol('x')In[4]: y = x**2+1In[5]: yprime = y.diff(x)In[6]: yprimeOut[6]:2⋅xIn[7]: f = lambdify(x, yprime,'numpy')In[8]: f(np.ones(5))Out[8]:[2.2.2.2.2.]
Entschuldigung, wenn dies dumm erscheint, was sind die Unterschiede zwischen 3.Symbolic Differentiation und 4.by Hand Differentiation?
DrStrangeLove
10
Als ich "symbolische Differenzierung" sagte, wollte ich implizieren, dass der Prozess von einem Computer abgewickelt wurde. Grundsätzlich unterscheiden sich 3 und 4 nur dadurch, wer die Arbeit erledigt, der Computer oder der Programmierer. Aufgrund der Konsistenz, Skalierbarkeit und Faulheit wird 3 gegenüber 4 bevorzugt. 4 ist notwendig, wenn 3 keine Lösung findet.
MRocklin
4
In Zeile 7 haben wir f gemacht, eine Funktion, die die Ableitung von y wrt x berechnet. In 8 wenden wir diese Ableitungsfunktion auf einen Vektor aller Einsen an und erhalten den Vektor aller Zweien. Dies liegt daran, dass, wie in Zeile 6 angegeben, yprime = 2 * x ist.
MRocklin
Der Vollständigkeit halber können Sie auch eine Differenzierung durch Integration vornehmen (siehe Cauchys Integralformel), die zB in implementiert ist mpmath(nicht sicher, aber was genau sie tun).
x = numpy.linspace(0,10,1000)
dx = x[1]-x[0]
y = x**2+1
dydx = numpy.gradient(y, dx)
Auf diese Weise wird dydx unter Verwendung zentraler Differenzen berechnet und hat die gleiche Länge wie y, im Gegensatz zu numpy.diff, das Vorwärtsdifferenzen verwendet und einen Größenvektor (n-1) zurückgibt.
@ weberc2, in diesem Fall sollten Sie einen Vektor durch einen anderen teilen, aber die Kanten getrennt manuell mit Vorwärts- und Rückwärtsableitungen behandeln.
Wunderkerze
2
Oder Sie interpolieren y mit einer Konstanten dx und berechnen dann den Gradienten.
IceArdor
@ Parkler Danke für deinen Vorschlag. Wenn ich 2 kleine Fragen stellen kann, (i) , warum geben wir dxan numpy.gradientstatt x? (ii) Können wir auch Ihre letzte Zeile wie folgt machen : dydx = numpy.gradient(y, numpy.gradient(x))?
user929304
2
Ab Version 1.13 kann ein ungleichmäßiger Abstand mithilfe eines Arrays als zweites Argument angegeben werden. Siehe den Abschnitt Beispiele auf dieser Seite .
Nathaniel Jones
26
NumPy bietet keine allgemeine Funktionalität zum Berechnen von Derivaten. Es kann jedoch den einfachen Spezialfall von Polynomen behandeln:
>>> p = numpy.poly1d([1,0,1])>>>print p21 x +1>>> q = p.deriv()>>>print q2 x>>> q(5)10
Wenn Sie die Ableitung numerisch berechnen möchten, können Sie für die überwiegende Mehrheit der Anwendungen die Verwendung zentraler Differenzquotienten vermeiden. Für die Ableitung in einem einzelnen Punkt wäre die Formel ungefähr so
'Die Berechnung numerischer Ableitungen für allgemeinere Fälle ist einfach' - Ich bin anderer Meinung, die Berechnung numerischer Ableitungen für allgemeine Fälle ist ziemlich schwierig. Sie haben gerade gut benommene Funktionen gewählt.
High Performance Mark
Was bedeutet 2 nach >>> Drucken von p? (in der 2. Zeile)
DrStrangeLove
@ DrStrangeLove: Das ist der Exponent. Es soll die mathematische Notation simulieren.
Sven Marnach
@SvenMarnach ist es maximaler Exponent? oder was?? Warum glaubt es, dass der Exponent 2 ist? Wir haben nur Koeffizienten eingegeben ...
DrStrangeLove
2
@DrStrangeLove: Die Ausgabe soll gelesen werden als 1 * x**2 + 1. Sie setzen das 2in die obige Zeile, weil es ein Exponent ist. Schau es dir aus der Ferne an.
Sven Marnach
13
Angenommen, Sie möchten verwenden numpy, können Sie die Ableitung einer Funktion an jedem Punkt mithilfe der rigorosen Definition numerisch berechnen :
def d_fun(x):
h =1e-5#in theory h is an infinitesimalreturn(fun(x+h)-fun(x))/h
Ich werde eine andere Methode auf den Stapel werfen ...
scipy.interpolateDie vielen interpolierenden Splines können Ableitungen bereitstellen. Bei Verwendung eines linearen Splines ( k=1) sollte die Ableitung des Splines (unter Verwendung der derivative()Methode) einer Vorwärtsdifferenz entsprechen. Ich bin nicht ganz sicher, aber ich glaube, dass die Verwendung einer kubischen Spline-Ableitung einer zentrierten Differenzableitung ähnlich wäre, da sie Werte von vorher und nachher verwendet, um den kubischen Spline zu konstruieren.
from scipy.interpolate importInterpolatedUnivariateSpline# Get a function that evaluates the linear spline at any x
f =InterpolatedUnivariateSpline(x, y, k=1)# Get a function that evaluates the derivative of the linear spline at any x
dfdx = f.derivative()# Evaluate the derivative dydx at each x location...
dydx = dfdx(x)
Ich habe es gerade versucht, ich bekomme immer wieder Fehler von dieser Funktion. AxisError: Achse -1 ist für ein Array der Dimension 0 außerhalb der Grenzen und ich sehe auch keine Antworten darauf in der Community, irgendeine Hilfe?
Ayan Mitra
Stellen Sie Ihr Problem als neue Frage und verlinken Sie hier. Es ist wahrscheinlich erforderlich, ein Beispiel anzugeben, das dazu führt, dass Ihr Fehler auftritt. Fehler, die ich bei Interp-Funktionen habe, sind normalerweise darauf zurückzuführen, dass die Daten nicht gut geformt sind - wie wiederholte Werte, falsche Anzahl von Dimensionen, eines der Arrays ist versehentlich leer, Daten werden nicht nach x sortiert oder wenn sortiert nicht a gültige Funktion usw. Es ist möglich, dass scipy numpy falsch aufruft, aber sehr unwahrscheinlich. Überprüfen Sie x.shape und y.shape. Überprüfen Sie, ob np.interp () funktioniert. Andernfalls wird möglicherweise ein hilfreicherer Fehler angezeigt.
Flutefreak7
5
Zur Berechnung von Verläufen verwendet die Community für maschinelles Lernen Autograd:
Antworten:
Sie haben vier Möglichkeiten
Endliche Unterschiede erfordern keine externen Tools, sind jedoch anfällig für numerische Fehler und können in einer multivariaten Situation eine Weile dauern.
Die symbolische Differenzierung ist ideal, wenn Ihr Problem einfach genug ist. Symbolische Methoden werden heutzutage ziemlich robust. SymPy ist hierfür ein hervorragendes Projekt, das sich gut in NumPy integrieren lässt. Schauen Sie sich die Autowrap- oder Lambdify-Funktionen an oder lesen Sie Jensens Blogpost über eine ähnliche Frage .
Automatische Ableitungen sind sehr cool, nicht anfällig für numerische Fehler, erfordern jedoch einige zusätzliche Bibliotheken (Google gibt dafür einige gute Optionen). Dies ist die robusteste, aber auch die raffinierteste / am schwierigsten einzurichtende Wahl. Wenn Sie sich auf die
numpy
Syntax beschränken möchten, ist Theano möglicherweise eine gute Wahl.Hier ist ein Beispiel mit SymPy
quelle
mpmath
(nicht sicher, aber was genau sie tun).Der einfachste Weg, den ich mir vorstellen kann, ist die Verwendung der Gradientenfunktion von numpy :
Auf diese Weise wird dydx unter Verwendung zentraler Differenzen berechnet und hat die gleiche Länge wie y, im Gegensatz zu numpy.diff, das Vorwärtsdifferenzen verwendet und einen Größenvektor (n-1) zurückgibt.
quelle
dx
annumpy.gradient
stattx
? (ii) Können wir auch Ihre letzte Zeile wie folgt machen :dydx = numpy.gradient(y, numpy.gradient(x))
?NumPy bietet keine allgemeine Funktionalität zum Berechnen von Derivaten. Es kann jedoch den einfachen Spezialfall von Polynomen behandeln:
Wenn Sie die Ableitung numerisch berechnen möchten, können Sie für die überwiegende Mehrheit der Anwendungen die Verwendung zentraler Differenzquotienten vermeiden. Für die Ableitung in einem einzelnen Punkt wäre die Formel ungefähr so
Wenn Sie ein Array
x
von Abszissen mit einem entsprechenden Arrayy
von Funktionswerten haben, können Sie Approximationen von Ableitungen mit berechnenquelle
1 * x**2 + 1
. Sie setzen das2
in die obige Zeile, weil es ein Exponent ist. Schau es dir aus der Ferne an.Angenommen, Sie möchten verwenden
numpy
, können Sie die Ableitung einer Funktion an jedem Punkt mithilfe der rigorosen Definition numerisch berechnen :Sie können auch die symmetrische Ableitung verwenden, um bessere Ergebnisse zu erzielen:
In Ihrem Beispiel sollte der vollständige Code ungefähr so aussehen:
Jetzt können Sie die Ableitung numerisch finden unter
x=5
:quelle
Ich werde eine andere Methode auf den Stapel werfen ...
scipy.interpolate
Die vielen interpolierenden Splines können Ableitungen bereitstellen. Bei Verwendung eines linearen Splines (k=1
) sollte die Ableitung des Splines (unter Verwendung derderivative()
Methode) einer Vorwärtsdifferenz entsprechen. Ich bin nicht ganz sicher, aber ich glaube, dass die Verwendung einer kubischen Spline-Ableitung einer zentrierten Differenzableitung ähnlich wäre, da sie Werte von vorher und nachher verwendet, um den kubischen Spline zu konstruieren.quelle
Zur Berechnung von Verläufen verwendet die Community für maschinelles Lernen Autograd:
Installieren:
Hier ist ein Beispiel:
Es kann auch Gradienten komplexer Funktionen berechnen, z. B. multivariate Funktionen.
quelle
Abhängig von der Präzision, die Sie benötigen, können Sie dies anhand des einfachen Differenzierungsnachweises selbst herausfinden:
Wir können die Grenze des Gefälles nicht wirklich überschreiten, aber es macht irgendwie Spaß. Du musst aber aufpassen, weil
quelle
Sie können verwenden
scipy
, was ziemlich einfach ist:scipy.misc.derivative(func, x0, dx=1.0, n=1, args=(), order=3)
In deinem Fall:
quelle