Har*_*ews 5 python optimization numpy scipy
我已经看过这个问题或其他地方的问题,例如
使用优化模块的Scipy错误.将数组转换为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数组"
在下面的代码中,我使用leastsq方法将线性函数拟合到随机相关数据.从.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))
Run Code Online (Sandbox Code Playgroud)
当Objective 函数的返回值不是标量时,我会得到同样的错误。导致此错误的一个最小示例是
from scipy.optimize import fmin_slsqp
def fn(x):
return [0.,1.]
x = [0, 1., 2.]
minsoln = fmin_slsqp(fn, x)
Run Code Online (Sandbox Code Playgroud)
虽然以下不会引发错误,
from scipy.optimize import fmin_slsqp
def fn(x):
return 0.
x = [0, 1., 2.]
minsoln = fmin_slsqp(fn, x)
Run Code Online (Sandbox Code Playgroud)
我认为这要么是一个错误,要么应该有更清晰的错误消息。我提出了一个问题。
更新:
现在b-carter已经解决了这个问题,并给出了明确的错误消息,
"Objective function must return a scalar"
Run Code Online (Sandbox Code Playgroud)
更新文档后,请参阅此线程进行讨论。
| 归档时间: |
|
| 查看次数: |
2539 次 |
| 最近记录: |