SLSQP最小化方法依赖于初始geuss

时间:2017-04-21 09:41:39

标签: python optimization scipy

我尝试使用scipy最小化具有多个变量的函数。优化。 最小化不是以正确的方式进行的,因为

  def f(p):
A=np.zeros(c)
for i in range(c):
    A [i]= (f_i[i] - (p[0] * scipy.stats.norm.pdf(j[i], p[1], p[2]) + p[3]* scipy.stats.norm.pdf(j[i], p[4], p[5]) + p[6]* scipy.stats.norm.pdf(j[i], p[7], p[8])))**2
return sum(A[0:c])
def my_cons(p):
g = np.zeros(10)
g[0] =p[0]-0
g[1] =p[1]-0
g[2] =p[2]-0
g[3] =p[3]-0
g[4] =p[4]-0
g[5] =p[5]-0
g[6] =p[6]-0
g[7] =p[7]-0
g[8] =p[8]-0
g[9] = p[0]+p[3]+p[6]-1.
return g
cons= ({'type': 'ineq', 'fun': lambda p: p[0]-0},
   {'type': 'ineq', 'fun': lambda p: p[1]-0},
   {'type': 'ineq', 'fun': lambda p: p[2]-0},
   {'type': 'ineq', 'fun': lambda p: p[3]-0},
   {'type': 'ineq', 'fun': lambda p: p[4]-0},
   {'type': 'ineq', 'fun': lambda p: p[5]-0},
   {'type': 'ineq', 'fun': lambda p: p[6]-0},
   {'type': 'ineq', 'fun': lambda p: p[7]-0},
   {'type': 'ineq', 'fun': lambda p: p[8]-0},
   {'type': 'eq', 'fun': lambda p: p[0]+p[3]+p[6]-1})
x0 = np.array((0.1, 25., 6.1, 0.2, 35., 10.,0.1, 16., 10.))
res = optimize.minimize(f, x0, method='SLSQP',jac=None, bounds=None, constraints=cons,tol=None,options={'disp': True ,'eps' : 1e-8, 'maxiter' : 1000})
print res

其中j和f_i取自csv文件。 当我使用上面提到的x0时,我获得了:

nfev: 23
nit: 2
njev: 2
status: 0
success: True

   x: array([  1.11173074e-19,   1.06811225e+01,   1.91022230e+00,
     1.00000000e+00,   3.11982112e+01,   7.50048570e+01,
     1.94288182e-20,   3.00000000e-01,   1.00000000e-01])

当我使用另一个时:

x0 = np.array([1.3, 10.7, 1.8, 21.9, 31.2,75,0.6,0.3,0.1])

我获得:

 message: 'Optimization terminated successfully.'

nfev: 23
nit: 2
njev: 2
status: 0
success: True

   x: array([  1.11173074e-19,   1.06811225e+01,   1.91022230e+00,
     1.00000000e+00,   3.11982112e+01,   7.50048570e+01,
     1.94288182e-20,   3.00000000e-01,   1.00000000e-01])

如何定义一个好的初始geuss? 我使用了错误的方法吗?

1 个答案:

答案 0 :(得分:0)

看起来你正试图拟合高斯混合模型。最好不要使用scipy.optimize中的通用例程来查看scikit-learn sklearn.mixture(参见http://scikit-learn.org/stable/modules/mixture.html),这是为了这个目的而编写的。

保持scipy.optimize的例程,有一种替代算法允许您可能想要尝试的约束,称为COBYLA。它只允许不等式约束,但您可以简单地重新定义您的问题以消除等式约束。这意味着你用1-p [0] -p [3]代替p [6]并加上不等式约束1-p [0] -p [3]> = 0.