权重优化参数



对于此功能:

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

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

范围内

我不是要求解决此问题的具体解决方案,而是要属于哪个领域?阅读https://docs.scipy.org/doc/scipy/reference/tutorial/optimize.html&Python中的参数优化表明,使用盒子解决方案(低维度(是可能的。遗传编程可以应用于此问题吗?

基本上,您想最大程度地减少估计和实际功能之间的误差。

编辑这里明显的选择是在4个参数上使用梯度下降。如果您不想这样做,并且更多地询问务实的解决方案,则在这里。

这里的主要问题是有4个参数。要解决这个问题,您可以做到这一点:

  1. 修复任何3个参数,将最后一个独立。我们将尝试找到此值。
  2. 找到逆函数,并明确求解或使用求解器(可能是牛顿 - 拉夫森或布伦特方法等数值方法(

我将描述一个展示这一想法的过程。我们将使用使用Brent方法的Scipy的Scalar_Minimizer。

为了讨论,让我们保持您的功能由2个参数组成,并假设您的功能是:

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

您基本上是在询问如何查找和P1,P2值,使得F(p1,p2(= 100。假设范围如下:

  • 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到100

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

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

创建新功能以通过在约束违规中添加惩罚来优化。

param1必须在范围10-20中

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

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

正方形,因此所有P1

都存在梯度

根据需要将其他罚款添加到新的优化功能

只是为了娱乐,朱莉娅(Julia(的一个小演示(正如某人所说:无具体解决方案可用(。

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

当模型变得更加复杂时,全球优化是不可行的(理论上很难;有时是不可能的(。您只需将求解器切换到IPOPT即可获得本地最佳。

使用PYOMO在Python中也可以做到这一点,但不太好。可以使用模型和求解器。只有代码更改。

代码

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:UsersSascha.juliav0.5AmplNLWriter.solverdatajl_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

相关内容

  • 没有找到相关文章

最新更新