问题标签 [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 投票
0 回答
33 浏览

r - 如何减少使用差分进化估计的收益率曲线的价格误差?

我正在优化 Nelson Siegel Sevenson(NSS)模型的参数以估计收益率曲线。为此,我正在使用 R 的 DEoptim 包,但结果并没有那么令人满意。你能建议我一些其他的方法吗

我尝试了 PSO、LM 算法,但它们给出了一些错误。

我附上了我用于 DEoptim 的代码

那么您能否提供我在 R 中的 DEoptim(差分进化)代码,以便我可以进行一些自定义更改以改善结果。

PS--我看过DEoptim的R目录代码,但是太复杂了,看不懂

0 投票
1 回答
170 浏览

r - R中差分进化的代码错误

我正在寻找 NSS 模型(收益率曲线估计模型)的最佳参数,因为我在 R 中得到了这个差分进化代码。[我不想使用 DEoptim 库)。我在运行此代码时遇到问题。我使用了以下代码

我的代码中的错误消息

通过以下方式调用函数后:

这个错误来了

我不知道这是什么错误。请帮忙

0 投票
1 回答
54 浏览

scipy - 使用 scipy.integrate.solve_ivp 时如何处理微分函数中由 t 索引的参数

我想使用solve_ivp来模拟一个演化出以下微分函数的系统:

dy(t) = A D(t) + B y(t)

至于我,t 是从 0 开始计数的整数,我做到了

它给了我预期的结果,在 t=34 处有一个 y 的峰值。 在此处输入图像描述 但是,如果我通过简单地替换来移动 D 具有非零值的间隔

我希望我可以得到相同的形状,但只能移动,而结果给了我全部 0...此外,有时我会遇到警告消息:

RuntimeWarning:在 double_scalars max(1, SAFETY * error_norm ** (-1 / (order + 1))) 中遇到除以零

0 投票
1 回答
683 浏览

python - python中使用差分进化的分段回归

我的长期目标是为特定数据集创建一个模块,将分段回归拟合到任意数量的断点,以及标准多项式和线性曲线拟合,然后评估哪种拟合最适用于数据(可能使用 AIC 或 BIC)。

我有一个函数,它使用差分进化在 x 和 y 数据集上使用分段回归,假设有 1 个断点:

运行良好。但是,我尝试扩展模型以允许超过 1 个断点:

当我运行时,这段代码遇到了问题segReg_two(x,y),停在了differential_evolution位:

TypeError: unsupported operand type(s) for -: 'float' and 'NoneType' 在处理上述异常期间,发生了另一个异常:

RuntimeError:类似地图的可调用对象必须是 f(func, iterable) 的形式,返回与“可迭代”长度相同的数字序列

我没有这个问题segReg_one,所以我不明白为什么会在这里发生。我假设(我可能对这个假设不正确)参数iterable必须具有与我的误差函数兼容的维度。但是,我不确定这两个参数是如何准确关联的,除了我正在找到断点、斜率和偏移量,这些断点、斜率和偏移量可以在给定边界的情况下最小化断点。

此外,我的进攻计划似乎非常冗长和野蛮。有没有更好的方法来解决这个问题?

我想也许它正在将我的分段函数视为无类型。打印带有一些随机值的函数仅返回“无”。然而,我的分段函数打印同样的东西,它仍然工作得很好。

0 投票
1 回答
452 浏览

python - 具有 10 个变量的 Scipy 差分进化需要多次迭代

我正在尝试使用scipy.optimize.differential_evolution优化具有 10 个变量的标量函数。

标量值实际上是由模拟软件计算的,每次迭代大约需要 7 秒。问题是,即使我将 popsize 设置为 10,算法也需要 >1000 次迭代,这会导致计算时间非常长。

10 个变量是 5 个角度和 5 个长度:

在每次迭代中,值 (X_1, X_2, X_3, X_4, X_5, Y_1, Y_2, Y_3, Y_4, Y_5) 由下式计算

仿真软件根据这些输入计算一个标量。

我试图将 popsize 减少到 3-5,但结果不是全局最优值。我之前也尝试过不同的策略,例如“rand1exp”和“best1exp”以及基于梯度的算法(SLSQP),但问题是由于正弦和余弦函数,起点至关重要,这会导致许多不同的(局部)结果。我相信 DE 是解决这个问题的最佳算法,但我无法想象它需要 >1000 次迭代来解决“仅”10 个变量的问题。

我这样称呼DE:

有没有人对 DE 有一些经验并且可以给我一些正确参数的提示?

0 投票
2 回答
1834 浏览

python - 如何将参数传递给 scipy.optimize.differential_evolution 中的回调函数

我正在使用来自 scipy.optimize 的差分进化来解决我的优化问题。我的优化器需要一些参数进行优化。

代码 -

我还有一个回调函数。我想将我的参数发送到我的回调函数,这就是我的问题出现的地方。

如果我不将任何参数传递给我的回调函数,它工作正常 -

但是,如果我arguments在函数定义中作为参数给出 -

它抛出一个错误。

将参数传递给回调函数的正确方法是什么?

0 投票
1 回答
524 浏览

python - scipy.optimize 差分进化中初始参数的形状

我不明白算法期望init参数的形状。

帮助中,它说:

initstr 或类似数组,可选

指定执行哪种类型的人口初始化。应该是以下之一:

数组应具有形状 (M, len(x)),其中 len(x) 是参数的数量。init 在使用前被剪裁到边界。

我正在传递形状为(1,17)的东西(数组数组)作为初始值(=init参数)。因此,代表我的 17 个参数的 17 个值的 numpy 数组并收到以下错误消息:

ValueError:提供的总体需要具有形状 (M, len(x)),其中 M > 4。

试图深入研究它,我在源代码中得到了这一行:

if我理解的 3 条语句中的最后 2 条。您要确保它是一个数组数组并且所有数组都具有正确的大小(即参数的数量)。

但是为什么算法期望用户给它至少 4 个可能的起始值呢?

0 投票
1 回答
316 浏览

python - 是否可以为 scipy 的差分进化的每个参数(而不是边界)指定起始值?

Scipy 的差分进化实现(https://docs.scipy.org/doc/scipy-0.17.0/reference/generated/scipy.optimize.differential_evolution.html)使用拉丁超立方体或随机方法进行种群初始化。拉丁超立方体采样试图最大化可用参数空间的覆盖范围。'random' 随机初始化总体。我想知道是否可以为每个参数指定起始值,而不是依赖这些默认算法。

对于复杂的模型(特别是那些在数学上难以处理并因此需要模拟的模型),我观察到 scipy 的差分进化的 2 次独立运行可能会在算法的 X 次迭代后给出不同的结果(我通常设置 X = 100 以避免运行数天的算法)。我认为这是因为(1)两次独立运行之间的总体初始化并不相同(因为总体初始化方法“随机”和“超立方体”的随机性)和(2)模型预测中存在噪声。因此,我正在考虑以 100 次迭代运行约 10 次独立的 DE 运行,在 10 次运行中选取最合适的参数集,并将该参数集用作具有更多迭代(例如 200)的最终运行的起始值。问题是我看不到在 scipy 的 DE 实现中手动输入这些起始值的方法。如果社区中有人可以帮助我,我将不胜感激。

0 投票
1 回答
50 浏览

python - 在 numpy 数组中逐元素应用操作

我目前正在python中实现差分进化算法,并且在较低维度上工作时一切都很好,但是,当我开始增加搜索空间的维度时,运行算法所需的时间呈指数增长。做了一点profiling后发现大部分时间都花在了mutation函数上,具体如下,

现在,对于 apopulation size100a dimension20运行算法的总时间约为 40 秒,其中约 20 秒花费在mutate.

现在,我已经对这个功能进行了优化,使其比以前的版本缩短了大约 3 秒。

但显然,这还不够。我想知道是否有一个技巧numpy可以删除 for 循环在r0, r1, r2, and mutant. 问题是只能cross_indxs使用索引为 in 的元素。

0 投票
1 回答
603 浏览

python - 在函数中使用遗传算法(局部) - 最小化函数

我一直在尝试使用遗传算法来适应我在不同实验中的幂律。问题是我并不完全理解它。我想我了解除了 sumOfSquaredError(parameterTuple) 函数之外的所有内容。

我一直在尝试理解和使用的代码,它是社区中常用的代码,它是由以下函数构建的:

  • func(x, a, b) - 拟合我们的实验数据的模型函数

  • sumOfSquaredError(parameterTuple) - 通过遗传算法最小化的函数

  • generate_Initial_Parameters() - 根据 SciPy 的遗传算法生成初始参数

然后我要做的是使用具有 pandas.DataFrame 作为输入的 main 函数。此函数从数据框中选择特定的行和列(以便获得单个实验)并对其进行处理。

我与发布的一般代码的不同之处在于,我有一个带有 pandas 数据框输入的函数,它只不过是一个索引数据集。然后,我对其施加了一些条件,以便从数据集中提取特定数据,以便每次迭代只对整个数据集进行一次实验,并尝试将其定义为 xData 和 yData。


实现

如果尝试输入 xData 和 yData:

为了定义 sumOfSquaredError(xData, yData, parameterTuple):

它返回:

文件“/home/josep/programa.py”,第 361 行,在 get_ResultsgeneticParameters = generate_Initial_Parameters(xData, yData)

文件“/home/josep/programa.py”,第 267 行,在 generate_Initial_Parameters parameterBounds,seed=3)

文件“/home/josep/anaconda3/lib/python3.7/site-packages/scipy/optimize/_differentialevolution.py”,第 276 行,在different_evolution ret = solver.solve()

文件“/home/josep/anaconda3/lib/python3.7/site-packages/scipy/optimize/_differentialevolution.py”,第 688 行,在解决 self.population 中)

_calculate_population_energies 中的文件“/home/josep/anaconda3/lib/python3.7/site-packages/scipy/optimize/_differentialevolution.py”,第 794 行引发 RuntimeError(“类似地图的可调用对象必须属于”

RuntimeError:类似地图的可调用对象必须是 f(func, iterable) 的形式,返回与“可迭代”长度相同的数字序列


我面临的错误是:

  • NameError: name 'xData' is not defined File "/home/josep/programa.py", line 245, in sumOfSquaredError val = func(xData, *parameterTuple)

我认为在函数内部调用 sumOfSquaredError(parameterTuple) 时遇到了问题,因为该函数使用定义为全局变量的变量。这也可能与scipy.optimize.differential_evolution() 有关

如果我尝试输入 xData 和 yData 作为输入参数,那么它会要求我也输入parameterTuple我不明白它来自哪里,因为它没有在任何地方定义。

我正在使用的其他功能是:

这是我在输入 df 并在每次迭代时选择特定行的代码中调用的主要函数。(如果有人想要,我也会在这里写进口)


实现 - 解决方案

正如@jeremy_rutman 建议的那样,这只是在函数内部全局定义 xData 和 yData 的问题。但是,问题在于我定义的数组的维度不是所需的。

定义它们时要引入的正确代码如下

(在我的情况下,问题是在全局定义时它返回:值错误:对象太深,无法满足所需的数组错误:函数调用的结果不是正确的浮点数组)