2012-12-13 20 views

risposta

11

(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.

0

Limitato solo a SciPy, il modo più conveniente che ho trovato era scipy.misc.derivative, all'interno dei loop appropriati, con lambda per ricoprire la funzione di interesse.