2017-02-20 66 views
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(Simplex)如何处理与不同大小相关的参数?

看起来像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 
+0

'chis'函数是否自制?如果是这样的话,我会通过使它们相对而不是绝对的来重新调整最小化的目标。我的意思是使用变化而不是差异。 – Kanak

+0

绝对的,chis功能是自制的。如有必要,我可以提供代码。你可以再详细一点吗? “你的意思是什么”与变异一起工作? – user1363251

+0

是什么让你想出这个问题?例如,当最小化时你有什么结果? – Kanak

回答

0

试想一下,你希望尽量减少以下双变量函数

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

即使这个例子是不现实的,它强调的重点。当然,fmin可能不在x(如果x0=0),因为它已经非常接近于零。

从而得到具有优化程序中相同的权重目标,一个让他们在变化的方面,而不是在差速器方面(与参数numerators避免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.,它可以通过增加fminmaxiter说法,等来完成...但这两种情况显然不是以同样的方式管理的。