我想知道如何为 scipy.optimize.minimize 选择最佳的最小化方法以及结果可能有多大不同?
我试图最小化以下表达式(求解 g):
|a1.g.x + a2.g.x^3 - K|
我有一个分配问题,我想向 SO 社区询问为我的 Spark 数据帧实现此任务的最佳方法(使用 Spark 3.1+)。我将首先描述问题,然后再进行实施。
问题是:我最多有 N 个任务和 N 个个人(在这个问题的情况下,N=10)。每个人执行每项任务都有一定的成本,其中最小成本为 0 美元,最大成本为 10 美元。这是一种匈牙利算法问题,有一些注意事项。
multiTask=True(不能超过 1 个multiTask,也可能没有)。如果一个worker的成本低于x多任务,他会被自动分配给多任务,并且在优化过程中该多任务被认为已被占用。
这是 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
我建立了一个具有线性等式约束的优化问题,如下所示
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
经过几天在互联网上寻找答案,当然,在溢出的情况下,我发表了这篇文章。我希望有人能帮助我。我制作了一个小程序,适合使用 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) 我是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) 我正在尝试使用 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), ...]
我正在使用least_squares优化来根据某些测量数据调整数值模型的输出。在这个阶段,我想知道如何确定ftol、xtol和gtol参数的适当值,因为它们确定优化将如何以及在何处停止。对我来说,这些参数似乎非常适合算法的框架,但我发现很难将它们与现实世界的属性联系起来。
例如,我对测量数据有不确定性估计,因此一旦优化器在不确定性限制内模型的输出和测量数据之间达到足够的一致性,就可以合理地停止(即 )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参数再次仅描述参数更新和当前值之间的比例因子。虽然我可以使用一些值来反映设备在预期最终参数值周围的精度,但我已经看到优化器达到的中间参数值比最终估计值大两个数量级,因此这显然有提前终止的风险。
虽然我发现很难为ftol、xtol和gtol参数选择合适的值,但在没有良好论证的情况下将它们保留为默认值同样令人不满意,因为这意味着同意它们的默认值是合理的。
我希望获得与 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) 我在 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
我发现 NLCG 和 L-BFGS 中线搜索的初始猜测步长由下式确定
注释是“将初始步骤猜测设置为 dx ~ 1”。
其背后的原理是什么?你能给我一些指导吗?
scipy-optimize ×10
python ×8
scipy ×6
optimization ×4
apache-spark ×1
minimization ×1
numpy ×1
openmdao ×1
pyspark ×1