6

私はExcelソルバーを使用して次の問題を処理しています

方程式のabとcを解きます。

y = a*b*c*x/((1 - c*x)(1 - c*x + b*c*x))

制約の対象

0 < a < 100
0 < b < 100
0 < c < 100

f(x[1]) < 10
f(x[2]) > 20
f(x[3]) < 40

ここで、約10(x、y)の値のペアがあります。abs(y --f(x))の合計を最小化します。そして、各xでの関数の結果の係数と値の範囲の両方を制約できます。

私は(制約を課そうとせずに)nlsを試しましたが、Excelは私が提供したいと思っていたほとんどすべての開始値の推定値を提供しましたが、nlsはほとんど答えを返しませんでした。

optimの使用に切り替えましたが、制約を適用するのに問題があります。

これは私がこれまでに得たところです-

best = function(p,x,y){sum(abs(y - p[1]*p[2]*p[3]*x/((1 - p[3]*x)*(1 - p[3]*x + p[2]*p[3]*x))))}
p = c(1,1,1)
x = c(.1,.5,.9)
y = c(5,26,35)
optim(p,best,x=x,y=y)

制約の最初のセットを追加するためにこれを行いました-

optim(p,best,x=x,y=y,method="L-BFGS-B",lower=c(0,0,0),upper=c(100,100,100))

エラー「"ERROR:ABNORMAL_TERMINATION_IN_LNSRCH"」が表示されます

そして、エラーの値($ value)が高くなります。だから私は何か間違ったことをしているようです。他の一連の制約を適用する方法がまったくわかりませんでした。

統計家以外の人が理解できるこの問題を解決するための基本的なアイデアを誰かに教えてもらえますか?私はたくさんの投稿を見て、いくつかのR本を調べました。Rの本は、optimの最も単純な使用で停止しました。

4

1 に答える 1

14

絶対値は特異点をもたらします。特にグラジエントベースの方法(L-BFGSなど)では、代わりに正方形を使用することをお勧めします。

関数の分母はゼロにすることができます。

パラメータが製品に表示され、それらをゼロに(任意に近く)許可するという事実も、問題を引き起こす可能性があります。

最適化が収束するオプティマイザーが見つかるまで、他のオプティマイザー(最適化タスクビューの完全なリスト)を試すことができます。

x0 <- c(.1,.5,.9)
y0 <- c(5,26,35)
p <- c(1,1,1)
lower <- 0*p
upper <- 100 + lower
f <- function(p,x=x0,y=y0) sum( 
  (
    y - p[1]*p[2]*p[3]*x / ( (1 - p[3]*x)*(1 - p[3]*x + p[2]*p[3]*x) ) 
  )^2
)

library(dfoptim)
nmkb(p, f, lower=lower, upper=upper) # Converges

library(Rvmmin)
Rvmmin(p, f, lower=lower, upper=upper) # Does not converge

library(DEoptim)
DEoptim(f, lower, upper) # Does not converge

library(NMOF)
PSopt(f, list(min=lower, max=upper))[c("xbest", "OFvalue")] # Does not really converge
DEopt(f, list(min=lower, max=upper))[c("xbest", "OFvalue")] # Does not really converge

library(minqa)
bobyqa(p, f, lower, upper) # Does not really converge

最後の手段として、いつでもグリッド検索を使用できます。

library(NMOF)
r <- gridSearch( f, 
  lapply(seq_along(p), function(i) seq(lower[i],upper[i],length=200)) 
)
于 2012-07-08T23:43:55.847 に答える