优化矩阵中的值

时间:2017-02-23 16:18:11

标签: r optimization

我通常使用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

1 个答案:

答案 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))
}

然后,您可以像以前一样将ab定义为矩阵,但lHuH必须是向量:

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