问题标签 [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.
python - 在不知道原始函数的情况下最小化已知成本函数
我试图通过调整两个参数来使一个函数适合另一个函数。但我不知道这个函数的形式。我只有成本函数,因为该函数的计算使用了 LAMMPS(分子动力学)。我需要一些工具,我只能给出成本函数和我的猜测,然后它会最小化它。
我正在寻找 SciPy 优化,但它看起来需要我没有的原始功能。
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 实验和模拟数组传递给模型。
python - 优化器在某些点上失败的点和曲线之间的最小距离
我有一个包含纬度和经度的数据集,我对其应用了四阶线性回归,然后使用函数 from获取每个数据点到回归的最小距离(即法线向量) ,正如我在本指南中发现的那样.fmin_cobyla
scipy.optimize
优化器采用cobyla
目标(即两点之间的距离)、初始猜测和约束(即解决方案必须是回归曲线的一部分)。代码如下:
例如,如果long_t = 141.2393842
和lat_t = 45.1779571
,我们可以绘制数据集、回归线以及该点与曲线之间的线段,如下所示:
但是,当我使用其他一些数据点进行测试时,优化器找不到解决方案,而是将数据点本身作为解决方案。下面是一个带有long_t = 130.4183692
and的例子lat_t = 31.5231443
,它的优化K
输出[130.41821497 31.52316012]
(本质上是相同的点):
正如我所发现的,在对整个数据集应用优化后,所有低于回归曲线的数据点都会出现此问题:
起初,我认为这可能与初始猜测x0
是曲线上方的设定点有关,因此在这些情况下找到了局部最小值,但是更改这些参数并没有取得成功,也没有将其设置在曲线下方,数据点本身,靠近数据点的点或曲线上相同经度的点。
为什么 COBYLA 优化器适用于曲线上方的数据点,而不适用于曲线下方的数据点?我应该使用这个优化器来解决我要解决的问题吗?如果没有,您会推荐哪个优化器以及如何实现它?
python - 查找具有边界和约束的离散变量的函数最小值
我试图找到一种(相对)快速的方法来最小化给定约束和界限的自然数集上的函数。我知道函数的数学形式及其约束,所以蛮力方法似乎很慢而且不是很优雅。解决这个问题的最佳方法是什么?
基本上,我试图从使用 scipy.optimize.minimize 对实数进行功能最小化到自然数上的一个。(我知道这要困难得多)
让事情变得容易。我在想这样的例子:
换句话说,我希望添加约束和界限
(我知道我可以通过从 xr 中排除这些值来强加它们,但这对于我所想到的实际情况来说似乎不太优雅且不太实用)
所以我期待有一些不同的最小化器,比如 scipy.optimize.basinhopping 或者神秘的东西来做这个把戏?有什么建议么?
python - 如何限制优化值大于 0
假设我需要最小化一个函数,但我想保持上面的结果0
。也就是优化后的值应该是>= 0
。我可以找到有关如何约束参数而不是返回值本身的内容。
python - scipy差分进化设置问题
下面是一个非常愚蠢的例子,它基本上是我真实世界用例的简化
我无法让它工作。我希望它能给我x
最小化的值,cost_function
但我收到以下错误消息:
RuntimeError:类似地图的可调用对象必须是 f(func, iterable) 的形式,返回与“可迭代”长度相同的数字序列
听起来我没有正确设置问题,或者我的函数没有返回正确类型的数据differential_evolution
以正确解释,但我不知道应该在哪里更正。
欢迎任何帮助
这是堆栈
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中的优化
这是Matlab中的优化
我在开始之前检查了 g0 的 MSD 的输出,两者都给出了 2651 的值。最小化之后,Python 上升到 4547,Matlab 下降到 0.1381。
我认为问题是以下之一。它在我的实现中,即我使用fmin
错误,或者我错了其他一些段落,但我无法弄清楚是什么。MSD 在应该通过最小化函数减少时增加的事实是该死的。阅读文档,scipy 实现与 Matlab 的不同(他们使用 Lagarias 中描述的 Nelder Mead 方法,根据他们的文档),而 scipy 使用原始的 Nelder Mead)。也许这会影响很大?或者我最初的猜测对于 scipy 的算法来说太糟糕了?
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.optimize
以下方式优化函数:
我的问题是我不想简单地在容差小于一个值时停止(例如,如果在第 n 次迭代停止是|y_n - y_(n-1)|<tol
)。相反,我有一个稍微复杂的函数y_n
and y_(n-1)
,比如说tolFun
,我想在什么时候停止tolFun(y_n, y_(n-1))<tol
。
为了提供更多细节,我的公差函数如下。它划分y
成块,然后检查任何单独的分区是否在容差范围内具有范数差异,如果有,则应该停止最小化。
我的问题与此处的这个问题类似,但不同之处在于,该用户只需要 的当前迭代值y
,而我的自定义容差函数既需要 的当前迭代值,y
也需要先前的值。有谁知道我该怎么做?