我正在使用R中的makeParamSetgenerateDesign函数(ParamHelpers程序包)构建参数集。如何使用makeParamSet函数中已定义的参数包含公式?这是一个示例,我希望gac的乘积:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688),
                   makeIntegerParam("f", lower=0, upper=45))
Y <- generateDesign(10, ps, trafo = T)


这是我的尝试:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688),
                   makeIntegerParam("f", lower=0, upper=45),
                   makeIntegerParam("g", lower = 1, upper = 1, trafo = function(x,a,c) x*a*c))
Y <- generateDesign(10, ps, trafo = T)

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688),
                   makeIntegerParam("f", lower=0, upper=45),
                   makeIntegerParam("g", require = quote(a*c)))
Y <- generateDesign(10, ps, trafo = T)


编辑:

g参数应该在makeParamSet中定义,因为我的目标是使用g如下所示添加禁止区域:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200), ## bT
                   makeIntegerParam("c", lower=632, upper=5688), ## kR
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688),
                   makeIntegerParam("f", lower=0, upper=45),
                   makeIntegerParam("g", require = a*c),
                   makeIntegerParam("h", lower=0, upper= max(g), ## Depends on g
                   forbidden = quote(h > g)))
Y <- generateDesign(10, ps, trafo = T)

最佳答案

我认为解决此问题的最佳方法是,因为您正在使用generateDesign从参数空间进行采样,因此,请在事实之后添加参数,而不是在初始参数集中定义它:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688),
                   makeIntegerParam("f", lower=0, upper=45))
Y <- generateDesign(10, ps)
Y$g <- Y$a*Y$c


这只会为您提供与ga的采样值相对应的c值:

> Y
      a    c  e    b    d  f        g
1  5994 2813 27 4389 3321 11 16861122
2  3758 5392 32 1009 3684  1 20263136
3  1197 2446 19 2736  116  8  2927862
4  2530 3753  8 1827 2279 34  9495090
5  1675  649 37 3811 1303 19  1087075
6  5335 4878 14 5321 4271 45 26024130
7  3306 3396 42 6261 4753 38 11227176
8  6563 1155 40  333 5662 15  7580265
9  4224 4298 23 7180 1134 23 18154752
10 4805 1755 11 3145 2006 29  8432775


如果要覆盖g的所有可能值,似乎最好的解决方案是仅对限制进行硬编码(即,lower(g)= Lower(a)* lower(c)= 800 * 632,依此类推) ,但是如果您真的想基于其他参数定义来定义它,我想您需要先创建原始参数集,然后调用它以获取先前的参数:

ps2 <- makeParamSet(makeIntegerParam("a", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("c", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("e", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("b", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("d", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("f", lower=ps$pars$a$lower, upper=ps$pars$a$upper),
               makeIntegerParam("g", lower= ps$pars$a$lower*ps$pars$c$lower, upper=ps$pars$a$upper*ps$pars$c$upper))
Y2 <- generateDesign(10, ps2)


但是这些不会直接对应于相应的采样a*c

> Y2
  a    c    e    b    d    f        g
 1  2434 1740 1033 3497  939 3001  9866916
 2  1895 2749 4762 3340 5161 1000 36786092
 3  4505 2378 6415 7183 2454 7119   713409
 4  5140 1028 4400 5798 3633 2560 28261522
 5  6904 6635 1928 5168 6607 6551 16555299
 6  2876 3761 2369 1912 4422 5877 40896236
 7  3563 5822 3110 2141 5624 4800 20026607
 8  5855 5242 5762 4628 1453 4381 31900665
 9  1143 4384 6648 1002 2967 3920 23614328
 10 6301 6153 3766 6094 6390 1978  5320086


编辑:

尝试这样的操作来设置h的界限:

ps <- makeParamSet(makeIntegerParam("a", lower=800, upper=7200),
                   makeIntegerParam("c", lower=632, upper=5688),
                   makeIntegerParam("e", lower=5, upper=45),
                   makeIntegerParam("b", lower=0, upper=7200),
                   makeIntegerParam("d", lower=0, upper=5688),
                   makeIntegerParam("f", lower=0, upper=45),
                   makeIntegerParam("h", lower=0, upper=5688*7200),
                   forbidden=expression(h >= a*c))
Y <- generateDesign(10, ps)
Y$g <- Y$a*Y$c

> Y
      a    c  e    b    d  f        h        g
2  5226 4721 16 5808 2114  7 12630546 24671946
3  3587 2518 35 4989  212 14  5104204  9032066
4  6536 4237 38 7074  896 28  2853768 27693032
10 7135 3950  7  369 3426 38 23501987 28183250
31 4768 5541 26  216 3960 24 19840182 26419488
5  1164 3658 16 1600  794 39  1998994  4257912
41 5047 4653 20 4340 3261 40  6628254 23483691
1  4900 2880 22 6847 2566 19  1945704 14112000
21 3664 3625 36 7027 3955 15  2772633 13282000
11 3389 4229 22  468  593 36  2334981 14332081

关于r - MakeParamSet函数(ParamHelpers程序包):包含已定义参数的公式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58326187/

10-11 23:04
查看更多