4

我正在使用pythonpackagehyperopt并且我有一个参数a需要大于 parameter b

例如,我希望我的参数空间像

from hyperopt import hp

space = {"b": hp.uniform(0, 0.5), "a": hp.uniform(b, 0.5)}

其中,要求a至少大于b,我该怎么做?

提前致谢

4

2 回答 2

10

一个简单的选择是使用hyperopt嵌套参数的能力。因此,您可以根据需要定义超参数空间:

space = hp.uniform("a", hp.uniform("b", 0, 0.5), 0.5)

只有"a"' 的值会传递给您优化的函数(因为这是超参数空间),但hyperopt.fmin()会返回两个参数。

一个类似的选项,但要优化的函数接收两个参数是:

b_var = hp.uniform("b", 0, 0.5)
space = {"b": b_var, "a": hp.uniform("a", b_var, 0.5)}

最后,稍微改变优化函数的输入可能会更简单:参数a可以通过a_fraction在 0 和 1 之间运行并在b0.5 之间进行插值来替换(即在要优化的修改后的函数内部a_fraction = 0产生a = ba_fraction = 1给出)。a = 0.5因此,参数空间具有通常的形式:

space = {"b": hp.uniform("b", 0, 0.5), "a_fraction": hp.uniform("a_fraction", 0, 1)}

在https://github.com/hyperopt/hyperopt/issues/175#issuecomment-29401501有一个有趣的讨论。

于 2019-02-24T18:42:58.800 回答
0

也许我的发现可以帮助某人。我正在使用 HyperOpt 来优化分段仿射函数的参数。因此我需要嵌套参数来正确设置 x 参数部分:

分段函数 由于嵌套参数(不再)对 HyperOpt 和 Optuna 都不起作用……我向所有有同样问题的人推荐pwlf 库。

这个库提出了两种提取分段线性函数参数的方法:

  • 通过提供零件数量
  • 通过提供断点位置

如果您像我一样有兴趣找到断点位置,您可以提供零件数量:

import pwlf
import pandas as pd

data = pd.DataFrame.from_dict({
    "x": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
    "y": [0, 4, 6, 7, 8, 9, 10, 7, 3, 1],
})

model = pwlf.PiecewiseLinFit(data.x, data.y)
nb_parts = 3
model.fit(nb_parts)

print(f"x part intersections: {model.fit_breaks}")
# x part intersections: [0. 1.99 6.00 9.]
print(f"linear coefficient of each part: {model.slopes}")
# linear coefficient of each part: [ 4.00,  1.00, -3.00]
print(f"linear bias of each part: {model.intercepts}")
# linear bias of each part: [-7.11e-06,  5.99e+00,  3.00e+01]

希望能帮助到你!

于 2021-05-04T13:15:17.300 回答