标签: scipy-optimize

如何为 scipy.optimize.minimize 选择正确的方法?

我想知道如何为 scipy.optimize.minimize 选择最佳的最小化方法以及结果可能有多大不同?

我试图最小化以下表达式(求解 g):

|a1.g.x + a2.g.x^3 - K|

minimization scipy-optimize scipy-optimize-minimize

15
推荐指数
1
解决办法
2万
查看次数

如何解决 PySpark UDF 中具有边缘情况的分配问题(如匈牙利/线性求和分配)

我有一个分配问题,我想向 SO 社区询问为我的 Spark 数据帧实现此任务的最佳方法(使用 Spark 3.1+)。我将首先描述问题,然后再进行实施。

问题是:我最多有 N 个任务和 N 个个人(在这个问题的情况下,N=10)。每个人执行每项任务都有一定的成本,其中最小成本为 0 美元,最大成本为 10 美元。这是一种匈牙利算法问题,有一些注意事项。

  1. 在某些情况下,任务数少于 10 个和/或个人数少于 10 个,并且不向某人分配任务(或不向个人分配任务)是可以的。
  2. [更复杂的边缘情况/我遇到麻烦的情况] - 列表中可能有一项任务具有该标志multiTask=True(不能超过 1 个multiTask,也可能没有)。如果一个worker的成本低于x多任务,他会被自动分配给多任务,并且在优化过程中该多任务被认为已被占用。
    • 我将分享几个例子。在此示例中,要分配给多任务的 x 值为 1。
      • 如果 10 名工人中有 1 名在多任务上的成本为 0.25,则他会被分配到多任务,然后其他 9 名工人将被分配到其他 9 个任务
      • 如果 10 名工作人员中的 2 名工作人员在多任务上的成本 < 1,则他们都将被分配到多任务,然后其他 8 名工作人员将被分配到剩余 9 个任务中的 8 个。1 个任务不会分配给任何人。
      • 如果所有 10 个工作人员在多任务上的成本均 < 1,则将所有人员分配给该多任务。这种情况非常罕见,但却是可能的。
      • 如果没有工人在多任务上的成本< 1,则在优化期间多任务将仅分配给一个人,以最小化成本。

这是 Spark 数据框的样子。注意:为了简单起见,我展示了一个示例,其中 N=3(3 个任务,3 个个人)。

from pyspark.sql import Row

rdd …
Run Code Online (Sandbox Code Playgroud)

python hungarian-algorithm apache-spark pyspark scipy-optimize

11
推荐指数
1
解决办法
897
查看次数

scipy.optimize.minimize(method ='trust-constr')不会在xtol条件下终止

我建立了一个具有线性等式约束的优化问题,如下所示

sol0 = minimize(objective, x0, args=mock_df, method='trust-constr',
                bounds=bnds, constraints=cons,
                options={'maxiter': 250, 'verbose': 3})
Run Code Online (Sandbox Code Playgroud)

objective是一个加权和功能,其系数/权重进行优化,使之最小化。由于我在系数和约束上都有边界,因此我使用内的trust-constr方法scipy.optimize.minimize

最小化可行,但是我不理解终止标准。根据trust-constr文档,它应该终止于xtol

该算法将在时终止tr_radius < xtol,其中,tr_radius是算法中使用的信任区域的半径。默认值为1e-8。

但是,verbose输出显示终止确实是由barrier_tol参数触发的,如下面的清单所示

| niter |f evals|CG iter|  obj func   |tr radius |   opt    |  c viol  | penalty  |barrier param|CG stop|
|-------|-------|-------|-------------|----------|----------|----------|----------|-------------|-------|
C:\ProgramData\Anaconda3\lib\site-packages\scipy\optimize\_trustregion_constr\projections.py:182: UserWarning: Singular Jacobian matrix. Using SVD decomposition to perform the factorizations.
  warn('Singular Jacobian matrix. Using SVD decomposition to ' +
|   1 …
Run Code Online (Sandbox Code Playgroud)

python optimization scipy scipy-optimize scipy-optimize-minimize

10
推荐指数
2
解决办法
222
查看次数

使用 pyinstaller 编译 python 脚本后没有名为“scipy.spatial.transform._rotation_groups”的模块

经过几天在互联网上寻找答案,当然,在溢出的情况下,我发表了这篇文章。我希望有人能帮助我。我制作了一个小程序,适合使用 scipy.optimize 通过数学模型从化学实验中获得的一些数据。然后我从数据和拟合中得到了点图。当我在 IDLE 上运行它时一切正常,当我从 Windows 命令运行时也是如此。问题是我想制作一个 .exe 文件,这样我就可以与我的大学同学分享我的程序。为此我使用了 pyinstaller。当我运行 pyinstaller 来制作 mi .exe 文件时,一切正常,但是当我想从 Windows 命令运行它时,我得到下一个输出:

Traceback (most recent call last):
  File "solver_tp2fq_ver2.py", line 9, in <module>
  File "c:\users\lenovo\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "scipy\optimize\__init__.py", line 421, in <module>
  File "c:\users\lenovo\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "scipy\optimize\_shgo.py", line 9, in <module>
  File "c:\users\lenovo\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "scipy\spatial\__init__.py", line 107, in <module>
  File "c:\users\lenovo\appdata\local\programs\python\python39\lib\site-packages\PyInstaller\loader\pyimod03_importers.py", line 493, in exec_module
    exec(bytecode, module.__dict__)
  File "scipy\spatial\transform\__init__.py", …
Run Code Online (Sandbox Code Playgroud)

python numpy scipy scipy-optimize modulenotfounderror

8
推荐指数
2
解决办法
5732
查看次数

如何计算成对距离函数的雅可比行列式(`scipy.spatial.pdist`)

语境

我是netgraph的作者和维护者,netgraph 是一个用于创建网络可视化的 Python 库。N我目前正在尝试优化一个例程,该例程计算每条边都有定义长度的网络的一组节点位置。可以在此处找到示例。

问题

该例程的核心是scipy.optimize.minimize计算使节点之间的总距离最大化的位置:

def cost_function(positions):
    return 1. / np.sum((pdist(positions.reshape((-1, 2))))**power)

result = minimize(cost_function, initial_positions.flatten(), method='SLSQP',
                  jac="2-point", constraints=[nonlinear_constraint])
Run Code Online (Sandbox Code Playgroud)
  • positions是 (x, y) 元组的(已解开的)numpy 数组。
  • power是一个较小的数字,限制了大距离的影响(以鼓励紧凑的节点布局),但出于本问题的目的,可以假设为 1。
  • pdist是 中的成对距离函数scipy.spatial

最小化(/最大化)使用以下非线性约束进行约束:

lower_bounds = ... # (squareform of an) (N, N) distance matrix of the sum of node sizes (i.e. nodes should not overlap)
upper_bounds = ... # (squareform of an) (N, N) distance matrix constructed from the given …
Run Code Online (Sandbox Code Playgroud)

python optimization scipy scipy-optimize

8
推荐指数
1
解决办法
549
查看次数

如何修复使用 fmin_l_bfgs_b 后出现的“初始化意图(inout|inplace|cache)数组失败,输入不是数组”?

我正在尝试使用 scipy.optimize.fmin_l_bfgs_b 函数来最小化我的函数evaluateFunc(params),它返回一个错误和相关的错误梯度。

但是,当我用这个函数调用函数 fmin_l_bfgs_b 时,它向我发送了这条消息:“初始化意图(inout|inplace|cache)数组失败,输入不是数组”。

我认为问题出在我的参数上,所以我尝试将它们更改为 numpy.array, list。我的参数“params”和“bounds”具有相同的大小。我这样调用函数:

params, minval, infos = fmin_l_bfgs_b(evaluateFunc, params, bounds=bounds)
Run Code Online (Sandbox Code Playgroud)

其中 params 看起来像 [0.3467169328403201, 0.3467936178031559, 0.5473515530057025,...]

和边界 [(None, None), (0, None), (0, None), ...]

python scipy-optimize

7
推荐指数
0
解决办法
792
查看次数

如何为最小二乘优化确定适当的 ftol、xtol 和 gtol 值?

我正在使用least_squares优化来根据某些测量数据调整数值模型的输出。在这个阶段,我想知道如何确定ftolxtolgtol参数的适当值,因为它们确定优化将如何以及在何处停止。对我来说,这些参数似乎非常适合算法的框架,但我发现很难将它们与现实世界的属性联系起来。

例如,我对测量数据有不确定性估计,因此一旦优化器在不确定性限制内模型的输出和测量数据之间达到足够的一致性,就可以合理地停止(即 )np.all(np.abs(model_output - measured_data) < uncertainty)。然而这似乎不能用ftol参数来表达。终止条件为dF < ftol * F(其中F是残差平方和,dF是其变化),因此,即使我可以计算ftol以防止更新小于一旦F达到该级别的不确定性,我也可能会在远离预期的地方提前终止。所需的解决方案。最后,由优化器决定在每次迭代时要采取多大的步长(从而确定dF),因此与所需的解决方案相去甚远,因此dF可能会很小。F

另一方面是参数值的改变。最后,优化得到的结果将用于调整一些实际设备,而这些设备的精度是有限的。例如,设备不会区分相差小于 的值1e-6。这再次意味着,一旦模型的输出和测量数据之间达到足够的一致性,任何小于的参数更新1e-6都是没有意义的。另一方面,许多小的更新< 1e-6可以总结为更大的整体更新> 1e-6,我又回到了同样的问题:这取决于优化器想要采取多大的步骤并限制这一点,我担心我会冒过早的风险终止。此外,该xtol参数再次仅描述参数更新和当前值之间的比例因子。虽然我可以使用一些值来反映设备在预期最终参数值周围的精度,但我已经看到优化器达到的中间参数值比最终估计值大两个数量级,因此这显然有提前终止的风险。

虽然我发现很难为ftolxtolgtol参数选择合适的值,但在没有良好论证的情况下将它们保留为默认值同样令人不满意,因为这意味着同意它们的默认值是合理的。

python optimization scipy scipy-optimize

7
推荐指数
1
解决办法
1649
查看次数

找到变量的值以最大化Python中函数的回报

我希望获得与 Excel 中求解器函数的工作方式类似的结果。我一直在阅读 Scipy optimization 并尝试构建一个函数来输出我想要找到的最大值。该方程基于四个不同的变量,请参阅下面的代码:

import pandas as pd
import numpy as np
from scipy import optimize

cols = {
    'Dividend2': [9390, 7448, 177], 
    'Probability': [341, 376, 452], 
    'EV': [0.53, 0.60, 0.55], 
    'Dividend': [185, 55, 755], 
    'EV2': [123, 139, 544],
}

df = pd.DataFrame(cols)

def myFunc(params):
    """myFunc metric."""
    (ev, bv, vc, dv) = params
    df['Number'] = np.where(df['Dividend2'] <= vc, 1, 0) \
                    + np.where(df['EV2'] <= dv, 1, 0)
    df['Return'] =  np.where(
        df['EV'] <= ev, 0, np.where(
            df['Probability'] >= bv, …
Run Code Online (Sandbox Code Playgroud)

python scipy-optimize

7
推荐指数
1
解决办法
1709
查看次数

SLSQP 优化算法如何工作?

我在 openMDAO 中使用 SLSQP 算法,但我无法理解它的实际工作原理。我只是看常见的抛物面示例,它有 2 个设计变量,旨在最小化 f,没有任何限制。通过打印每次迭代的 x、y 和 f 的值(迭代可能不是正确的词),我可以看到有时使用每个设计变量(x,y)的前向有限差​​分来评估一阶导数。然后使用这些导数来查找下一个 x 和 y 值,但是我看不到该模式。

另外,当我读到 SLSQP 方法时,还需要二阶导数。但是,我没有看到它被计算出来。让我举一个我的输出的例子:

iteration 1:
x = 0
y = 0
f = 22

iteration 2:
x = 0.01
y = 0
f = 21.9401

iteration 3:
x = 0
y = 0.01
f = 22.0801
Run Code Online (Sandbox Code Playgroud)

从最后 2 次迭代中,我们可以计算出 df/dx = 5.99 , df/dy = -8.01

下一次迭代恰好是:

x = 5.99
y = -8.01
f = -25.9597
Run Code Online (Sandbox Code Playgroud)

然后从这一点再次进行两次有限差分计算找到: df/dx = 2.02 , df/dy = 2.02 …

optimization mathematical-optimization scipy openmdao scipy-optimize

6
推荐指数
1
解决办法
2万
查看次数

如何给出线搜索的初始猜测步长

我发现 NLCG 和 L-BFGS 中线搜索的初始猜测步长由下式确定

“old_old_fval = old_fval + np.linalg.norm(gfk) / 2”,(https://github.com/scipy/scipy/blob/master/scipy/optimize/_optimize.py中的第 1621 行)。

注释是“将初始步骤猜测设置为 dx ~ 1”。

其背后的原理是什么?你能给我一些指导吗?

python scipy scipy-optimize

6
推荐指数
0
解决办法
164
查看次数