【问题标题】:Minimizing a simple Linear Combination最小化一个简单的线性组合
【发布时间】:2022-01-26 02:30:29
【问题描述】:

我知道这不是一件实际的事情(这个问题我只是为了理解发生了什么),但我想知道为什么 SciPy 不能最小化以下线性组合(它返回初始权重并且只进行 1 次迭代):

from scipy.optimize import minimize
import numpy as np

mean = np.array([[0.00149066, 0.00076633]])

def constrain1(w):
    return w[0] + w[1] - 1

def minimize_func(w):
    return (w[0]*mean[0,0] + w[1]*mean[0,1])*(-1)


initial_guess = [0.5,0.5]
bound = (0,1)
bounds = [bound for i in range(2)]
con1 = {"type": "eq", "fun": constrain1}
cons = [con1]
sol = minimize(minimize_func, initial_guess,
               method="SLSQP", bounds=bounds, constraints=cons)

【问题讨论】:

  • 什么是returns?这在任何地方都没有定义。
  • @bnaecker 这是因为这是对代码的简化,我忘了更改它。已更正!

标签: python optimization scipy scipy-optimize-minimize quadratic-programming


【解决方案1】:

这里没有什么太神秘的了。通过更改函数的参数,目标函数并没有太大改善。

minimize 以数值方式估计雅可比行列式,即目标的一阶导数。很容易看出这只是-mean。但是,mean 中的值很小。并且考虑到参数和为1的进一步约束,因此参数也必须很小,这意味着minimize_func的输出不会随着minimize搜索参数空间而发生很大变化。也就是说,目标在参数空间中非常相似。

让我们把它具体化。考虑一下(0.5, 0.5) 的初始客人。这里的目标值是:

>>> minimize_func((0.5, 0.5))
-0.001128495

minimize 将对这些参数进行小幅扰动,并重新计算目标,以确定这些更改是否会改善目标。因为您没有指定任何曲率信息(Hessian 或二阶导数),所以该函数选择启发式步长,在本例中为 1e-8。 (您可以通过在目标函数中打印 w 来查看这一点。)

那么这对目标有多大的改变?

>>> minimize_func((0.5, 0.5)) - minimize_func((0.5 + 1e-8, 0.5 - 1e-8))
7.243299926865121e-12

不幸的是,不多。这远低于此求解器的 default tolerance of 1e-6

我们可以看到minimize 实际上会通过指定较低的容差来执行进一步的迭代。

>>> minimize(minimize_func, (0.5, 0.5), method="SLSQP", bounds=bounds, constraints=cons, options={'disp': True}, tol=1e-8)
Optimization terminated successfully    (Exit mode 0)
            Current function value: -0.0014906599999999996
            Iterations: 7
            Function evaluations: 21
            Gradient evaluations: 7
     fun: -0.0014906599999999996
     jac: array([-0.00149066, -0.00076633])
 message: 'Optimization terminated successfully'
    nfev: 21
     nit: 7
    njev: 7
  status: 0
 success: True
       x: array([1.00000000e+00, 5.55111512e-16])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2015-12-18
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2023-03-08
    相关资源
    最近更新 更多