【问题标题】:Parameter optimization with weights使用权重进行参数优化
【发布时间】:2018-08-01 12:29:12
【问题描述】:

对于这个功能:

import numpy as np

def my_function(param1 , param2 , param3 , param4) : 
    return param1 + 3*param2 + 5*param3 + np.power(5 , 3) + np.sqrt(param4)

print(my_function(1,2,3,4))

这打印 134.0

如何使用 my_function 参数的以下条件返回 100 而不是 134.0 或尽可能接近 6 的值:param1 必须在 10-20 范围内,param2 必须在 20-30 范围内,param3 必须在 30 范围内-40,param4 必须在 40-50 范围内

我不是要针对这个问题提供具体的解决方案,但它属于哪个领域?阅读https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.htmlParameter Optimization in Python 表明这可以通过开箱即用的解决方案(低尺寸)来实现。遗传编程可以应用于这个问题吗?

【问题讨论】:

  • 这是一个非线性优化问题。 en.wikipedia.org/wiki/Nonlinear_programming 这里有一个算法工具箱,GA 不是你的首选。
  • param3 从未使用过。
  • 如果你问如何解决 value = my_function ,那可以看作是求根算法(与优化非常相关)。可以看scipydocs.scipy.org/doc/scipy-0.18.1/reference/optimize.html
  • @BadZen 感谢类似:stackoverflow.com/questions/21765794/… 我也很好奇为什么不推荐 GA?使用 GA 可以将权重初始化为范围内的一组随机值,​​并且 GA 应该找到使函数最小化的最佳权重集?
  • 1) 这是一种朴素的无约束优化(有界)。比受约束的选择容易得多。 2)遗传算法只是(个人观点:愚蠢)不完整的启发式,没有正式的保证,只能在有限的先验分析域中工作,同时进行高度调整。 3)由于这看起来是非凸的,您需要确定本地选择解决方案是否可以(简单)或需要全局选择(不太容易)

标签: python optimization mathematical-optimization genetic-algorithm genetic-programming


【解决方案1】:

基本上,您希望最小化估计值和实际函数之间的误差。

编辑这里明显的选择是对 4 个参数使用梯度下降。如果您不想那样做,并要求更像一个务实的解决方案,这里就是。

这里的主要问题是有 4 个参数。要解决这个问题,你可以这样做:

  1. 修复任意 3 个参数,不理会最后一个。我们将尝试找到这个值。
  2. 找到反函数,并对其进行显式求解或使用求解器(可能是数值方法,例如 Newton-Raphson 或 Brent 方法)

我将描述一个过程来证明这个想法。我们将使用 scipy 的 scalar_minimizer,它采用 Brent 方法。

为了便于讨论,让我们让你的函数由 2 个参数组成,假设你的函数是:

def f(p1, p2):
    return p1 + np.sqrt(p2)

您基本上是在问如何找到 f(p1, p2) = 100 的 p1、p2 值。 假设范围如下:

  • p1 的范围:10-20
  • p2 的范围:20-30

让我们将 p1 修复为 10(您可以随意修复此范围内的任何内容)。现在函数变成了

def g(p2):
    return 10 + np.sqrt(p2)

我们希望这个值尽可能接近 100,所以让我们创建一个误差函数来衡量我们的估计值与 100 相差多远。

def error(p2):
    return 100 - (10 + np.sqrt(p2)) # we want to minimize this

您可以找到使该错误最小化的值,以便您可以尽可能接近 100 到

from scipy import optimize
optimize.minimize_scalar(error, bounds = (10,20), method = "bounded")   

它给出 x = 19.9 的值作为最小化误差的值。

【讨论】:

  • 那么这对他的例子有什么作用呢?它将提供什么?
  • 他问的p1值接近100,还能是什么?
  • 为此,您不需要代码,而且您的方法不会带来任何有价值的东西(至少在如何转移方面它是不完整的)(这只是我的观点)。多元 GD 方法是局部的,但这足够了吗?
  • 我很高兴至少你最终意识到这是你的意见。
【解决方案2】:

通过对违反约束添加惩罚来创建要优化的新函数。

param1 必须在 10-20 范围内,因此要满足 param1 的约束,只有要优化的新函数是

f(p1,p2,p3,p4)=my_function(p1,p2,p3,p4)+1000*(p1-30)*2
param1=20+p1

改变变量以优化 p1=param1-20 您可以在约束之前使用系数的大小,这取决于所使用的优化方法。

需要正方形,以便所有 p1 都存在梯度

根据需要为新的优化功能添加其他惩罚

【讨论】:

    【解决方案3】:

    只是为了好玩,julia 中的一个小演示(正如有人所说:没有具体的解决方案可用)。

    这是一个全球开源求解器,可以解决类似的小规模问题(并转移到更复杂的问题)。请记住,您的示例有些微不足道(两个目标都会导致所有变量的下限,不需要优化即可看到它;代码将按预期输出这些值)并且我正在使用其他一些实际存在的值需要优化的东西!

    当模型变得更复杂时,全局优化将不可行(理论上非常困难;有时是不可能的)。您只需将求解器切换到 Ipopt 即可获得局部最优。

    这也可以在 python 中使用pyomo 完成,但它不太好。可以使用模型和求解器。只有代码发生了变化。

    代码

    using JuMP, AmplNLWriter
    
    TARGET = 387
    
    m = Model(solver=AmplNLSolver(CoinOptServices.couenne))
    
    @variable(m, 10 <= param1 <= 20, start=10)
    @variable(m, 20 <= param2 <= 30, start=20)
    @variable(m, 30 <= param3 <= 40, start=30)
    @variable(m, 40 <= param4 <= 50, start=40)
    @variable(m, aux)
    
    @NLconstraint(m, aux == TARGET - (param1 + 3*param2 + 5*param3 + 5^3 + sqrt(param4)))
    @NLobjective(m, Min, aux^2)
    solve(m)
    
    println("objective: ", getobjectivevalue(m))
    println("param1 = ", getvalue(param1))
    println("param2 = ", getvalue(param2))
    println("param3 = ", getvalue(param3))
    println("param4 = ", getvalue(param4))
    

    输出

    Mailing list: couenne@list.coin-or.org
    Instructions: http://www.coin-or.org/Couenne
    couenne:
    ANALYSIS TEST: Couenne: new cutoff value 0.0000000000e+000 (0.016 seconds)
    NLP0012I
                  Num      Status      Obj             It       time                 Location
    NLP0014I             1         OPT 0        7 0.003
    Loaded instance "C:\Users\Sascha\.julia\v0.5\AmplNLWriter\.solverdata\jl_21AE.tmp.nl"
    Constraints:            1
    Variables:              5 (0 integer)
    Auxiliaries:            2 (0 integer)
    
    Coin0506I Presolve 11 (0) rows, 4 (-3) columns and 22 (-3) elements
    Clp0006I 0  Obj 0 Primal inf 0.0023740886 (2)
    Clp0006I 1  Obj -4.0767235e-022
    Clp0000I Optimal - objective value 0
    Clp0032I Optimal objective 0 - 1 iterations time 0.012, Presolve 0.00
    Clp0000I Optimal - objective value 0
    NLP Heuristic: NLP0014I             2         OPT 0        3 0.001
    no solution.
    Cbc0010I After 0 nodes, 0 on tree, 1e+050 best solution, best possible 0 (0.01 seconds)
    Clp0000I Optimal - objective value 3.90625e-007
    Clp0006I 0  Obj 0 Primal inf 0.00098181331 (1)
    Clp0006I 1  Obj -3.2730444e-022
    Clp0000I Optimal - objective value 0
    Optimality Based BT: 0 improved bounds
    Cbc0004I Integer solution of 0 found after 2 iterations and 2 nodes (0.03 seconds)
    Cbc0001I Search completed - best objective 0, took 2 iterations and 2 nodes (0.04 seconds)
    Cbc0035I Maximum depth 0, 0 variables fixed on reduced cost
    
            "Finished"
    
    Linearization cuts added at root node:         11
    Linearization cuts added in total:             11  (separation time: 0s)
    Total solve time:                           0.065s (0.065s in branch-and-bound)
    Lower bound:                                    0
    Upper bound:                                    0  (gap: 0.00%)
    Branch-and-bound nodes:                         2
    WARNING: Nonlinear solver does not provide dual solutions
    objective: 0.0
    param1 = 10.0
    param2 = 20.0
    param3 = 37.13508893593264
    param4 = 40.0
    

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      • 1970-01-01
      • 2022-05-29
      • 2013-04-26
      相关资源
      最近更新 更多