Как передать ограничение постоянного параметра на scipy.minimize и вопрос о реализации границ - PullRequest
0 голосов
/ 26 ноября 2018

Так что моя проблема в том, что я хочу запустить scipy.minimize для функции, которая принимает список из 3 аргументов, но сохраняет один из параметров в списке постоянным и находит минимизацию моей функции с этим ограничением.Понимаю, это можно сделать с помощью параметра args или constraint в scipy.minimize, но я не понимаю, как я должен его использовать, если, например, я хочу сохранить первый параметр в списке постоянным.Вот фрагмент кода:

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). Кто-нибудь знает, есть ли какие-либо реальные проблемы с его реализацией за пределами параметров?

...