我正在探索 autodiff,我想Deriv用于計算函式 wrt 到向量的導數。我寫的
library(numDeriv)
library(Deriv)
h = function(x) c(1,2)%*%x
grad(h,c(1,2)) #ok
#[1] 1 2
dh=Deriv(h,x='x')
#Error in c(1, 2) %*% 1 : non-conformable arguments
dh(c(1,2))
有沒有人有這樣做的好方法?
從help(Deriv),似乎應該能夠讓引數成為一個向量
這是向量長度的副作用。例如,在 Deriv(~a b x, c("a", "b")) 中,結果是 c(a = 1, b = x)。為了避免 a 和 b 分量的長度差異(當 x 是向量時),可以使用可選引數 combine Deriv(~a b x, c("a", "b"), combine="cbind" ) 給出 cbind(a = 1, b = x) 產生一個兩列矩陣,這可能是這里想要的結果。
我想避免將每個向量組件作為函式的不同引數。
例如numDeriv上面的例子讓我們很容易地得到一個導數 wrt 向量x
uj5u.com熱心網友回復:
這是一個答案;to 包以不同的方式處理多個維度。
library(numDeriv)
library(Deriv)
h = function(x,y) c(1,2) %*% c(x,y)
grad(\(x) h(x[1], x[2]),c(1,2))
dh = Deriv(h)
dh(c(1,2))
uj5u.com熱心網友回復:
這是一個使用 not Derivbutmadness,一個非常簡潔的包的解決方案。
我們基本上創建了一個物件,它是我們想要對其進行導數的物件(在本例中x),然后當我們將函式應用于該物件時,會收集導數。
我們使用這個函式得到評估的導數,就像我們grad在 in 中所做的那樣numDeriv。
library(madness)
h = function(x){t(x)%*%matrix(c(2,1),nrow=2,ncol=1)}
x=matrix(c(1,1),nrow=2,ncol=1)
gd=function(h,x){
x=madness(val=x)
z=h(x)
attr(z,"dvdx")
}
gd(h,x)
# [,1] [,2]
#[1,] 2 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/352278.html
