廿TT

譬如水怙牛過窓櫺 頭角四蹄都過了 因甚麼尾巴過不得

R: madness で自動微分

madness パッケージを使うとベクトルや行列の自動微分ができます。数値微分ではなくて自動微分です。

ためしに  \log \sum_{i} \exp(x_i)x_i微分してみます。

答えは  \exp(x_i)/\sum_i \exp(x_i) です。

require(madness)
x <- array(1:10,dim=c(10,1))
madx <- madness::madness(x)
madx2 <- log(madness::colSums(exp(madx)))
> print(dvdx(madx2))
             [,1]         [,2]         [,3]        [,4]        [,5]       [,6]
[1,] 7.801342e-05 0.0002120625 0.0005764455 0.001566941 0.004259388 0.01157822
           [,7]      [,8]      [,9]     [,10]
[1,] 0.03147286 0.0855521 0.2325547 0.6321493

正確に一致していることが分かります。

> print(drop(dvdx(madx2)) == drop(exp(x)/sum(exp(x))))
 [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

本当は二階微分を求めたいんだけど、その機能はないようです。