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

Python SLSQP最小化方法依赖于初始geuss,python,optimization,scipy,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]

我尝试使用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])
 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])
例如,当我使用另一个时:

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

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])
 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])
如何定义好的初始GEU?
我用错方法了吗?

看起来你在尝试拟合高斯混合模型。与其使用scipy.optimize中的通用例程,不如看看scikit learns
sklearn.mixed
(请参阅),它正是为这个目的而编写的


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

我可能会错过一些东西,但您显示的输出看起来与我完全相同,那么实际的问题是什么?还有,你能修复你的缩进吗!?这与python没有多大关系(python在内部主要使用与matlab和co.相同的代码)。这只是可能的非凸优化的一个特征(起始值总是很重要,定义问题的人应该最清楚哪些是好的,哪些不是)。你希望在这里得到什么帮助?@celib对于x0=np.array((0.0,13,9.1,0.7,27,1.7,0.25,39,1.5))我获得:[0.75519843 13.00862389 9.09685564 0.11256798 27.252224,1.99542984 0.13223359 38.79412185 1.3473147]对于其他geuss=np.array((0.1,25,6.1,0.2,35,10,0.1,16.),我获得其他输出[ 0.36413429 24.96882197 6.09752554 0.10973026 34.99441345, 10.01669139 0.52613545 15.99888224 9.98633836];这些输出明显不同。@sascha,我知道这与使用的方法可能有一定关系。我正在寻找一种优化初始geu的方法。你可以看看我给@Celib的例子,最小化是不稳定的。我想知道是否有其他方法可以解决这类问题。geu是什么党卫军?