Python scipy优化fmin语法

Python scipy优化fmin语法,python,optimization,scipy,Python,Optimization,Scipy,numseq和prob是长度各为50的列表。它们是收集的实验数据numseq对应于X轴值,prob对应于Y轴值 我想最小化的功能是: numseq = ['0012000', '0112000', '0212000', '0312000', '1012000', '1112000', '1212000', '1312000', '20

numseq
prob
是长度各为50的列表。它们是收集的实验数据
numseq
对应于X轴值,
prob
对应于Y轴值

我想最小化的功能是:

numseq = ['0012000', '0112000', '0212000', '0312000', '1012000', '1112000',                                                                                   '1212000', '1312000', '2012000', '2112000', '2212000', '2312000', '3012000', '3112000',          '3212000', '3312000', '0002000', '0022000', '0032000', '1002000', '1022000', '1032000',     '2002000', '2022000', '2032000', '3002000', '3022000', '3032000', '0010000', '0011000', '0013000', '1010000', '1011000', '1013000', '2010000', '2011000', '2013000', '3010000', '3011000', '3013000', '0012100', '0012200', '0012300', '1012100', '1012200', '1012300', '2012100', '2012200', '2012300', '3012100']
prob = [-0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.78361598908750163, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.66474525640568083, -0.66474525640568083, -0.66474525640568083, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212, -0.49518440694747212]
因此:

  • allparams
    是一个4×7的矩阵,其中包含所有要优化的参数
  • xdata
    是X轴值,即
    numseq
  • ydata
    只是一个数字列表,即
    prob
chi2
是实验值和模型值之间的平方差。这是必须尽量减少的

参数的初始猜测如下所示:

def residue(allparams, xdata, ydata):
    chi2 = 0.0
    for i in range(0,len(xdata)):
        x = xdata[i]
        y = 0
        for j in range(len(x)):
            y = y-allparams[int(x[j])][j]
            chi2 = chi2 + (ydata[i]-y)**2
return chi2
现在如何在此函数上调用
fmin
?我试过了

x0 = [[-0.6, -0.6, -0.6, -0.6, -0.6, -0.6, -0.6], [-0.6, -0.6, -0.6, -0.6, -0.6, -0.6, -0.6], [-0.6, -0.6, -0.6, -0.6, -0.6, -0.6, -0.6], [-0.6, -0.6, -0.6, -0.6, -0.6, -0.6, -0.6]]
但我不断地得到一个错误:

回溯(最近一次呼叫最后一次):
文件“”,第1行,在
fmin(剩余量,x0,args=(numseq,prob))
文件“C:\Python31\lib\site packages\scipy\optimize\optimize.py”,第258行,在fmin中
fsim[0]=func(x0)
文件“C:\Python31\lib\site packages\scipy\optimize\optimize.py”,第177行,在函数包装器中
返回函数(x,*args)
文件“”,第7行,剩余部分
y=y-allparams[int(x[j])][j]
索引器错误:标量变量的索引无效。
为什么会这样?是因为
fmin
不能接受二维数组作为初始猜测吗?那么,我是否必须更改我的整个代码才能处理1D参数数组

即使你不能解释这个问题,你能至少告诉我
fmin
模块是如何工作的吗?i、 e如何实现
fmin
以优化N维数组的语法?你能解释一下什么是
args()
?我不熟悉优化,我不知道如何实现它:(

fmin”例程可以接受2d数组作为初始猜测。但它做的第一件事是展平这个数组[(4,7)-->(28)]。所以发生的是,你的留数函数将(4,7)数组作为输入,“fmin”例程给它一个展平的“x0”长度为28。这就是您看到错误的原因:
y=y-allparams[int(x[j])][j]
索引器:标量变量的索引无效。


因此,您似乎必须更改留数函数以接受向量而不是数组。然而,这似乎并不太糟糕。我尝试了以下似乎有效的方法(注意:请仔细检查!)

def残留物\u备选方案(所有参数、形状、扩展数据、ydata):
m、 n=不规则形状
chi2=0.0
对于范围(0,len(扩展数据))中的i:
x=扩展数据[i]
y=0
对于范围内的j(len(x)):
idx=int(x[j])*n+j#再次检查此项以
y=y-allparams[idx]#确保它符合您的要求
chi2=chi2+(ydata[i]-y)**2
回击chi2
我用:

x0=-0.6*np.one((4,7),dtype=np.double)
[xopt、fopt、iter、funcalls、warnflag]=\
fmin(剩余量_备选方案,x0,args=(x0.shape,numseq,prob),
maxiter=100000,
maxfun=100000,
全输出=真,
disp=真)
并收到以下结果:

fmin(residue, x0, args=(numseq, prob))

您可以将其重塑为4x7阵列。请尝试一下,并让我知道它是否有效。

第一次发布的
residence
功能似乎不完整。
Optimization terminated successfully.
         Current function value: 7.750523
         Iterations: 21570
         Function evaluations: 26076

>>>xopt
array([ 0.57669042, -0.21965861,  0.2635061 , -0.08284016, -0.0779489 ,
   -0.10358114,  0.14041582,  0.72469391, -0.43190214,  0.31269757,
   -0.0338726 , -0.14919739, -2.58314651,  2.74251214,  0.57695759,
   -0.49574628,  0.1490926 ,  0.04912353,  0.02420988,  1.17924051,
   -7.2147027 ,  0.57860843, -0.28386938,  0.2431877 , -0.22674694,
   -0.58308225, -6.05706775, -2.06350063])