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

Is it possible to specify starting values for each parameter (instead of bounds) for scipy's differential evolution?

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

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

这确实是可能的 since version 1.1 of SciPy(请注意,您指的是过时的 0.17.0 文档)。特别是,最近的版本允许您指定任何数组,而不仅仅是 'hypercube''random'。根据文档,init 的可能值为:

array specifying the initial population. The array should have shape (M, len(x)), where len(x) is the number of parameters. init is clipped to bounds before use.

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.differential_evolution.html

如果由于某种原因,您被迫使用旧版本,仍然可以通过使用底层 DifferentialEvolutionSolver 来获得您想要的东西。在那里,您可以猴子修补其中一个初始化函数,或者只是 运行 它们并手动覆盖 population 属性 post-initialization.