所以我的问题是,我想运行scipy.minimize,该函数接受3个参数的列表,但将列表中的一个参数保持不变,并在有该约束的情况下找到函数的最小化。可以理解,这可以使用scipy.minimize中的args或constraint选项来完成,但是例如,如果我想保持列表中的第一个参数不变,我不知道应该如何使用它。 这是一些代码:
def package(self):
if self.choose<=2:
boun=[(0.001,4),(0.001,4),(0.001,0.999)]
self.minimised_f=scipy.optimize.differential_evolution(self.nll,boun,polish=True)
print(self.minimised_f)
self.min_param=self.minimised_f.x
print(self.minimised_f.fun)
print(self.min_param)
def nll(self,parameters):
self.mean_life_1=parameters[0]
self.mean_life_2=parameters[1]
self.F=parameters[2]
nll=0.0
for i in range(0,len(self.values)):
if self.choose==1 or self.choose==3 and self.fun_t(self.t_values[i])>0:
l=-math.log(self.fun_t(self.t_values[i]))
elif self.choose==2 or self.choose==4 and self.fun_t_the(self.t_values[i],self.theta_values[i])>0 :
l=-math.log(self.fun_t_the(self.t_values[i],self.theta_values[i]))
else:
l=0
nll+=l
return nll
def fun_t(self,t):
p1=1.0/self.mean_life_1*math.exp(-t/self.mean_life_1)
p2=1.0/self.mean_life_2*math.exp(-t/self.mean_life_2)
f=self.F*p1+(1-self.F)*p2
return f
def fun_t_the(self,t,theta):
p1=1.0/(3.0*math.pi*self.mean_life_1)*(1.0+(math.cos(theta))**2)*math.exp(-t/self.mean_life_1)
p2=1.0/(math.pi*self.mean_life_2)*(math.sin(theta))**2*math.exp(-t/self.mean_life_2)
f=self.F*p1+(1-self.F)*p2
return f
而且scipy.optimize.differential_evolution方法似乎不服从我为参数设置的边界条件。如果我删除了nll函数中要求函数大于零的条件,则在它试图计算一个负数的对数。我认为它不遵守界限的原因是因为fun_t变为负数的唯一方法是F是否在(0,1)范围之外。有人知道吗在参数范围内,其实现是否存在任何实际问题?