我通常使用Rsolnp进行优化,但我无法弄清楚如何让R找到填充矩阵的值(而不是向量)。这可能与Rsolnp或任何其他优化器有关吗?
以下是一个不起作用的简化示例:
library(Rsolnp)
a<-matrix(rnorm(9), ncol=3)
b<-matrix(rnorm(9), ncol=3)
f1<-function(H) {
return(sum(H*a))
}
f2<-function(H) {
return(sum(H*b))
}
lH<-matrix(rep(0, 9), ncol=3)
uH<-matrix(rep(1, 9), ncol=3)
pars<-uH
target<-1.2
sol <- gosolnp(pars, fixed=NULL, fun=f1, eqfun=f2, eqB=target, LB=lH, UB=uH, distr=uH, n.restarts=10, n.sim=20000, cluster= NULL)
从输出中可以看出,Rsolnp似乎对请求感到困惑:
> sol
$values
[1] 1e+10
$convergence
[1] 0
$pars
[1] NA NA NA NA NA NA NA NA NA
$start.pars
[1] 0.90042133 0.33262541 0.94586530 0.02083822 0.99953060 0.10720068 0.14302770 0.67162637 0.25463806
$rseed
[1] 1487866229
答案 0 :(得分:1)
似乎gosolnp()
不适用于矩阵。我在调试模式下完成了该功能,并且调用了solnp()
,该消息失败并显示消息:
pb / cbind错误(vscale [(neq + 2):( neq + mm + 1)],vscale [(neq + 2):( neq +: 不一致的数组
但由于矩阵只是一个设置了维度属性的向量,因此您总是可以根据向量重新表述问题。在你的情况下,这很容易,因为你从来没有做过实际需要矩阵的事情(例如,矩阵产品)。只是在任何地方省略matrix()
都可以。
但我认为这只是你简化问题的一个属性,你的实际问题确实需要用矩阵来表达。您可以通过将矢量转换为内部函数f1()
和f2()
来解决问题,如下所示:
f1 <- function(H) {
return(sum(matrix(H, ncol = 3) * a))
}
f2 <- function(H) {
return(sum(matrix(H, ncol = 3) * b))
}
然后,您可以像以前一样将a
和b
定义为矩阵,但lH
和uH
必须是向量:
a <- matrix(rnorm(9), ncol=3)
b <- matrix(rnorm(9), ncol=3)
lH <- rep(0, 9)
uH <- rep(1, 9)
pars <- uH
target <- 1.2
现在你可以致电gosolnp()
:
sol <- gosolnp(pars, fixed = NULL, fun = f1, eqfun = f2,
eqB = target, LB = lH, UB = uH, distr = uH,
n.restarts = 10, n.sim = 20000, cluster = NULL)
sol$pars
## [1] 3.917819e-08 9.999997e-01 4.748336e-07 1.000000e+00 5.255060e-09 5.114680e-10
## [7] 4.899963e-01 1.000000e+00 9.260947e-08