2016-06-14 194 views
1

我正在用Python进行MLE实现。我的对数似然函数有5个参数需要估计,其中两个约束条件是它们必须在0和1之间。我能够使用statsmodels包中的GenericLikelihoodModel模块实现MLE,但我不知道如何用约束来做到这一点。 具体而言,我负对数似然函数是Python中的约束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之间。

回答

1

获得满足约束条件的内部解决方案的一种常见方法是转换参数,使优化不受约束。

例如:约束是在开区间(0,1)可以使用的Logit函数变换,例如用于这里:

https://github.com/statsmodels/statsmodels/blob/master/statsmodels/miscmodels/count.py#L243

我们可以使用概率的mulinomial分对数,(0,1)中的参数加起来为1。

在广义线性模型中,我们使用链接函数对预测均值施加类似限制,请参阅statsmodels/genmod/families/links.py。

如果约束可以绑定,那么这是行不通的。 Scipy限制了优化器,但这些优化器尚未连接到statsmodels LikelihoodModel类。相关除外:scipy拥有一个全局优化器basinhopping,如果存在多个局部最小值,那么它将工作得非常好,并且它连接到LikelihoodModels,并且可以使用fit中的方法参数进行选择。

0

恕我直言,这是一个数学问题,简单的答案是你应该改造你的问题。

为了解决这个问题,你应该创建一个特定的案例模型,它是从你的原始模型中派生出来的,这个模型具有固有的约束条件。然后,计算出的特殊情况模型MLE会给你你正在寻找的估计。

但是 - 对于具有约束AND NOT的一般情况模型的导出模型的估计将是膨胀的,因为在原始模型中两个参数不受约束。实际上,任何用于参数估计的方法(如MCMC,ANNs,基于牛顿的迭代方法)以及其他所有方法都会给出对导出和约束模型的估计。

0

事实上,这是一个数学问题,而不是编程问题。我设法通过用约束变换参数来解决这个问题, alpha和sigma转换成alpha_hat和sigma_hat,

alpha = 1/(1+np.exp(-alpha_hat)) 
    sigma = 1/(1+np.exp(-sigma_hat)) 

这样我们可以估计没有约束的alpha_hat和sigma_hat。