私はPythonでMLEの実装を行っています。私の対数尤度関数には、推定する 5 つのパラメーターがあり、そのうちの 2 つには、0 から 1 の間でなければならないという制約があります。statsmodels パッケージの GenericLikelihoodModel モジュールを使用して MLE を実装できますが、方法がわかりません。制約でこれを行います。具体的には、私の負の対数尤度関数は
def ekop_ll(bs,alpha,mu,sigma,epsilon_b,epsilon_s):
ll=[]
for bsi in bs:
b=bsi[0]
s=bsi[1]
part1 = (1-alpha)*stats.poisson.pmf(b,epsilon_b)*stats.poisson.pmf(s,epsilon_s)
part2 = alpha*sigma*stats.poisson.pmf(b,epsilon_b)*stats.poisson.pmf(s,mu+epsilon_s)
part3 = alpha*(1-sigma)*stats.poisson.pmf(b,mu+epsilon_b)*stats.poisson.pmf(s,epsilon_s)
li = part1+part2+part3
if part1+part2+part3 == 0:
li = 10**(-100)
lli = np.log(li)
ll.append(lli)
llsum = -sum(ll)
return llsum
MLE 最適化クラスは
class ekop(GenericLikelihoodModel):
def __init__(self,endog,exog=None,**kwds):
if exog is None:
exog = np.zeros_like(endog)
super(ekop,self).__init__(endog,exog,**kwds)
def nloglikeobs(self,params):
alpha = params[0]
mu = params[1]
sigma = params[2]
epsilon_b = params[3]
epsilon_s = params[4]
ll = ekop_ll(self.endog,alpha=alpha,mu=mu,sigma=sigma,epsilon_b=epsilon_b,epsilon_s=epsilon_s)
return ll
def fit(self, start_params=None, maxiter=10000, maxfun=5000, **kwds):
if start_params == None:
# Reasonable starting values
alpha_default = 0.5
mu_default = np.mean(self.endog)
sigma_default = 0.5
epsilon_b_default = np.mean(self.endog)
epsilon_s_default = np.mean(self.endog)
start_params =[alpha_default,mu_default,sigma_default,epsilon_b_default,epsilon_s_default]
return super(ekop, self).fit(start_params=start_params,
maxiter=maxiter, maxfun=maxfun,
**kwds)
そしてメインは
if __name__ == '__main__':
bs = #my data#
mod = ekop(bs)
res = mod.fit()
コードを変更して制約を組み込む方法がわかりません。alpha と sigma は 0 から 1 の間である必要があります。