问题标签 [scipy-optimize]

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 回答
50 浏览

python - 在不知道原始函数的情况下最小化已知成本函数

我试图通过调整两个参数来使一个函数适合另一个函数。但我不知道这个函数的形式。我只有成本函数,因为该函数的计算使用了 LAMMPS(分子动力学)。我需要一些工具,我只能给出成本函数和我的猜测,然后它会最小化它。

我正在寻找 SciPy 优化,但它看起来需要我没有的原始功能。

0 投票
1 回答
119 浏览

python - 如何同时将 2 个数据集拟合到 2 个参考数据集并提取共享参数

我有 2 个(模拟)数据集和 2 个(实验)参考数据集。

由于模拟是以数值方式进行的,因此没有方法/功能是已知的,只有模拟数据可用。

这两个数据集共享我想通过将模拟拟合到参考数据来提取的参数。

我没有找到任何 python 功能来仅使用数据集而不是拟合函数/模型来执行这种拟合/最小化/优化。

具体来说:我有以下两个方程:

e1 = a * s1 + b * t1 + c * u1 和

e2 = a * s2 + b * t2 + c * u2 和

我想弄清楚参数a,b,c。

e1, e2 是实验性的 NxN np.arrays(可以在热图中可视化或可以视为 f(x,y) )和

s1, s2, t1, t2, u1, u2 是包含模拟数据的 MxM np.arrays。

我希望方程(热图)的左侧和右侧尽可能相似,并考虑两个方程相似以了解 a、b、c。

使 N = M 需要付出努力,但可以做到。我知道,我必须使用两个模型,但我只知道如何将匹配的 1xN 实验和模拟数组传递给模型。

0 投票
1 回答
210 浏览

python - 优化器在某些点上失败的点和曲线之间的最小距离

我有一个包含纬度和经度的数据集,我对其应用了四阶线性回归,然后使用函数 from获取每个数据点到回归的最小距离(即法线向量) ,正如我在本指南中发现的那样.fmin_cobylascipy.optimize

优化器采用cobyla目标(即两点之间的距离)、初始猜测和约束(即解决方案必须是回归曲线的一部分)。代码如下:

例如,如果long_t = 141.2393842lat_t = 45.1779571,我们可以绘制数据集、回归线以及该点与曲线之间的线段,如下所示:

COBYLA 寻找解决方案

但是,当我使用其他一些数据点进行测试时,优化器找不到解决方案,而是将数据点本身作为解决方案。下面是一个带有long_t = 130.4183692and的例子lat_t = 31.5231443,它的优化K输出[130.41821497 31.52316012](本质上是相同的点):

COBYLA 进入恐慌模式

正如我所发现的,在对整个数据集应用优化后,所有低于回归曲线的数据点都会出现此问题:

查找此问题的模式

起初,我认为这可能与初始猜测x0是曲线上方的设定点有关,因此在这些情况下找到了局部最小值,但是更改这些参数并没有取得成功,也没有将其设置在曲线下方,数据点本身,靠近数据点的点或曲线上相同经度的点。

为什么 COBYLA 优化器适用于曲线上方的数据点,而不适用于曲线下方的数据点?我应该使用这个优化器来解决我要解决的问题吗?如果没有,您会推荐哪个优化器以及如何实现它?

0 投票
1 回答
491 浏览

python - 查找具有边界和约束的离散变量的函数最小值

我试图找到一种(相对)快速的方法来最小化给定约束和界限的自然数集上的函数。我知道函数的数学形式及其约束,所以蛮力方法似乎很慢而且不是很优雅。解决这个问题的最佳方法是什么?

基本上,我试图从使用 scipy.optimize.minimize 对实数进行功能最小化到自然数上的一个。(我知道这要困难得多)

让事情变得容易。我在想这样的例子:

换句话说,我希望添加约束和界限

(我知道我可以通过从 xr 中排除这些值来强加它们,但这对于我所想到的实际情况来说似乎不太优雅且不太实用)

所以我期待有一些不同的最小化器,比如 scipy.optimize.basinhopping 或者神秘的东西来做这个把戏?有什么建议么?

0 投票
1 回答
790 浏览

python - 如何限制优化值大于 0

假设我需要最小化一个函数,但我想保持上面的结果0。也就是优化后的值应该是>= 0。我可以找到有关如何约束参数而不是返回值本身的内容。

0 投票
1 回答
4740 浏览

python - scipy差分进化设置问题

下面是一个非常愚蠢的例子,它基本上是我真实世界用例的简化

我无法让它工作。我希望它能给我x最小化的值,cost_function但我收到以下错误消息:

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

听起来我没有正确设置问题,或者我的函数没有返回正确类型的数据differential_evolution以正确解释,但我不知道应该在哪里更正。

欢迎任何帮助

这是堆栈

0 投票
1 回答
483 浏览

python - Matlab 和 Python 中 fmin 和 fminsearch 的结果差异

我的目标是对一些衰减数据(通过 CPMG 的 NMR T2 衰减)执行拉普拉斯逆变换。为此,我们获得了 CONTIN 算法。该算法由 Iari-Gabriel Marino 改编为 Matlab,效果非常好。我想将此代码改编成 Python。问题的核心是scipy.optimize.fmin,它不会以任何类似于 Matlab 的方式最小化均方偏差 (MSD) fminsearch。后者产生了很好的最小化,而前者没有。

我已经逐行浏览了我在 Python 中改编的代码和原始的 Matlab。我检查了每个矩阵和每个输出。我用它来确定临界点在fmin. 我也尝试过scipy.optimize.minimize其他最小化算法,但都没有给出令人满意的结果。

我为 Python 和 Matlab 制作了两个 MWE,以使其对所有人都可重现。示例数据来自 matlab 函数的文档。抱歉,如果这是长代码,但我真的不知道如何在不牺牲可读性和清晰度的情况下缩短它。我试图让线条尽可能地匹配。我在 Windows 8.1 上使用 Python 3.7.3、scipy v1.3.0、numpy 1.16.2、Matlab R2018b。这是一个相对较新的 Anaconda 安装(<2 个月)。

我的代码:

MATLAB:

这是Python中的优化 这是Python中的优化

这是Matlab中的优化 这是Matlab中的优化

我在开始之前检查了 g0 的 MSD 的输出,两者都给出了 2651 的值。最小化之后,Python 上升到 4547,Matlab 下降到 0.1381。

我认为问题是以下之一。它在我的实现中,即我使用fmin错误,或者我错了其他一些段落,但我无法弄清楚是什么。MSD 在应该通过最小化函数减少时增加的事实是该死的。阅读文档,scipy 实现与 Matlab 的不同(他们使用 Lagarias 中描述的 Nelder Mead 方法,根据他们的文档),而 scipy 使用原始的 Nelder Mead)。也许这会影响很大?或者我最初的猜测对于 scipy 的算法来说太糟糕了?

0 投票
2 回答
2552 浏览

python - 如何在一组数据中拟合多个独立且重叠的洛伦兹峰?

我需要在同一个数据集中拟合几个洛伦兹峰,其中一些是重叠的。我最需要的功能是峰值位置(中心),但我似乎无法拟合这些数据中的所有峰值。

我首先尝试使用 scipy 的优化曲线拟合,但是我无法让边界起作用,它会尝试拟合整个光谱范围。我一直在使用 python 包 lmfit 并获得不错的结果,但是我似乎无法很好地选择重叠峰。

你可以在这里看到带有标记峰的原始光谱 和我的拟合结果

你可以在这里找到我正在使用的数据

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 回答
506 浏览

python - scipy优化中的自定义收敛标准

我正在使用scipy.optimize以下方式优化函数:

我的问题是我不想简单地在容差小于一个值时停止(例如,如果在第 n 次迭代停止是|y_n - y_(n-1)|<tol)。相反,我有一个稍微复杂的函数y_nand y_(n-1),比如说tolFun,我想在什么时候停止tolFun(y_n, y_(n-1))<tol

为了提供更多细节,我的公差函数如下。它划分y成块,然后检查任何单独的分区是否在容差范围内具有范数差异,如果有,则应该停止最小化。

我的问题与此处的这个问题类似,但不同之处在于,该用户只需要 的当前迭代值y,而我的自定义容差函数既需要 的当前迭代值,y也需要先前的值。有谁知道我该怎么做?