[SciPy-User] Scipy differential_evolution initial guess x0 values?

Warren Weckesser warren.weckesser at gmail.com
Tue Feb 9 11:02:46 EST 2021


On 2/8/21, Haapa Mik <haapamik at yahoo.com> wrote:
> How to pass some good x0 values to differential_evolution so that it does
> not have to start from "beginning" which is something 1.0435e+16 and then
> slowly decreasing ...
>
> My simplified example. Scoring function func() returns the sum of (yestimate
> - y)^2 ... sum of error squares and DE is going to minimize it.
>
> def func(parameters, *data):
>     k1,k2,k3,v0 = parameters
>     c,j,afff = data
>     result = 0
>     for i in range(len(c)):
>         result += ( k1*c[i] + k2*j[i] + k3*(j[i]/c[i]) + v0 - (afff[i]) )**2
>     return result
>
> ...
>
> result = differential_evolution(func, bounds, args=(args),
> updating='immediate', workers=1, disp=True, tol=0)
>
> ...
>
> $ python3 test.py
>
> differential_evolution step 5: f(x)= 8.68165e+13
> differential_evolution step 6: f(x)= 3.0159e+13
> differential_evolution step 7: f(x)= 5.72267e+11
> differential_evolution step 8: f(x)= 5.72267e+11
> differential_evolution step 9: f(x)= 5.72267e+11
> differential_evolution step 10: f(x)= 5.72267e+11
> printing result.x
> [-9.96712308e-04  1.31194421e-03 -9.99999813e+01  1.63032881e+02]
> printing result.fun
> 229654.91015705158
>
> How to pass these x0 values [-9.96712308e-04  1.31194421e-03
> -9.99999813e+01  1.63032881e+02] to differential_evolution?
>


The `init` parameter allows you to specify the initial population that
is used by the algorithm.  The parameter is expected to be an array
containing at least five guesses.  If you have a pretty good guess for
the solution, you could create a cluster of candidates around that
guess.  Here's a simple example.  The objective function has a minimum
at [1, 1].

-----

In [104]: from scipy.optimize import differential_evolution

In [105]: def objective(x):
     ...:     x = np.array(x)
     ...:     return np.sum((x - 1)**2)
     ...:

In [106]: differential_evolution(objective, [[-25, 25], [-25, 25]], tol=1e-9)
Out[106]:
     fun: 1.5777218104420236e-30
 message: 'Optimization terminated successfully.'
    nfev: 2793
     nit: 92
 success: True
       x: array([1., 1.])

-----

Create a cluster of 15 points around [1, 1], and use them as the init parameter.

-----

In [130]: x0 = np.random.multivariate_normal([1, 1], 0.02*np.eye(2), size=15)

In [131]: x0
Out[131]:
array([[0.99181517, 1.24919039],
       [1.10938275, 0.97639551],
       [0.6991003 , 1.05940167],
       [1.18903841, 0.990736  ],
       [1.1369098 , 0.94895271],
       [0.64620631, 1.19959699],
       [0.86884416, 1.07479914],
       [0.93342624, 1.15701549],
       [0.93504748, 1.16624753],
       [0.92176135, 1.05270535],
       [1.07944635, 1.03205849],
       [0.94648726, 0.99061289],
       [1.14088686, 0.89811341],
       [1.23903334, 1.09125584],
       [1.12380905, 0.88606074]])

In [132]: differential_evolution(objective, [[-25, 25], [-25, 25]],
tol=1e-9, init=x0)
Out[132]:
     fun: 1.5777218104420236e-30
 message: 'Optimization terminated successfully.'
    nfev: 1173
     nit: 77
 success: True
       x: array([1., 1.])

-----


Warren


> Br, MH
> _______________________________________________
> SciPy-User mailing list
> SciPy-User at python.org
> https://mail.python.org/mailman/listinfo/scipy-user
>


More information about the SciPy-User mailing list