2015-02-26 9 views
5

Widziałem to pytanie lub wariant zapytany gdzie indziej, np.Błąd Scipy fmin_slsqp "nie udało się przekonwertować ósmego argumentu` g 'z _slsqp.slsqp na tablicę C/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

Ale nie są one naprawdę umieścić w prosty hackable przykład kodu. Nie ma też prawdziwych odpowiedzi (prawdopodobnie z powodu braku prostej wersji demo problemu).

Problem jest, kiedy próbuje dopasować funkcję stosując metodę scipy.optimise fmin_slsqp masz ten dość mętną błąd

„nie powiodło się w przekształcaniu 8th argumentem` g”o _slsqp.slsqp do C/Fortran tablicy”

W poniższym kodzie dopasowuję funkcję liniową do losowo skorelowanych danych przy użyciu metody minimumsq. Z pliku .docs nie widzę powodu, dla którego ta sama składnia nie powinna robić tego samego przy użyciu fmin_slsqp, ale tak się nie dzieje.

Czy ktoś wie dlaczego?

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

Prawdopodobnie błąd? Otrzymuję komunikat o błędzie. – Moritz

Odpowiedz

1

uzyskać ten sam błąd podczas powrotu z funkcji Celu nie jest skalarne. Minimalny przykład co powoduje ten błąd jest

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

natomiast po nie podnieść błąd,

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

myślę, że to jest albo błąd lub powinien mieć jaśniejszy komunikat o błędzie. Podniosłem issue.

UPDATE:

ten został już rozwiązany przez b-carter aby dać jasny komunikat o błędzie,

"Objective function must return a scalar" 

z dokumentacją zaktualizowanej patrz this wątek dyskusji.

0

Cześć Miałem ten sam błąd z następujących czynności:

def ptf_returns(weights,returns): 

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

Gdy dodam następujące działania:

def ptf_returns(weights,returns): 

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

Błąd wydaje się być zorientowane wokół type() odpowiedzi.

Powiązane problemy