2017-05-04 1 views
2

Mit Python 3.6 versuche ich eine Funktion mit scipy.optimize.minimize zu minimieren. Mein Minimierungsproblem als zwei Einschränkungen, und ich kann eine Lösung finden. Bisher habe ich folgendes:Fehlermeldung beim Versuch, eine Funktion mit scipy mit jacobian zu minimieren

import numpy as np 
from scipy.optimize import minimize 

array = np.array([[3.0, 0.25, 0.75], 
        [0.1, 0.65, 2.50], 
        [0.80, 2.5, 1.20], 
        [0.0, 0.25, 0.15], 
        [1.2, 2.40, 3.60]]) 

matrix = np.array([[1.0, 1.5, -2.], 
        [0.5, 3.0, 2.5], 
        [1.0, 0.25, 0.75]]) 


def fct1(x): 
    return -sum(x.dot(array.T)) 


def fct2(x): 
    return x.dot(matrix).dot(x) 

x0 = np.ones(3)/3 
cons = ({'type': 'eq', 'fun': lambda x: x.sum() - 1.0}, 
     {'type': 'eq', 'fun': lambda x: fct2(x) - tgt}) 

tgt = 0.15 

w = minimize(fct1, x0, method='SLSQP', constraints=cons)['x'] 
res1 = fct1(w) 
res2 = fct2(w) 

ich jetzt versuche, mein Optimierer zu bekommen, schneller zu laufen, da dies nur ein vereinfachtes Problem. Am Ende sind meine Arrays und Matrizen viel größer. In einer früheren Frage kam jemand mit der Idee der Definition des jacobian meiner Funktion bis zu optimieren, so fügte ich folgend:

def fct1_deriv(x): 
    return -sum(np.ones_like(x).dot(array.T)) 

w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x'] 

Problem ist ich die folgende Fehlermeldung erhalten, wenn zu laufen versuchen:

0-th dimension must be fixed to 4 but got 2 
Traceback (most recent call last): 
    File "C:\Anaconda2\envs\py36\lib\site-packages\IPython\core\interactiveshell.py", line 2881, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-111-d1b854178c13>", line 1, in <module> 
    w = minimize(fct1, x0, method='SLSQP', jac=fct1_deriv, constraints=cons)['x'] 
    File "C:\Anaconda2\envs\py36\lib\site-packages\scipy\optimize\_minimize.py", line 458, in minimize 
    constraints, callback=callback, **options) 
    File "C:\Anaconda2\envs\py36\lib\site-packages\scipy\optimize\slsqp.py", line 410, in _minimize_slsqp 
    slsqp(m, meq, x, xl, xu, fx, c, g, a, acc, majiter, mode, w, jw) 
_slsqp.error: failed in converting 8th argument `g' of _slsqp.slsqp to C/Fortran array 

Irgendwelche Ideen, was das Problem sein könnte? Die Verbindung zu meiner vorherigen Antwort ist hier:

Antwort

0

Ich glaube, ich fand schließlich die Antwort, und wird hier posten, damit die Leute es mich verwenden können oder korrigieren:

In einem Optimierungsproblem der Form y = x^2 kann die Lösung durch Differenzierung y in Bezug auf x finden und Lösen durch Setzen der Ableitung gleich 0. Daher kann die Lösung mit 2x = 0.0 gefunden werden (Lösung für x=0.0). Daher habe ich das Gefühl, dass das Übergeben der Jacobi (erste Ableitung) einer Funktion zur Optimierung dem Optimierer hilft, eine Lösung zu finden.

In dem Problem, das ich versuche zu optimieren, ist meine Funktion der Form y = x. Diese Funktion kann nicht optimiert werden (abgesehen von Einschränkungen), indem y in Bezug auf x differenziert wird. Dies würde zu der folgenden Gleichung führen: 1.0 = 0.0. Daher verursacht wahrscheinlich das Jacobi meiner Funktion zu meinem Optimierer das Problem aufgrund des Obigen.

0

Ihre Funktion zu minimieren nimmt einen 3 Vektor als Eingabe, so sollte Ihre Jacobi entsprechend auch ein 3 Vektor sein, wobei jede Komponente die partielle Ableitung in Bezug auf die entsprechende Eingabe ist Komponente. SciPy beschwert sich darüber, dass er nicht weiß, was er mit dem einzelnen Wert anfangen soll, den du ihm gibst.

In Ihrem Fall, ich denke, das ist das, was Sie wollen:

def fct1_deriv(x): 
    return -np.sum(array, axis=1) 

Auch wenn die Geschwindigkeit ist ein Anliegen, Sie wahrscheinlich verwenden np.sum wollen, nicht sum, in fct1.

+0

Ich habe versucht, Ihre Lösung auszuführen, und es gibt mir immer noch die gleiche Fehlermeldung. Ich glaube jedoch nicht, dass mein Jacobi ein 3-Vektor sein sollte. Mein Jacobi ist die Ableitung meiner Optimierungsfunktion, die einen einzelnen Wert und keinen 3 Vektor ergibt. Meine Jacobi sollte daher auch einen einzigen Wert ergeben. Die Tatsache, dass ich einen Vektor verwende, dient nur dazu, meine Funktion ein wenig sauberer zu machen. –

+0

Ist es möglich, dass meine Funktion zur Optimierung eine lineare Funktion ist, wäre die Jacobi unbrauchbar, da sie nicht länger eine Funktion meines Arrays x ist? –

Verwandte Themen