scipy.optimize.fmin(Simplex)如何处理与不同大小相关的参数?

时间:2017-02-20 23:02:47

标签: python scipy simplex

我希望通过使用Simplex算法的python实现(scipy.optimize.fmin)最小化卡方损失函数,将4参数(a,g,N和k)模型拟合到数据。 初步模拟表明每个参数的以下范围:a = [5,50],g = [0.05,1.5],N = [5,200],k = [0,0.05]。

看起来scipy.optimize.fmin函数将参数视为全部在相同范围内(大概是[0,1])。我应该重新调整它们吗?以下是我的代码:

#determine starting point (x0) for each parameter
a = np.random.uniform(5,50)
g = np.random.uniform(0.05, 1.5)
N = np.random.uniform(5, 200)
k = np.random.uniform(0, 0.05)
x0 = np.array ([a, g, N, k]) #initial guess for SIMPLEX

xopt = fmin (chis, x0, maxiter=1000)#call Simplex 

1 个答案:

答案 0 :(得分:1)

想象一下,您希望最小化以下双变量函数

def to_min1((x,y)):
    return abs(1e-15 - x) + abs(1e15 - y)

即使这个例子不现实,也突出了要点。当然,fmin 可能不会移入x(如果x0=0),因为它已经非常接近于零。

为了在优化程序中获得具有相同权重的目标,可以根据变化而不是差异(使用分子的参数来避免ZeroDivisionError)来表示它们:

def to_min2((x,y)):
    return abs(-1+x/1e-15) + abs(-1+y/1e15)

请注意,这是一个ftol问题,因为通过这样做,人们希望迭代重新计算对所有参数具有相同的权重。

以下内容并未完全回答您的问题,而是针对以下问题: scipy.optimize.fmin(Simplex)是否处理​​与不同幅度相关的参数?

显然不是,因为

>>> fmin(to_min1, (0,0))
Optimization terminated successfully.
         Current function value: 1000000000000000.000000
         Iterations: 3
         Function evaluations: 11
array([ 0.,  0.])

>>> fmin(to_min2, (0,0))
Optimization terminated successfully.
         Current function value: 1.000000
         Iterations: 118
         Function evaluations: 213
array([  1.00000000e-15,   8.98437500e-05])

肯定Optimization没有terminate successfully.,而且可以通过增加fmin的{​​{1}}参数来完成......但这两个案例很明显不是以同样的方式管理。