问题标签 [differential-evolution]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
237 浏览

python - 用数千个参数加速差分进化算法

我正在尝试在 python 中创建一个具有很多参数(从 37 到 1099)的集中降雨径流平衡模型。作为输入,它将接收每日降雨和温度数据,然后作为每日流量提供输出。

我被困在模型校准的优化方法上。我之所以选择差分进化算法,是因为它易于使用,可以应用于这类问题。我写的算法效果很好,它似乎最小化了目标函数(这是 Nash-Sutcliff 模型效率 - NSE)。问题始于更多数量的参数,这显着减慢了整个算法。我写的DE算法:

降雨径流模型本身是一个函数,它基本上适用于列表,并通过 for 循环迭代每一行以通过简单的方程计算每日流量。目标函数 NSE 由 numpy 数组向量化:

有没有加快速度的机会?我发现了 numba 库,它“将 python 代码编译为机器代码”,然后让您更有效地在 CPU 上或使用 CUDA 内核的 GPU 上进行计算。但是我没有研究任何与 IT 相关的东西,也不知道 CPU/GPU 是如何工作的,因此我不知道如何正确使用 numba。有人可以帮我吗?或者任何人都可以提出不同的优化方法吗?

我使用的是:Python 3.7.0 64 位、Windows 10 Home x64、Intel Core(TM) i7-7700HQ CPU @ 2.80 Ghz、NVIDIA GeForce GTX 1050 Ti 4GB GDDR5、16 GB RAM DDR4。

我是一名 Python 初学者,学习水管理,有时只是将 Python 用于一些让我在数据处理中的生活更轻松的脚本。提前谢谢你的帮助。

0 投票
0 回答
48 浏览

python - 放弃耗时过长的差分进化目标函数评估

我正在使用scipy.optimize.differential_evolution 并行最小化多参数目标函数。对于每次迭代,一小部分人需要极长的时间来评估目标函数,导致我的大部分 CPU 内核处于空闲状态。每个目标函数评估都需要调用scipy.integrate.solve_ivp,这是我认为计算陷入困境的地方。

我想修改我的目标函数,以便在solve_ivp花费太长时间时放弃它的调用。最简单的方法是什么?

我知道多处理包可用于终止需要太长时间的进程,但我不认为这是一个选项,因为differential_evolution已经multiprocessing.Pool用于并行化,并且池进程不能创建更多进程

我想到的唯一其他选择是创建带有内置终止开关计时器的solve_ivp( source ) 的修改版本。

0 投票
0 回答
23 浏览

python - 我的分频功能有问题吗?

我在 python 上编码差分进化,我有时(很少)得到太多递归调用的错误。我想改进编码功能,所以认为这是一个很好的地方。

我在另一个函数中初始化一个突变向量,然后通过输入相关参数生成一个试验向量。random_select基本上只是从我的候选人群体中选择一个随机向量(这里称为vectorsvector是群体中的候选人。H 和 K 是我决定用于优化问题的超参数。

这是我的代码:(numpy 作为 np 和 numpy.random 作为 npr)

有什么办法可以改进这个功能吗?我错过的某些功能或库可以让我做得更好?某种编码方式比我目前使用的要好得多?有什么帮助,我只是想要一个意见。

0 投票
1 回答
400 浏览

python - 将“类似地图”的可调用对象传递给 scipy 的差分进化

我有一个现有的多处理池,可用于我想传递给差分进化的其他功能,但我似乎无法正确设置工作人员输入。这可能吗?文档workers应该是

...类似于地图的可调用对象,例如用于并行评估总体的 multiprocessing.Pool.map。

我试过了:

谢谢。

0 投票
1 回答
221 浏览

python - 初学者的差分进化多重约束

我正在尝试使用 scipy optimize different_evolution 优化以下功能:

代码在 DE 上运行良好,但我正在寻找一种更智能的方法来强制每个变量必须大于以前的事实。我想使用 Constraint 参数,但我不知道如何在正确的 sintax 中编写线性约束。我见过人们使用字典,其他人使用专用功能(总是使用最小化......不幸的是没有 DE 的例子),我很困惑......并且卡住了:P

如果有人能提供一段适合这个问题的代码,那将是巨大的帮助。

谢谢

PS:用建议的方法编辑结果 f(x)=inf

0 投票
0 回答
59 浏览

nonlinear-optimization - 优化,使用 Quantlib 和 Scipy 差分进化,不收敛

我正在尝试使用库 quantlib 和全局优化器作为 DE 来校准 heston 模型的参数。

首先,我们有以下隐含波动率、执行价格和到期日列表:

让我们从实现基础开始:

成本函数和辅助函数由 表示:

此外,由于 Quantlib 不包含 Feller 条件,我将其合并为:

以下是对每对数据的优化:

这里的问题是参数不稳定(我知道优化器是随机的。但是即使容差为 1e-6 ,参数每次也有显着差异)并且需要大量时间才能收敛(我什至没有确定确实如此)。此外,有时我会收到以下带有错误的消息(错误并不总是出现并且与约束有关,第二个奇怪的事情):

错误 :

有人可以帮助我以使这个棘手的优化工作吗?

谢谢,

0 投票
0 回答
71 浏览

python - 如果函数评估失败,scipy 全局优化替代惩罚方法

我正在尝试使用 scipy(差分进化算法)的优化模块来解决优化问题。在最简单的情况下,我想将两个函数拟合到实验值。在较低 x 值范围内使用函数 1,在较高 x 值范围内使用函数 2。两个函数之间的切换是在两个函数相交的 x 值处完成的。现在的问题是,根据使用的函数的参数,可能没有交集,无法计算残差。我使用 scipy.optimize 中的 brentq 来计算交点。如果我捕捉到一个 ValueError,这意味着没有交集,我使用惩罚方法返回一个非常高的残差。现在的问题是,在许多情况下,差分进化会陷入局部最小值。我已经尝试过人口等其他选项,但我认为主要问题是使用的惩罚方法。对于两条曲线没有交点的情况,除了罚分法还有其他方法吗?我试图创建一个简单的案例来描述问题。因为我在这个例子中只拟合直线,所以在这种情况下一切正常,但对于更复杂的函数,有时我需要数百次尝试才能获得全局最小值。

如果有任何帮助,我将不胜感激。

亲切的问候克里斯蒂安

0 投票
0 回答
105 浏览

python - 有没有办法在 Scipy 差分进化算法中不给出“边界”参数?

我正在用 Python 编写代码进行优化。我正在使用库中differential_evolution可用的算法。scipy我在互联网资源的帮助下编写了以下代码:

我得到了错误:

当我尝试使用边界相同的代码时,它可以工作:

但根据文档,'bounds' 参数是可选的。(还有下面的截图)在此处输入图像描述而且我真的不明白需要这个论点的意义。我真的不想提供这个论点,因为在大多数情况下,我真的不知道界限。

我在这里错过了什么吗?难道我做错了什么?

0 投票
0 回答
35 浏览

python - python中的混合全局-局部优化:结合差分进化(PyFDE)和L_bfgs_B?

像差分进化这样的全局优化更准确。其中,由于 Cython 性能和批处理模式,PyFDE 是最好的之一。但是像 L_bfgs_B 这样的局部优化要快得多。我想知道是否有混合方法?

PyFDE 示例:

迭代器模式:

我有一个不成熟的想法:(1)运行 PyFDE 以获得步骤 2 的可行初始值;(2) 运行 SciPy 的 fmin_l_bfgs_b 得到最终结果。我知道这种混合方法并不完美,可能无法获得全局最小值。我的问题是(1)如何实现这个概念?例如,在 PyFDE 的迭代器模式中,获得步骤 2 的可行初始值的最佳/可能的条件代码是什么?(2) 有没有更好的概念?

任何帮助深表感谢。

0 投票
1 回答
163 浏览

python - 在具有多个工人的 scipy 差分进化中将参数传递给目标函数

对于一些优化问题,我使用 scipys 优化工具箱中的差分进化。我想使用几个 CPU 来加速这个过程,但我想将几个额外的参数传递给目标函数。然而,这些不仅仅是一些标量,而是一些优化评估模型所需的数据集。

当我尝试以通常的方式直接将参数传递给目标函数时,python 抱怨目标函数不可选择。当我将数据放入字典并将其传递给目标函数时,python 在 _send_bytes header = struct.pack(" !i", n) struct.error: 'i' 格式需要 -2147483648 <= number <= 2147483647 "

使用多个工人时,如何将非平凡数据传递给差分进化的目标函数?我还没有找到方法。

就像是

例如,不起作用。

有人有想法吗?还是每次调用目标函数时我都必须从磁盘加载数据?我相信这会大大减慢优化速度。