【问题标题】:Maximise function using scipy minimize使用 scipy 最大化函数
【发布时间】:2020-03-08 11:15:24
【问题描述】:

我想优化我的函数Strategy2(alpha, beta),它对一些数据执行下注策略,从钱包值20,000开始,并返回一个新的钱包值。

所以我需要找到最大化返回值的最佳alphabeta 值。

一个快速的谷歌表明 scipy 是要走的路,但我正在努力实现它。

在尝试这种优化方法之前,我采用了固定 alpha 的方法,然后找到最佳 beta,然后对固定 beta 进行相同的操作并找到最佳 alpha。

这种方法给出了 Strategy2(23,3) 的最佳值,它返回 24,650

这是我尝试实现模块 scipy 中的最小化方法:

import numpy as np
from scipy.optimize import minimize
bnds = ((None, None), (None, None))
param = [0, 0]
f = lambda param: Strategy2(param[0], param[1])
param_init = 0, 100
param = minimize(f, param_init, method='SLSQP', bounds=bnds).x
print(param)

如你所见,我真的不知道自己在做什么,实际上这只是返回

[  0. 100.]

最终钱包价值为 10,705。这显然小于 24,650。所以显然有些事情是行不通的。

我怎样才能得到它以便最大化Strategy2(alpha, beta)?理想情况下,我希望将 alpha 从 0 更改为 100,并将 beta 从 1 更改为 15。

提前致谢。

编辑:我对上述代码的推理是我只是试图调整以下工作代码:

import numpy as np
from scipy.optimize import lsq_linear, minimize
bnds = ((None, None), (None, None))
fun = lambda param: np.linalg.norm(-np.exp(param[0]) + param[1])
param_init = -4, 4
param = minimize(fun, param_init, method='SLSQP', bounds=bnds).x

正确地最小化上述函数。

如果有更好的方法来最大化我的功能,请告诉我。

【问题讨论】:

  • 这是我实现 scipy 的尝试 scipy 是一个库或模块,包含各种数据结构和函数。当您说 ...implement scipiy... 时,我不确定您的意思。此外,鉴于您发布的代码,我们可以在这里测试的内容不多。请发布一个最小的、可验证的、可重现的示例 (stackoverflow.com/help/minimal-reproducible-example)。
  • 我已经编辑了评论以澄清我对 scipy 的意思。

标签: python scipy scipy-optimize scipy-optimize-minimize


【解决方案1】:

如果你的 Strategy2(alpha, beta) 返回钱包值,那么你的目标函数 f 应该被反转。最小化f 应该等同于最大化Strategy2(alpha, beta),但在您的代码中并非如此。我建议使用:

bnds = ((None, None), (None, None))
param = [0, 0]
f = lambda param: 1 / Strategy2(param[0], param[1])
param_init = 0, 100
param = minimize(f, param_init, method='SLSQP', bounds=bnds).x
print(param)

在这种情况下,如果f 被最小化,那么Strategy2() 被最大化。 我还建议使用一些界限来限制您的搜索空间(有利于速度和效率)。

【讨论】:

  • 谢谢,我已经编辑了代码,使函数反转,但它仍然返回:[ 0. 100.] 它似乎只是在重复运行带有参数 [0,100] 的函数,但是不改变它们,因此只返回 [0,100] 作为最佳值
  • 在尝试最大化函数时,为什么 1/f 优于 -f 是否有理由?我一直想知道哪个更好。
  • obj 的选择。 func 非常果断。我无法完美地解释它,因为我对这个主题也不是很了解。但是给你一个快速的想法;大多数优化依赖于梯度下降、Hessian 和 Jacobian。为了简单起见,考虑一个一维函数,其中等价物是导数函数。
  • 取 f(x) = 1-x,在 -f(x) 的情况下,将用于推进优化的一阶导数是常数 =-1,在这种情况下1/f(x) = 1/(1-x)^2。我认为第二个变体可能会导致更敏感的优化,而第一个甚至可能错过最佳值。
猜你喜欢
  • 2018-01-30
  • 2015-02-18
  • 1970-01-01
  • 2020-02-23
  • 1970-01-01
  • 2021-10-25
  • 2019-03-21
  • 2016-05-27
相关资源
最近更新 更多