【问题标题】:How to scipy-optimize with a categorical variable如何使用分类变量进行 scipy 优化
【发布时间】:2020-01-01 06:57:10
【问题描述】:

考虑以下问题:

import numpy
import scipy.optimize


def f(x):
    return (x[0] == 1)*(x[1] + 2)**2 - (x[0] == 0)*(x[1] + 1)**2


kwargs = {
        'method': 'trust-constr',
        'jac': False,
        'bounds': [(0, 1), (0, 1)],
    }


m = scipy.optimize.minimize(f, numpy.array([1, 0]), **kwargs).x
print(m)
# [0.91136811 0.19026955]  <- wrong result

我想在空间上优化这个功能

  • x[0] \in {0,1}
  • x[1] \in [0,1]

有什么方法可以指定 x[0] 不应该是一个实际值(即,[0,1] 行上的一个值),而只能是 0 或 1?

我目前的做法是执行 N 次优化,每个 x[0] 选项一个。问题是,如果有多个分类变量,这会迅速爆发。

【问题讨论】:

  • 也许你可以看看hyperopt 包。但请检查它是否满足您对精度和性能的需求。我认为它主要是为机器学习中的超参数优化而创建的,其中精度可能不是最大的问题。在 hyperopt 中,您可以将一些值定义为离散的(甚至是分类的),而其他值是连续的。
  • 一般方法是混合整数非线性规划(例如 Couenne)。但是这是否可行取决于很多细节。

标签: python scipy scipy-optimize-minimize


【解决方案1】:

有什么方法可以指定 x[0] 不应该是一个实数值(即 [0,1] 行上的一个值),而只能是 0 或 1?

wrapdisc 是一个瘦包装器包,可让您使用各种scipy.optimize 优化器优化分类、整数和浮点变量。它将这些变量中的每一个编码为浮点数。它的自述文件中有一个使用示例。有了它,您不必调整目标函数或执行 n 优化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-05
    • 2019-10-31
    • 1970-01-01
    • 2018-04-16
    • 2016-03-10
    • 1970-01-01
    • 2016-01-06
    • 2022-01-22
    相关资源
    最近更新 更多