2017-02-23 88 views
0

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

似乎gosolnp()做不適用於矩陣。我通過在調試模式下的功能去並且存在與消息失敗的solnp()呼叫:在PB/cbind

誤差(VSCALE [(NEQ + 2):(NEQ +毫米+ 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 
+0

我認爲這可能是唯一的方法,但我想確保。看起來它可能會使優化速度下降很多。我處理的矩陣非常大,gosolnp必須多次調用這些函數才能進行單個優化。 – user3390169