问题标签 [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.
r - 如何减少使用差分进化估计的收益率曲线的价格误差?
我正在优化 Nelson Siegel Sevenson(NSS)模型的参数以估计收益率曲线。为此,我正在使用 R 的 DEoptim 包,但结果并没有那么令人满意。你能建议我一些其他的方法吗
我尝试了 PSO、LM 算法,但它们给出了一些错误。
我附上了我用于 DEoptim 的代码
那么您能否提供我在 R 中的 DEoptim(差分进化)代码,以便我可以进行一些自定义更改以改善结果。
PS--我看过DEoptim的R目录代码,但是太复杂了,看不懂
r - R中差分进化的代码错误
我正在寻找 NSS 模型(收益率曲线估计模型)的最佳参数,因为我在 R 中得到了这个差分进化代码。[我不想使用 DEoptim 库)。我在运行此代码时遇到问题。我使用了以下代码
我的代码中的错误消息
通过以下方式调用函数后:
这个错误来了
我不知道这是什么错误。请帮忙
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
必须具有与我的误差函数兼容的维度。但是,我不确定这两个参数是如何准确关联的,除了我正在找到断点、斜率和偏移量,这些断点、斜率和偏移量可以在给定边界的情况下最小化断点。
此外,我的进攻计划似乎非常冗长和野蛮。有没有更好的方法来解决这个问题?
我想也许它正在将我的分段函数视为无类型。打印带有一些随机值的函数仅返回“无”。然而,我的分段函数打印同样的东西,它仍然工作得很好。
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 有一些经验并且可以给我一些正确参数的提示?
python - 如何将参数传递给 scipy.optimize.differential_evolution 中的回调函数
我正在使用来自 scipy.optimize 的差分进化来解决我的优化问题。我的优化器需要一些参数进行优化。
代码 -
我还有一个回调函数。我想将我的参数发送到我的回调函数,这就是我的问题出现的地方。
如果我不将任何参数传递给我的回调函数,它工作正常 -
但是,如果我arguments
在函数定义中作为参数给出 -
它抛出一个错误。
将参数传递给回调函数的正确方法是什么?
python - scipy.optimize 差分进化中初始参数的形状
我不明白算法期望init
参数的形状。
在帮助中,它说:
init
str 或类似数组,可选指定执行哪种类型的人口初始化。应该是以下之一:
数组应具有形状 (M, len(x)),其中 len(x) 是参数的数量。init 在使用前被剪裁到边界。
我正在传递形状为(1,17)的东西(数组数组)作为初始值(=init
参数)。因此,代表我的 17 个参数的 17 个值的 numpy 数组并收到以下错误消息:
ValueError:提供的总体需要具有形状 (M, len(x)),其中 M > 4。
试图深入研究它,我在源代码中得到了这一行:
if
我理解的 3 条语句中的最后 2 条。您要确保它是一个数组数组并且所有数组都具有正确的大小(即参数的数量)。
但是为什么算法期望用户给它至少 4 个可能的起始值呢?
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 实现中手动输入这些起始值的方法。如果社区中有人可以帮助我,我将不胜感激。
python - 在 numpy 数组中逐元素应用操作
我目前正在python中实现差分进化算法,并且在较低维度上工作时一切都很好,但是,当我开始增加搜索空间的维度时,运行算法所需的时间呈指数增长。做了一点profiling后发现大部分时间都花在了mutation函数上,具体如下,
现在,对于 apopulation size
和100
a dimension
,20
运行算法的总时间约为 40 秒,其中约 20 秒花费在mutate
.
现在,我已经对这个功能进行了优化,使其比以前的版本缩短了大约 3 秒。
但显然,这还不够。我想知道是否有一个技巧numpy
可以删除 for 循环在r0, r1, r2, and mutant
. 问题是只能cross_indxs
使用索引为 in 的元素。
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 的问题。但是,问题在于我定义的数组的维度不是所需的。
定义它们时要引入的正确代码如下
(在我的情况下,问题是在全局定义时它返回:值错误:对象太深,无法满足所需的数组错误:函数调用的结果不是正确的浮点数组)