Scipy.optimize.l_bfgs_b:为什么它会多次计算相同的函数值?

2023-12-23

我目前正在尝试使用 scipy.optimize 来查找尝试拟合某些数据的模拟参数。 A 创建了一个函数,给出我的模型在数据上的卡方,以便 scipy.optimize 必须最小化该函数。

我进行模拟的主要问题之一是,因此被调用的函数非常耗时,而且我发现方法 L-BFGS_B(或就此而言只是 BFGS)在同一点计算了函数值的数倍! !!我不明白为什么它会这么做,这简直要了我的命。

一个具有非常简单功能的示例:

from scipy.optimize import minimize

def f3(x):
    print x
    return x[0]*x[0] + x[1]*x[1] + x[2]*x[2]

x0 = [3, -5, 7]

minimize(f3, x0, method = 'L-BFGS-B')

将返回 :

[ 3. -5.  7.]
[ 3. -5.  7.]
[ 3.00000001 -5.          7.        ]
[ 3.         -4.99999999  7.        ]
[ 3.         -5.          7.00000001]
[ 2.67070726 -4.45117871  6.23165016]
[ 2.67070726 -4.45117871  6.23165016]
[ 2.67070727 -4.45117871  6.23165016]
[ 2.67070726 -4.4511787   6.23165016]
[ 2.67070726 -4.45117871  6.23165017]
[ -1.72315050e-06   1.66152263e-06  -1.59989476e-06]
[ -1.72315050e-06   1.66152263e-06  -1.59989476e-06]
[ -1.71315050e-06   1.66152263e-06  -1.59989476e-06]
[ -1.72315050e-06   1.67152263e-06  -1.59989476e-06]
[ -1.72315050e-06   1.66152263e-06  -1.58989476e-06]
  status: 0
 success: True
    nfev: 15
     fun: 8.2895683293030033e-12
       x: array([ -1.72315050e-06,   1.66152263e-06,  -1.59989476e-06])
 message: 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
     jac: array([ -3.43630101e-06,   3.33304526e-06,  -3.18978951e-06])
     nit: 2

正如您在函数调用的打印列表中看到的那样,minimize在同一个 x 中多次调用 f3。

这很令人沮丧,因为我觉得在这里浪费了很多时间。

如果有人能在这里启发我,我很高兴。谢谢。


它会这样做,因为它没有你希望的那么小心。此缺陷已添加到 scipy bug tracker 中here https://github.com/scipy/scipy/issues/4076。正如我在那里发布的,您可以通过自己缓存以前的值来解决这个问题。或者,您可以使用jac=True在你的minimize调用并编写函数以返回该点的值和梯度。第一种方法的示例是:

import numpy as np
from scipy import optimize

class CacheLast(object):
    def __init__(self, f):
        self.f = f
        self.last_x = None
        self.last_f = None
        self.ncall = 0

    def __call__(self, x):
        if np.all(x == self.last_x):
            return self.last_f
        else:
            self.last_x = x
            self.last_f = self.f(x)
            self.ncall += 1
            return self.last_f

def f3(x):
    return x[0]*x[0] + x[1]*x[1] + x[2]*x[2]

x0 = [3, -5, 7] 

func = CacheLast(f3)
res = optimize.minimize(func, x0, method='L-BFGS-B')

print 'total function calls: ', res.nfev
print 'actual function evals: ', func.ncall

这使:

total function calls:  15
actual function evals:  12
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scipy.optimize.l_bfgs_b:为什么它会多次计算相同的函数值? 的相关文章

随机推荐

  • 使用 d3 画布强制定向图多条边

    我创建了具有多个边的强制有向图 但在渲染后它仅显示 其他一个相互重叠 我想创建类似的东西https bl ocks org mattkohl 146d301c0fc20d89d85880df537de7b0 index html https
  • Users.threads.list() 中缺少很多线程

    我正在使用 Users threads list 方法通过查询 in sent newer than 1y 从我的 GMail 帐户检索线程 结果的第一页 100 个线程 看起来不错 其中包含 2014 年 12 月和 2015 年 1 月
  • 如何在laravel中使用不同的redis连接

    我正在创建一个 laravel 包 在这个包中我需要在 redis 中保存一些数据 但我希望这个包使用不同的 redis 连接 这样如果他们可以在包的配置文件中设置 redis 详细信息凭证 并将使用此连接这个包 我想给包用户自由使用不同的
  • 使用 JAVA API 获取我的 Azure 订阅中所有资源的详细信息

    我正在寻找类似的东西this https stackoverflow com questions 17584084 get a list of all resources in my azure subscription powershel
  • 菜单栏右侧的摆动菜单项

    我有一个 swing 应用程序 在 JFrame 的菜单上我想添加一个帮助菜单项 但要使其右对齐 有任何想法吗 Swing JMenuBar 有一个 BoxLayout 我尝试过 menuItem new JMenuItem Help me
  • program.exe:Native' 已退出,代码为 255 (0xff)

    我正在使用 boost 线程 并且在使用 MD 编译时一切正常 但我真的更喜欢使用 MT 编译 然后我遇到的问题是program exe Native 已退出 代码为255 0xff 这发生在这条线上 thread 1 线程 testThr
  • 基准代码 - 除以迭代次数?

    我和我的朋友就 C C 代码 或一般代码 的基准测试进行了有趣的讨论 我们编写了一个简单的函数 它使用getrusage测量给定代码段的 CPU 时间 它测量运行特定功能所花费的 cpu 时间 让我举一个例子 const int itera
  • 检测 Android 模拟器何时完全启动

    我想创建一个脚本 在其中启动模拟器 并在系统完全启动后安装 apk 我如何知道模拟器何时完全启动以便我可以运行安装命令 这里http developer android com guide developing tools adb html
  • 使用 .prop(hidden: true) 在 JQuery 中隐藏按钮

    我试图弄清楚如何使用 prop hidden true 方法使用 JQuery 隐藏按钮 由于某种原因 在 Chrome 中 当我设置此值并查看 html 时 该按钮有一个隐藏元素 但该按钮仍然在页面上显示为可见 有任何想法吗 按钮没有隐藏
  • 从 Azure AD OAuth v2 令牌端点获取 client_credentials 令牌时,sub 和 oid 声明中包含什么内容?

    我可以在设置密钥 秘密后获取这些令牌 但我不知道是否或如何依赖我的应用程序中的子声明 有关更多背景信息 我的应用程序实际上是 B2C 注册应用程序 我将转到 B2C 租户中的 v2 端点 但没有指定策略来 使用客户端凭据流 可能会导致常规
  • 如何从对象中省略“删除”许多属性?

    我有两种返回以下类型的方法Pick
  • 指针数组的动态分配

    以下代码给出了分段错误 我不明白为什么 请参见 include
  • 如何在交叉编译环境中检测libc名称和版本?

    我的 Linux 桌面上有一些交叉编译器 有些使用 glibc 有些使用 uclibc 将来可能会有其他libcs too 目前 我可以进入他们的 sysroot 目录并搜索libc so并尝试查找它指向哪个文件名 例如libc so gt
  • SelectNodes 和 GetElementsByTagName

    SelectNodes 和 GetElementsByTagName 之间的主要区别是什么 选择节点 http msdn microsoft com en us library system xml xmlnode selectnodes
  • pdf.js 获取有关嵌入字体的信息

    我正在使用 pdf js 获取文本我得到带有字体信息的块 Object str blabla dir ltr width 191 433141 height 12 546 transform Array 6 fontName g d0 f2
  • 同时使用复选框和下拉菜单进行准确过滤

    我正在构建一个非常可排序 可过滤的图像库 其中包含很多标签 这个问题是基于这个如何让下拉菜单表现得像复选框 https stackoverflow com q 68315184在那里我得到了大部分问题的解答 编辑 这里进一步采取了这个问题的
  • 流上的 C++ 正则表达式

    我有一个非常大的文本文件 最多几百 MB 我想使用 STL 正则表达式对其进行处理 我正在寻找的匹配区域跨越几行 并且在文件中至少出现几千次 我可以使用流迭代器来实现此目的吗 我试过了std istream iterator
  • Linux 中没有 X.org 的 OpenGL

    我想在 Linux 中打开一个没有 X 的 OpenGL 上下文 有什么办法可以做到吗 我知道集成英特尔显卡硬件是可能的 尽管大多数人的系统中都有 Nvidia 卡 我想要一个适用于 Nvidia 卡的解决方案 如果除了通过集成英特尔硬件之
  • C - 不同文件中全局定义的变量显示不带 extern 修饰符的外部链接

    彻底迷茫了 我很沮丧 因为我认为准确了解范围和链接如何工作很重要 但我一直看到有关的相互矛盾的信息extern我的编译器 链接器与我读到的内容相矛盾 main c int int1 void main int1 6 printf nMain
  • Scipy.optimize.l_bfgs_b:为什么它会多次计算相同的函数值?

    我目前正在尝试使用 scipy optimize 来查找尝试拟合某些数据的模拟参数 A 创建了一个函数 给出我的模型在数据上的卡方 以便 scipy optimize 必须最小化该函数 我进行模拟的主要问题之一是 因此被调用的函数非常耗时