我希望通过使用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
答案 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}}参数来完成......但这两个案例很明显不是以同样的方式管理。