我尝试使用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? 我使用了错误的方法吗?
答案 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.