首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >符号计算(r)yacas中的Hessian

符号计算(r)yacas中的Hessian
EN

Stack Overflow用户
提问于 2019-10-25 07:55:13
回答 3查看 133关注 0票数 1

背景:--我正在使用Ryacas包,试图为MLE估计器的大样本方差找出一个符号表达式。

为此,我需要似然函数的Hessian矩阵的(逆)。我没有mathematica (在线版本对我来说似乎太麻烦了),因此我尝试使用Ryacas包,它是YACAS计算机代数系统的接口。

问题:--我似乎不知道如何计算Hessian。使用这里的指南:https://cran.r-project.org/web/packages/Ryacas/vignettes/high-level.html给出了一个错误。这里是一个最小可复制的例子(摘自指南)。

代码语言:javascript
复制
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
Hessian(L)
Error in Hessian(L) : could not find function "Hessian"

当我尝试另一种方式时,即使用(新的?)接口

代码语言:javascript
复制
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
y_fn(L, "HessianMatrix")

我似乎也找不到一个有用的答案,只有HessianMatrix((x^2*y)/4-a*(3*x+(3*y)/2-45))

有谁知道怎么解决这个问题吗?我会非常感激的!

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-07 22:59:11

以下是Ryacas v1.1.1可以做的事情:

代码语言:javascript
复制
> library(Ryacas)
> packageVersion("Ryacas")
[1] ‘1.1.1’
> x <- ysym("x")
> y <- ysym("y")
> a <- ysym("a")
> L <- x^2 * (y/4) - a*(3*x + 3*y/2 - 45)
> H <- Hessian(L, c("x", "y", "a"))
> H
{{   y/2,    x/2,     -3},
 {   x/2,      0, (-3)/2},
 {    -3, (-3)/2,      0}} 
> as_r(H)
expression(rbind(c(y/2, x/2, -3), c(x/2, 0, -3/2), c(-3, -3/2, 
    0)))
> eval(as_r(H), list(x = 2, y = 2, a = 2))
     [,1] [,2] [,3]
[1,]    1  1.0 -3.0
[2,]    1  0.0 -1.5
[3,]   -3 -1.5  0.0
票数 1
EN

Stack Overflow用户

发布于 2019-10-28 08:05:23

代码语言:javascript
复制
library(Ryacas)

yac_str("HessianMatrix(x^2 * (y/4) - a*(3*x + 3*y/2 - 45), {x,y})")
# "{{y/2,x/2},{x/2,0}}"

yac_str("PrettyForm(HessianMatrix(x^2 * (y/4) - a*(3*x + 3*y/2 - 45), {x,y}))") %>% cat
# /              \
# | / y \ / x \  |
# | | - | | - |  |
# | \ 2 / \ 2 /  |
# |              |
# | / x \ ( 0 )  |
# | | - |        |
# | \ 2 /        |
# \              /

参考文献:yacas.readthedocs

票数 2
EN

Stack Overflow用户

发布于 2019-10-27 18:16:02

错误,Error in Hessian(L) : could not find function "Hessian",是因为Hessian函数不是Ryacas包的一部分,而是R中numDeriv包的一部分。

以下也是R中Hessian函数的文档:

https://www.rdocumentation.org/packages/numDeriv/versions/2016.8-1.1/topics/hessian

我希望这能解决你的问题。因此,请先安装numDeriv包,然后使用Hessian函数。

我也尝试使用上面的例子,下面是结果:

代码语言:javascript
复制
library(Ryacas)
library(numDeriv)
L <- yac_symbol("x^2 * (y/4) - a*(3*x + 3*y/2 - 45)")
Hessian(L)

输出:

代码语言:javascript
复制
{}

输出是空集,但我想您可以参考Hessian函数的文档,它肯定会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58554407

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档