使用 scipy.optimize 动态选择要最小化 python 中函数的参数

2023-12-24

我有一个函数,它接受变量列表作为参数,我想使用 scipy.optimize.minimize 最小化这个函数。
问题在于,它是在运行时决定应该对参数列表中的哪个变量进行最小化的。所有其他变量将获得固定值。

让我们举个例子来说明一下:

a = 1
c = 1.1
d = -1.2

def func( b ):
    return function_to_minimize( array=[a,b,c,d] )

sol = scipy.optimize.minimize( func, [b0], args=(a,c,d) )

这可行,但是,可能是这样b, c and d已知并且我想优化a找到最小解。

更复杂的是,列表的长度也不知道。这意味着可能有一个变量e, f, g, ... 等等。

实际的记法如下。的元素是None是应该优化的一个。

array = [1, 1.1, None, -0.5, 4]

def func(arr):
    return function_to_minimize(arr)

startvalue = 1.0
sol = scipy.optimize.minimize( func, [startvalue], args='Array without None' )

有没有办法告诉 scipy.optimize.minimize 要优化哪个元素?也许有我可以做的聪明的 lambda 技巧吗?

我将衷心感谢您的帮助!


如您所知,要最小化的函数会根据参数而变化 给出。所以我们需要编写一些动态定义函数的代码。 一种方法是定义一个模板字符串,进行一些字符串格式化 根据给定的参数修改模板,然后使用exec到 定义函数。这有一些优先级——标准库使用它定义命名元组的技术 https://github.com/python/cpython/blob/master/Lib/collections/__init__.py#L421.

因此,例如,如果我们希望最小化的表达式是

4*(b-a)**2 + 5*(c-d)**2

那么你可以使用

import textwrap
import scipy.optimize as optimize

def make_model(*fixed):
    template = textwrap.dedent("""
        def func(variable, {fixed}):
            {variable} = variable
            return 4*(b-a)**2 + 5*(c-d)**2
        """)
    variable = set(('a', 'b', 'c', 'd')).difference(fixed)
    ns = dict()
    funcstr = template.format(variable=', '.join(variable), fixed=', '.join(fixed))
    print(funcstr)  # comment out if you don't want to see the function
    exec funcstr in ns
    return ns['func']

def solve(initial_guess, **givens):
    fixed = tuple(givens.keys())
    vals = tuple(givens.values())
    sol = optimize.minimize(make_model(*fixed), initial_guess, args=vals)
    return sol

print(solve(initial_guess=1, a=1, c=1.1, d=-1.2))

这产生

def func(variable, a, c, d):
    b = variable
    return 4*(b-a)**2 + 5*(c-d)**2

   status: 0
  success: True
     njev: 1
     nfev: 3
 hess_inv: array([[1]])
      fun: array([ 26.45])
        x: array([ 1.])
  message: 'Optimization terminated successfully.'
      jac: array([ 0.])
      nit: 0

print(solve(initial_guess=(1, 1), a=1, c=1.1))

yields

def func(variable, a, c):
    b, d = variable
    return 4*(b-a)**2 + 5*(c-d)**2

   status: 0
  success: True
     njev: 3
     nfev: 12
 hess_inv: array([[1, 0],
       [0, 1]])
      fun: 2.4611848645596973e-16
        x: array([ 0.99999999,  1.1       ])
  message: 'Optimization terminated successfully.'
      jac: array([  1.19209279e-08,   2.88966118e-08])
      nit: 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 scipy.optimize 动态选择要最小化 python 中函数的参数 的相关文章

随机推荐

  • 如何让 Git 在控制台窗口中正确显示 UTF-8 编码的路径名?

    我有 UTF 8 格式的文件名 git 可以正常处理它们 它将正确创建文件 并且 github 页面也可以正确显示它 除了它会在控制台中显示它 如下所示 是否可以使 git 在控制台中正确显示超出 ASCII 127 的 UTF 8 编码字
  • SOAP-ENV:WSDL 中的错误

    我创建了 SOAP Web 服务 而且我对 SOAP 还很陌生 在创建网络服务时 我面临以下问题
  • 如何将向量拆分为列 - 使用 PySpark [重复]

    这个问题在这里已经有答案了 Context 我有一个DataFrame有 2 列 单词和向量 其中 向量 的列类型是VectorUDT 一个例子 word vector assert 435 323 324 212 我想得到这个 word
  • 多输入多变量数据可视化

    我试图通过从多个输入文件中读取多元数据模型来可视化它们 我正在寻找一个简单的解决方案来可视化从多个输入 csv 文件读取的多个类别数据 没有 各个文件中输入的行数范围为 1 到 10000 格式与 4 列 csv 文件的所有输入相同 Inp
  • 从 C# 项目的资源区域加载图像

    我的项目中有一张图像存储在 Resources myimage jpg 中 如何动态将此图像加载到 Bitmap 对象中 您使用的是 Windows 窗体吗 如果您使用 属性 资源 UI 添加了图像 则可以从生成的代码访问该图像 因此您可以
  • 无需用户名的 HTTP 身份验证

    我正在 Node js 中创建一个 HTTP 服务器 并且我想向只有我会使用的页面添加密码 这Basic https developer mozilla org en US docs Web HTTP Authentication Basi
  • 如何添加节点终端Visual Studio Code?

    我尚未成功 但我重新安装了 Visual Studio Code 并且无法再次向其中添加节点终端 请不要说我也可以使用 bash 运行并使用 powershell 这两个在Vscode中默认可达 但我想更改默认终端并更改为节点终端 不是 p
  • 如何使用 ggplot2 + directlabels 的标签自定义名称

    我将 ggplot2 与 directlabels 包一起使用geom line 情节 我希望其中一个标签上写着 X M 然而 在我的data frame X M 作为列名被重命名为 X M 我找不到有关如何提供direct label具有
  • 计算身体宽度百分比时出现问题

    我需要构建一个经典的 960px 布局 并且必须将 960px 转换为 所以 我应该使用960px 16px 60 right 注 960px 主体宽度16px 字体大小 问题 body width 60 960 16px 比 body w
  • 如何禁用添加到 ASP.NET Core 日志中的 ANSI/VT100 颜色代码

    我们在 Google Cloud 中托管 ASP NET Core 服务 来自 Stack Driver 的日志始终使用 ANSI VT100 颜色代码 如下所示 40m 32minfo 39m 22m 49m 有没有办法告诉 ASP NE
  • HQL 查询检查集合大小是否为 0 或空

    我尝试生成一个 HQL 查询 其中包含具有空约会集合的用户 由 OneToMany 映射 SELECT u FROM User u JOIN u appointments uas WHERE u status 1 AND uas time
  • HSQLDB 可以处理几百万行吗?

    我正在开发一个需要数据库的单用户应用程序 大多数表都具有合理数量的数据 但也有一些表可能会增长到数百万行 我的任何查询都不会返回大型结果集 有人知道 HSQLDB 是否可以处理这么大量的行吗 From HSQLDB 官方页面 http ww
  • 内存层次结构 - 为什么寄存器昂贵?

    我明白那个 Faster访问时间 gt More昂贵的 Slower访问时间 gt Less昂贵的 我还了解到寄存器是层次结构的顶部 并且具有最快的访问时间 我很难研究的是why这么贵吗 据我所知 寄存器实际上是直接内置于 ALU 中的电路
  • 给定年份和月份的月份函数的最后一天

    多次单步执行代码后 我无法找到具体导致此错误的原因 我希望有人以前见过这个错误 这就是我的think与问题相关 Load packages library lubridate MONTH lt 1 YEAR lt 2018 Last day
  • 如何使用 ie11 在 Threejs 中加载 gltf 场景

    我使用 Three js 及其 gltfloader js 编写了一个简单的 html 来加载 gltf 模型 它在 Mozilla 上完美运行 但即使没有错误 它也不会显示在 ie11 上 我尝试过使用 es6 promise polly
  • 使用 python lxml xpath 迭代表中的所有行

    这是我想要从中提取数据的html页面的源代码 网页 该表格位于页面底部 table class clCommonGrid cellspacing 0 thead tr td Kommande matcher td tr tr th th t
  • 游戏开发方面 SharpDX 与 SlimDX 比较? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 cypress 从数据库中检索值

    谁能帮我解决以下场景 我必须执行一个select语句并使用 Cypress 将查询结果存储在变量中 下面是我尝试过的代码 我想存储查询结果 select id from invoices where INumber invoiceNumbe
  • 如何在 OpenGL 中可视化深度纹理?

    我正在研究阴影贴图算法 我想调试它在第一次传递时生成的深度图 但是 深度纹理似乎无法正确渲染到视口 有没有简单的方法可以将深度纹理显示为灰度图像 最好不使用着色器 您可能需要更改深度纹理参数以将其显示为灰度级别 glTexParameter
  • 使用 scipy.optimize 动态选择要最小化 python 中函数的参数

    我有一个函数 它接受变量列表作为参数 我想使用 scipy optimize minimize 最小化这个函数 问题在于 它是在运行时决定应该对参数列表中的哪个变量进行最小化的 所有其他变量将获得固定值 让我们举个例子来说明一下 a 1 c