(aggiornato alla fine del 2017 perché c'è stato un sacco di aggiornamenti in questo spazio.)
La cosa migliore è probabilmente automatic differentiation. Ora ci sono molti pacchetti per questo, perché è l'approccio standard per lo studio profondo:
- Autograd lavora in modo trasparente con la maggior parte del codice NumPy. È puro Python, non richiede quasi modifiche al codice per le funzioni tipiche ed è ragionevolmente veloce.
- Ci sono molte librerie orientate al deep-learning che possono farlo. Alcuni dei più popolari sono TensorFlow, PyTorch, Theano, Chainer e MXNet. Ognuno richiederà di riscrivere la propria funzione nel proprio tipo di API simile a numpy ma inutilmente diversa, e in cambio fornirà supporto GPU e una serie di funzioni orientate all'apprendimento profondo di cui si può o non potrebbe interessare .
- FuncDesigner è un pacchetto precedente che non ho utilizzato il cui sito Web è attualmente inattivo.
Un'altra opzione è quella di approssimare con finite differences, fondamentalmente solo valutando (f(x + eps) - f(x - eps))/(2 * eps)
(ma ovviamente con più sforzo messo in esso che quello). Questo sarà probabilmente più lento e meno accurato degli altri approcci, specialmente in dimensioni moderatamente alte, ma è completamente generale e non richiede modifiche al codice. numdifftools
sembra essere il pacchetto standard Python per questo.
Si potrebbe anche tentare di trovare derivate completamente simboliche con SymPy
, ma questo sarà un processo relativamente manuale.
Esiste 'scipy.optimize.optimize.approx_fprime' per il gradiente, che è conveniente. – taper