1

我想通过使用 Simplex 算法 (scipy.optimize.fmin) 的 python 实现最小化卡方损失函数来将 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 
4

1 回答 1

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])

当然Optimizationdid not terminate successfully.,并且可以通过增加fmin'maxiter论点等来完成......但这两种情况显然不是以同样的方式管理的。

于 2017-02-20T23:26:58.807 回答