【问题标题】:Using scipy minimize with constraint on one parameter使用 scipy 最小化并限制一个参数
【发布时间】:2017-11-23 21:01:30
【问题描述】:

我正在使用 scipy.minimize 函数,我希望有一个参数只搜索带两位小数的选项。

def cost(parameters,input,target):
    from sklearn.metrics import mean_squared_error
    output = self.model(parameters = parameters,input = input)
    cost = mean_squared_error(target.flatten(), output.flatten())

    return cost

parameters = [1, 1] # initial parameters
res = minimize(fun=cost, x0=parameters,args=(input,target)
model_parameters = res.x

这里的 self.model 是一个基于参数执行一些矩阵操作的函数。输入和目标是两个矩阵。该函数按我想要的方式工作,除了我想让参数 [1] 有一个约束。理想情况下,我只想提供一个 numpy 数组,例如 np.arange(0,10,0.01)。这可能吗?

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    一般来说,这很难做到,因为 平滑度 是这些优化器的核心假设之一。

    一些变量是离散的,而一些变量不是很困难的问题,通常可以通过混合整数优化来解决(对于 MI 线性规划很好,对于 MI 凸规划很好,尽管有不太好的求解器)或全局优化(通常无导数)。

    根据您的任务细节,我建议分解问题:

    • 外循环用于np.arange(0,10,0.01)-like 固定变量
    • inner-loop 用于优化,这个变量是固定的
    • 返回具有最佳目标的模型(状态=成功)

    这将影响N 内部优化,其中N=state-space of your to fix-var

    根据您的任务/数据,单调遍历固定空间(如使用 np 的 arange)并使用迭代 i 的解决方案作为问题 i+1 的初始点(可能如果猜测很好,则需要更少的迭代)。但这可能与此处无关,请参阅下一部分。

    如果你真的有 2 个参数,如所示,这种分解会导致只有 1 个变量的内部问题。然后,不要使用minimize,使用minimize_scalar(更快更健壮;不需要初始点)。

    【讨论】:

    • 是的,我真的只需要两个参数来优化这个函数。我不确定我是否遵循您的最后一句话,这是否意味着我必须在函数中使用另一个参数来优化一个参数?
    • 是的。仅优化其余参数,并以某种方式使您之前修复的另一个参数保持不变!
    猜你喜欢
    • 2016-07-22
    • 2019-10-01
    • 2018-02-16
    • 2014-10-02
    • 2019-03-21
    • 2018-01-30
    • 2015-02-18
    • 2021-10-25
    相关资源
    最近更新 更多