Automatic Differentiation for R
On Tue, May 19, 2009 at 9:08 AM, Martin Maechler
<maechler at stat.math.ethz.ch> wrote:
[MM stumbling over on old thread ... he'd be interested]
"GaGr" == Gabor Grothendieck <ggrothendieck at gmail.com> ? ? on Wed, 15 Apr 2009 09:53:18 -0400 writes:
? ?GaGr> Not sure if this is sufficient for your needs but R does include symbolic
? ?GaGr> differentiation, see ?D, and the Ryacas and rSymPy
? ?GaGr> packages interface R to the yacas and sympy computer algebra
? ?GaGr> systems (CAS) and those system include symbolic differentiation.
No, symbolic differentiation is not enough.
Automatic Differentiation (AD) is something much more general (in one
way) and much less mathematical from ?a classical view point:
But then, AD is much more generally useful for minimization as, basically,
the input is an R function
? ?f(x) ? ? ? ? ? ? ? {with x multidimensional}
or ?f(x1,x2, ..., xp) ?{with scalar x1, x2, ..}
and the output is again an R function
which computes f() and all {or just selected} partial
derivatives ?d f / d{xi}.
Now consider that the function f() ?can contain if() and while()
clauses and conceptually ever language feature of R.
In practice, I'm pretty sure the list of features would have to
be restricted, similarly as they'd have to for an R compiler to
be feasible.
I agree that ?AD for R would be very nice and could be very
useful.
I'd also be interested to help AD people learn the S4 classes
and methods (hoping that it's close enough to what they call
"operator overloading" something I'd presume to be less general
than the powerful S4 class/methods system).
The overloading facilities present have already been discussed in
this thread including a complete illustration of using them for the
problem at hand.
rSymPy and Ryacas both support overloading.
Ryacas also supports automatic differentiation
of one line R functions but its not fully developed and very limited.
See demo("Ryacas-Function") which shows differentiation of the
Burr CDF to get the PDF.
Here are a few more simpler examples to illustrate overloading in
these packages.
library(Ryacas)
Loading required package: XML
x <- Sym("x")
x+x
[1] "Starting Yacas!" expression(2 * x)
library(rSymPy)
Loading required package: rJava
source("http://rsympy.googlecode.com/svn/trunk/R/Sym.R")
y <- Sym(sympy("var('y')"))
y+y
[1] "2*y" Check the home pages of the packages for more info.