2015-02-26 5 views
5

Ho visto questa domanda o una variante richiesta altrove, ad es.Errore scipy fmin_slsqp "non riuscito a convertire l'ottavo argomento` g 'di _slsqp.slsqp in C/array Fortran "

Scipy error using optimization module. Failure converting array to fortran

http://numpy-discussion.10968.n7.nabble.com/minimize-Algorithmen-Problem-with-boundarys-td37709.html

Ma in realtà non sono messi con un semplice codice di esempio hackable. Né ci sono risposte reali (probabilmente a causa della mancanza di una semplice demo del problema).

Il problema è, quando si cerca di montare una funzione utilizzando il metodo scipy.optimise fmin_slsqp si ottiene questo errore abbastanza opaco

"fallito nel convertire argomento 8` g' di _slsqp.slsqp a C/array Fortran"

Nel codice seguente ho adattato una funzione lineare a dati correlati casuali usando il metodo leastsq. Da .docs non vedo alcun motivo per cui la stessa sintassi non dovrebbe fare la stessa cosa usando fmin_slsqp, ma non è così.

Qualcuno sa perché?

import numpy as nm 
from scipy.optimize import leastsq, fmin_slsqp 
import matplotlib.pyplot as plt 

# residuals of linear function 
def res(params,x,y_real): 
    y_fit = params[0] +x*params[1] 
    res = y_fit-y_real 
    return res 


#generate correlated data 
xx = nm.array([-0.51, 51.2]) 
yy = nm.array([0.33, 51.6]) 
means = [xx.mean(), yy.mean()] 
stds = [xx.std()/3, yy.std()/3] 
corr = 0.8   # correlation 
covs = [[stds[0]**2   , stds[0]*stds[1]*corr], 
     [stds[0]*stds[1]*corr,   stds[1]**2]] 

m = nm.random.multivariate_normal(means, covs, 100) 
x = m[:,0] 
y = m[:,1] 

# Initial values of parameters 
initvals = [0,0] 

fit1,j = leastsq(res, initvals, args=(x,y)) 


#Plot fit 1 

y_fit = fit1[0] + fit1[1]*x 

plt.scatter(x,y) 
plt.plot(x,y_fit) 
plt.show() 

fit2 = fmin_slsqp(res, initvals, args=(x,y)) 
+1

probabilmente un bug? Ottengo anche il messaggio di errore. – Moritz

risposta

1

ottengo lo stesso errore quando il ritorno dalla funzione obiettivo non è uno scalare. Un esempio minimo che causa questo errore è

from scipy.optimize import fmin_slsqp 
def fn(x): 
    return [0.,1.] 
x = [0, 1., 2.] 
minsoln = fmin_slsqp(fn, x) 

mentre la successiva non solleva l'errore,

from scipy.optimize import fmin_slsqp 
def fn(x): 
    return 0. 
x = [0, 1., 2.] 
minsoln = fmin_slsqp(fn, x) 

Penso che questo sia sia un bug o dovrebbe avere un messaggio di errore più chiaro. Ho raccolto un issue.

UPDATE:

Questo ora è stato risolto con b-carter per dare un messaggio di errore chiaro,

"Objective function must return a scalar" 

con la documentazione aggiornata, vedere this filo per la discussione.

0

Hi Ho avuto lo stesso errore con il seguente:

def ptf_returns(weights,returns): 

    return pd.DataFrame(np.array(returns).T*(weights)).T.mean().mean() 

quando aggiungo il seguente funziona:

def ptf_returns(weights,returns): 

    return float(pd.DataFrame(np.array(returns).T*(weights)).T.mean().mean()) 

Il bug sembra essere orientato intorno alla type() della risposta.