Scipy fmin_slsqp错误"无法转换第8个参数`g' of _slsqp.slsqp到C / Fortran数组"

时间:2015-02-26 03:22:38

标签: python optimization numpy scipy

我已经看到过这个问题或其他地方的问题,例如

Scipy error using optimization module. Failure converting array to fortran

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

但他们并没有真正使用简单的可破解示例代码。也没有任何真正的答案(可能是因为缺乏一个简单的问题演示)。

问题是,当尝试使用scipy.optimise fmin_slsqp方法调整函数时,会出现这个非常不透明的错误

“将_slsqp.slsqp的第8个参数'g'转换为C / Fortran数组失败了”

在下面的代码中,我使用minimalsq方法将线性函数拟合到随机相关数据。从.docs我可以看出没有理由使用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))

2 个答案:

答案 0 :(得分: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主题进行讨论。

答案 1 :(得分:0)

您好我有以下相同的错误:

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()进行的。