我正在使用R中的makeParamSet
和generateDesign
函数(ParamHelpers
程序包)构建参数集。如何使用makeParamSet
函数中已定义的参数包含公式?这是一个示例,我希望g
是a
和c
的乘积:
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
这只会为您提供与
g
和a
的采样值相对应的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/