Choose minimum error result among multiple random initial value when using scipy minimize function

Tweet


Source code

import numpy as np
from scipy.optimize import minimize

def costfunction(coord):
    x=coord[0]
    y=coord[1]
    return (1+(x+y+1)**2*(19-14*x+3*x**2-14*y+6*x*y+3*y**2))*(30+(2*x-3*y)**2*(18-32*x+12*x**2+48*y-36*x*y+27*y**2))

def main():
    print('True value')
    print(np.array([0,-1]))
    print()
    print('Initial random value')
    for i in range(10):
        initpos=np.array([np.random.random()*10-5,np.random.random()*10-5])
        result=minimize(costfunction,initpos,method='nelder-mead')
        print(result.x)
    print()
    print('Initial bad value')
    for i in range(10):
        initpos=np.array([
            [0,0],
            [1.2,0.8],
            [1.8,0.2],
            [-0.6,-0.4],
            [100,0],
            [3,0.5],
            [-1,0],
            [-2,0],
            [2,2],
            [1.5,0]
            ][i])
        result=minimize(costfunction,initpos,method='nelder-mead')
        print(result.x)
    print()
    print('Initial good value')
    for i in range(10):
        initpos=np.array([
            [0,-1],
            [0,-3],
            [2,-3],
            [10,-1],
            [0,10],
            [-10,-1],
            [-100,-100],
            [-1,-1],
            [-1,1],
            [3,-1]
            ][i])
        result=minimize(costfunction,initpos,method='nelder-mead')
        print(result.x)
    print()
    print('Initial random simplex')
    for i in range(10):
        initsimp=np.array([
            [np.random.random()*10-5,np.random.random()*10-5],
            [np.random.random()*10-5,np.random.random()*10-5],
            [np.random.random()*10-5,np.random.random()*10-5]
        ])
        result=minimize(costfunction,initsimp[0],method='nelder-mead',options={'initial_simplex':initsimp})
        print(result.x)
    print()
    print('Initial bad simplex')
    for i in range(10):
        initsimp=np.array([
            [[0,0],[0,0],[0,0]],
            [[0,1],[-2,-3],[2,-3]],
            [[0,-10],[10,10],[-10,10]],
            [[1,0],[2,-1],[2,1]],
            [[-0.5,-0.5],[-0.5,0],[-1,-0.5]],
            [[-1,0],[-1,0.1],[-1.1,0]],
            [[2,0],[2.1,0],[2,0.1]],
            [[1.1,0.7],[1.3,0.7],[1.1,0.9]],
            [[2,1],[2.1,1],[2,1.1]],
            [[-1.5,-1],[3,0],[-1,1]]
            ][i])
        result=minimize(costfunction,initsimp[0],method='nelder-mead',options={'initial_simplex':initsimp})
        print(result.x)
    print()
    print('Initial good simplex')
    for i in range(10):
        initsimp=np.array([
            [[0,-3],[2,1],[-2,1]],
            [[0,2],[-2,-2],[2,-2]],
            [[0,-2],[1,-1],[-1,0]],
            [[-2,-3],[2,-3],[-2,1]],
            [[2,-3],[2,1],[-2,1]],
            [[-1,-3],[1,-3],[0,-2]],
            [[-1,-1],[0,0],[-2,1]],
            [[1,-5],[5,3],[-4,2]],
            [[0,0],[1,0],[0,1]],
            [[10,10],[20,10],[10,20]]
            ][i])
        result=minimize(costfunction,initsimp[0],method='nelder-mead',options={'initial_simplex':initsimp})
        print(result.x)
    print()

if __name__=='__main__':
    main()

Output

True value
[ 0 -1]

Initial random value
[ 4.4208803e-05 -1.0000242e+00]
[1.80001992 0.20000957]
[ 4.64397488e-06 -9.99983842e-01]
[1.80000509 0.20001775]
[-0.59996408 -0.40002324]
[1.79998473 0.19999151]
[-0.59997526 -0.40003424]
[-1.26969689e-05 -9.99993748e-01]
[ 3.80791326e-05 -1.00003347e+00]
[-0.6000143 -0.40001001]

Initial bad value
[-0.59995602 -0.40003256]
[1.2 0.8]
[1.8 0.2]
[-0.6 -0.4]
[-0.60002819 -0.39999439]
[1.79996718 0.19997927]
[-0.59998189 -0.4000147 ]
[-0.59999666 -0.40003518]
[1.79997382 0.19998251]
[1.80000507 0.19999908]

Initial good value
[ 0. -1.]
[-1.83077975e-05 -1.00003635e+00]
[ 3.55940767e-05 -1.00002308e+00]
[-1.70139999e-05 -9.99995686e-01]
[-9.35344209e-06 -9.99975632e-01]
[-3.79142987e-05 -1.00000945e+00]
[-2.59837213e-05 -9.99992902e-01]
[ 1.12349140e-05 -9.99979386e-01]
[-3.01017978e-05 -1.00003180e+00]
[-3.75404157e-05 -9.99993163e-01]

Initial random simplex
[-4.38479499e-05 -9.99983400e-01]
[1.79997141 0.19998146]
[ 4.19069289e-05 -1.00001455e+00]
[-2.88077159e-05 -9.99977820e-01]
[-2.34219108e-05 -1.00002053e+00]
[ 4.30660682e-05 -9.99980226e-01]
[-3.98675161e-05 -9.99964281e-01]
[-2.62344002e-05 -1.00001424e+00]
[1.80000625 0.20000024]
[ 4.31714472e-05 -9.99981483e-01]

Initial bad simplex
[0. 0.]
[1.79996596 0.19997736]
[1.80004063 0.20002534]
[1.80002576 0.20001782]
[-0.59997082 -0.40000806]
[-0.60003631 -0.39998534]
[1.80003106 0.20002062]
[1.19999556 0.80002538]
[1.2 0.8]
[1.80001738 0.20001495]

Initial good simplex
[ 0. -1.]
[-3.53506141e-05 -9.99994140e-01]
[ 4.12721041e-05 -9.99978257e-01]
[ 1.22305021e-05 -1.00002528e+00]
[ 1.22305021e-05 -1.00002528e+00]
[ 0. -1.]
[ 6.36490487e-06 -1.00001975e+00]
[ 2.37637790e-05 -1.00001478e+00]
[ 1.74665790e-05 -1.00002794e+00]
[-3.47071748e-05 -1.00003106e+00]


Back