2015-02-26 6 views
5

मैंने यह प्रश्न या एक अन्य प्रकार से पूछा है या नहीं।Scipy fmin_slsqp त्रुटि "_slsqp.slsqp के 8 वें तर्क 'g' को परिवर्तित करने में विफल रहा है सी/फोरट्रान सरणी"

Scipy error using optimization module. Failure converting array to fortran

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

लेकिन वे वास्तव में एक सरल hackable उदाहरण कोड के साथ नहीं डाल रहे हैं। न ही कोई वास्तविक जवाब हैं (शायद समस्या के एक साधारण डेमो की कमी के कारण)।

समस्या है, जब scipy.optimise fmin_slsqp विधि का उपयोग कर एक समारोह फिट करने की कोशिश आप इस सुंदर अपारदर्शी त्रुटि

मिल

"सी/फोरट्रान सरणी के लिए 8 वीं तर्क` _slsqp.slsqp की जी 'परिवर्तित करने में विफल "

नीचे दिए गए कोड में मैं leastsq विधि का उपयोग कर यादृच्छिक सहसंबंधित डेटा के लिए एक रैखिक फ़ंक्शन फिट करता हूं। । डॉक्स से मैं कोई कारण नहीं देख सकता कि उसी वाक्यविन्यास को fmin_slsqp का उपयोग करके वही काम नहीं करना चाहिए, लेकिन ऐसा नहीं है।

क्या कोई जानता है क्यों?

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

शायद एक बग? मुझे त्रुटि संदेश भी मिलता है। – Moritz

उत्तर

1

मैं एक ही त्रुटि मिलती है जब उद्देश्य समारोह से वापसी एक अदिश नहीं है। एक न्यूनतम उदाहरण जो इस त्रुटि का कारण बनता है, जबकि निम्न त्रुटि उठाना नहीं है

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

है

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

मुझे लगता है कि यह या तो एक बग है या एक स्पष्ट त्रुटि संदेश होना चाहिए। मैंने issue बढ़ाया है।

अद्यतन:

अब यह b-carter द्वारा हल किया गया है एक स्पष्ट त्रुटि संदेश देने के लिए,

"Objective function must return a scalar" 
प्रलेखन अद्यतन के साथ

, विचार विमर्श के लिए this धागा देखते हैं।

def ptf_returns(weights,returns): 

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

जब मैं निम्नलिखित जोड़ें यह काम करता है:

def ptf_returns(weights,returns): 

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

बग प्रतिक्रिया की type() चारों ओर उन्मुख किया जा रहा है

0

हाय मैं निम्नलिखित के साथ एक ही त्रुटि थी।

संबंधित मुद्दे