如何防止最小化(通过 SCIPY)输出我输入的"optimized"参数作为猜测?



我正在尝试使用scipy模块中的最小化函数。完整的代码太长而无法发布,但主要思想是有多个定义的分布应该适合数据集。每个箱的观测值很容易从数据集中计算出来,而每个箱的期望值则由一个函数计算,该函数使用一个参数来指定应在箱边界上积分的分布(其中条柱边界与直方图条柱相同)。有三个函数 chisqI,其中 I = 1,2,3(每个分布一个),每个函数输入每个箱指定的观测值和每个箱的期望以输出卡方。然后有三个函数,每个函数输入一个chisqI和args,输出最小化的函数结果和优化的参数。在这里,参数是参数 mu 和 sigma,将对其进行优化以产生最小的卡方。我能够通过一个发行版的函数链传递参数,并且想知道我是否需要通过另一个参数来指定从链上的一个函数处理哪个发行版。

最小化函数可以使用不同的方法,如Nelder-Mead或CG。我一直在尝试比较不同方法的结果,以找到提供最佳拟合的方法(其中最佳拟合定义为与实际数据集相比产生最小卡方或最大 p 值的拟合)。有趣的是,Nelder-Mead 和 Powell 方法相对于其他方法产生最低的卡方,但使用其他方法,与实际数据直方图的图拟合看起来更好。对于下面的代码输出,函数值是与卡方值关联的 p 值的负数;这是最小化的结果。CHISQ_RED是使用CHISQ_TOT和自由度的约化卡方值,而x: array中的第一个和第二个元素分别是分布的优化参数 mu 和 sigma。

运行 Nelder-Mead 最小化方法将生成以下输出。

final_simplex: (array([[ 6.00002802,  0.60020636],
[ 5.99995429,  0.60018798],
[ 6.0000716 ,  0.60011127]]), array([ -5.16845821e-21,  -5.16838926e-21,  -5.16815050e-21]))
fun: -5.1684582072826815e-21
message: 'Optimization terminated successfully.'
nfev: 47
nit: 24
status: 0
success: True
x: array([ 6.00002802,  0.60020636])
CHISQ_TOT =  259.042420419 CHISQ_RED =  3.36418727816 

运行 CG 最小化方法将生成以下输出。

fun: -4.0964504680695594e-97
jac: array([  8.72867710e-94,  -3.96555507e-93])
message: 'Optimization terminated successfully.'
nfev: 4
nit: 0
njev: 1
status: 0
success: True
x: array([ 6.01921293,  0.54436257])
CHISQ_TOT =  683.781671477 CHISQ_RED =  8.88028144776 

然而,具有较高卡方值的拟合看起来更好拟合(直方图中的数据集相同)。

问题是每种最小化方法都会输出我的猜测参数(mu 和 sigma)作为优化参数。Nelder-Mead方法(较小的卡方,看起来更差的拟合)有47个函数评估和24次迭代,而CG方法(更大的卡方,更好的拟合)有4个函数评估和0次迭代。我试图通过在最小化函数中添加额外的参数来改变这一点(其中chisq3是最小化的 mu 和 sigma 的预定义函数,parameterguess[mu_guess, sigma_guess]的。

minimize( chisq3 , parameterguess , method = 'CG', options={'gtol':1e-50, 'maxiter': 100})

如果我通过向每个 mu 和 sigma 加 2 来更改我的猜测值,那么拟合会变得更糟(因为优化参数的猜测值相当不错)。我不确定它是否相关,但图中显示的数据是通过取数据集中每个值的对数来从对数正态分布改编而来创建的"伪"高斯形状/分布(在对数 x 轴上)。

我猜通过 scipy 的最小化函数应该进行多次迭代才能真正成功。所以我认为添加更多的迭代应该降低最小化函数对我最初猜测参数的敏感性。

最重要的是,这是通过 scipy 使用最小化函数的常见错误吗?如果是这样,有哪些常见的解决方法?另外,为什么 minimum 函数会执行多次迭代和函数计算,只是为了产生与输入相同的结果?

问题是卡方是计算等于期望值和观测值的每箱差的平方之和,全部除以期望值。结果是小数除以大数,平方,然后连续求和数千次,导致零除法问题和舍入误差。通过最小化更简单的函数,例如没有分母项的卡方,错误的源头消失了,可以根据获得的参数拟合计算出卡方。

最新更新