R_Language 板


LINE

[關鍵字]: R, differentiation, calculas, algebraic computation [出處]: http://rpubs.com/wush978/differentiation [重點摘要]: ps. 好讀版請參考上面的link。 最近筆者有計算一個函數的Gradient和Hessian的需求,所以研究了一下R 中 進行這類計算的功能和套件。 以下我會介紹R 中進行數值微分和代數微分的功能。 # numDeriv 我第一個介紹的是數值微分套件:`numDeriv`。他的用法很簡單: ## `grad` `grad`函數可以拿來計算函數在指定點的gradient: ```{r} library(numDeriv) f <- function(x) x^2 grad(f, 2) ``` `grad`也可以計算向量函數的gradient: ```{r} f <- function(x) x[1] * x[2] grad(f, c(1,2)) ``` ## hessian `hessian`可以計算函數在指定點的hessian ```{r} hessian(f, 1:2) ``` 由於是數值解的關係,所以可以看到二階微分會算出很小的值。 # `deriv` 接下來我要介紹一個做代數微分的功能。 首先我們把剛剛的`f <- function(x) x^2`寫成expression: ```{r} f <- function(x) x^2 f.exp <- expression(x^2) ``` 接著使用內建的`deriv`: ```{r} deriv(f.exp, namevec="x") ``` R 就會回傳出計算gradient的方式。將它複製貼上建立函數,並且修改內容 讓它是vectorized: ```{r} g <- function(x) { .value <- x^2 .grad <- 2 * x .grad } ``` 和`numDeriv`的結果做個比較: ```{r} all.equal(g(2), grad(f, 2)) ``` `deriv`的另一個參數`hessian`設為`TRUE`的時候,回傳值會附加hessian的 算式。 # 範例 根據`r citet(bib["bowling2009logistic"])`,以下函數是standard normal cdf的logistic approximation: $$F(x) = \frac{1}{1+e^{-0.07056 x^3 - 1.5976 x}}$$ ```{r} F.0 <- function(x) 1/(1 + exp(-0.07056 * x^3 - 1.5976 * x)) curve(pnorm, -3, 3, lty = 1) curve(F.0, add = TRUE, col = 2, lty = 2) ``` 肉眼根本分不出來差異! 如果我們用它來取代某些Likelihood中的standard normal cdf(當資料有 censoring的時候),在計算MLE的時候就會需要計算$F'(x)$和$F''(x)$。他 們分別是: - $$F'(x) = -{{\left(-0.21168\,x^2-1.5976\right)\,e^{-0.07056\,x^3-1.5976\,x} }\over{\left(e^{-0.07056\,x^3-1.5976\,x}+1\right)^2}}$$ - $$F''(x) = -{{\left(-0.21168\,x^2-1.5976\right)^2\,e^{-0.07056\,x^3-1.5976\,x } }\over{\left(e^{-0.07056\,x^3-1.5976\,x}+1\right)^2}} + \frac{0.42336\,x\, e^{-0.07056\,x^3-1.5976\,x}}{\left(e^{-0.07056\,x^3-1.5976\,x} + 1\right)^2} + {{2\,\left(-0.21168\,x^2-1.5976\right)^2\,e^{-0.14112\, x^3-3.1952\,x}}\over{\left(e^{-0.07056\,x^3-1.5976\,x}+1\right)^3} }$$ 好醜好難寫。 這時候就可以利用`deriv`來建立gradient and hessian。先建立gradient: ```{r} F.exp <- expression(1/(1 + exp(-0.07056 * x^3 - 1.5976 * x))) deriv(F.exp, namevec="x") ``` 稍作修改就可以得到: ```{r} F.1 <- function(x) { .expr6 <- exp(-0.07056 * x^3 - 1.5976 * x) .expr7 <- 1 + .expr6 .value <- 1/.expr7 .expr6 * (0.07056 * (3 * x^2) + 1.5976)/.expr7^2 } ``` 再參考`deriv`的hessian算式: ```{r} deriv(F.exp, namevec="x", hessian=TRUE) ``` 可以寫出: ```{r} F.2 <- function(x) { .expr6 <- exp(-0.07056 * x^3 - 1.5976 * x) .expr7 <- 1 + .expr6 .expr12 <- 0.07056 * (3 * x^2) + 1.5976 .expr13 <- .expr6 * .expr12 .expr14 <- .expr7^2 1/.expr7 (.expr6 * (0.07056 * (3 * (2 * x))) - .expr13 * .expr12)/.expr14 + .expr13 * (2 * (.expr13 * .expr7))/.expr14^2 } ``` 和`numDeriv`比較一下: ```{r} x <- rnorm(1) grad(F.0, x) F.1(x) hessian(F.0, x) F.2(x) ``` 完全一致! 但是用`deriv`建立的函數效能絕對比較好: ```{r} library(microbenchmark) microbenchmark(grad(F.0, x), F.1(x)) microbenchmark(hessian(F.0, x), F.2(x)) ``` 以上內容給大家參考囉! # Reference ```{r, results='asis', echo=FALSE} bibliography() ``` --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 1.34.138.85
1F:推 maninblue:推~ 01/16 11:11







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP