2016-05-11 17 views
0

Heute möchte ich Sie nächste Frage stellen - Wie X-Array in optimierter Funktion (Scipy, Python) ändern?Wie ändert man X-Array in optimierter Funktion (Scipy, Python)?

Beispiel:

from scipy.optimize import minimize 

def function(x): 
    for i in range(len(x)): 
     if x[i]<0: 
      x[i]=0 
    F = 0.0 
    print list(x) 
    for i in x: 
     F += i**3 
return F 

n = 5 
x0=[] 
for i in range(n): 
    x0.append(-1.0) 
res = minimize(function, x0, method='Nelder-Mead') 

print res 

Aber Ergebnis-Array ([- 1, -1, -1, -1, -1.....]):

......................... 
......................... 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
[0.0, 0.0, 0.0, 0.0, 0.0] 
    status: 1 
    nfev: 1006 
success: False 
    fun: 0.0 
     x: array([-1., -1., -1., -1., -1.]) 
message: 'Maximum number of function evaluations has been exceeded.' 
    nit: 148 

Antwort

0

Don ändere das Array nicht! Berechnen Sie das Ergebnis stattdessen auf andere Weise. Zum Beispiel kann anstelle des Codes in der Post, schreiben:

def f(x): 
    return (x[x > 0] ** 3).sum() 

und dann:

>>> x0 = np.full((5,), -1) 
>>> print(minimize(f, x0, method='Nelder-Mead')) 
final_simplex: (array([[-1.  , -1.  , -1.  , -1.  , -1.  ], 
         [-1.000098, -1.  , -1.  , -1.  , -1.  ], 
         [-1.  , -1.000098, -1.  , -1.  , -1.  ], 
         [-1.  , -1.  , -1.000098, -1.  , -1.  ], 
         [-1.  , -1.  , -1.  , -1.000098, -1.  ], 
         [-1.  , -1.  , -1.  , -1.  , -1.000098]]), 
       array([ 0., 0., 0., 0., 0., 0.])) 
      fun: 0.0 
     message: 'Optimization terminated successfully.' 
      nfev: 69 
      nit: 10 
     status: 0 
     success: True 
      x: array([-1., -1., -1., -1., -1.]) 

Hier ist eine detaillierte Erklärung, wie meine Funktion f Werke:

  1. x > 0 berechnet ein boolesches Array mit der gleichen Form wie x, das True für jedes Element in x hat, das ist greate r als 0 und False ansonsten. Zum Beispiel:

    >>> x = np.array([-1, 0, 1, 2, 3]) 
    >>> x > 0 
    array([False, False, True, True, True], dtype=bool) 
    
  2. x[x > 0] verwendet Boolean indexing die Elemente x auszuwählen, die größer als Null ist:

    >>> x[x > 0] 
    array([1, 2, 3]) 
    
  3. x[x > 0] ** 3 ein Array von Würfeln von Elementen der x ist, die größer als Null ist:

    >>> x[x > 0] ** 3 
    array([ 1, 8, 27]) 
    
  4. Die sum Verfahren auf einem Array addiert alle Elemente:

    >>> (x[x > 0] ** 3).sum() 
    36