我正在用Python实现MLE。我的日志似然函数有5个参数要估计,其中两个参数必须在0到1之间。我可以使用状态模型包中的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() 我不知道如何修改我的代码以合并约束。我希望阿尔法和西格玛在0到1之间。
发布于 2016-06-14 13:01:18
获得满足约束条件的内部解的一种常见方法是对参数进行变换,使优化不受约束。
例如:打开区间(0,1)中的约束可以使用Logit函数进行转换,例如:
https://github.com/statsmodels/statsmodels/blob/master/statsmodels/miscmodels/count.py#L243
我们可以使用多项逻辑来表示概率,参数在(0,1)中并加为1。
在广义线性模型中,我们使用链接函数对预测均值施加类似的限制,参见statsmodel/genmod/族/ link s.py。
如果约束可以绑定,那么这是行不通的。Scipy已经限制了优化器,但是这些优化器还没有连接到statsmodels类。
相关的旁白: fit有一个全局优化器basinhopping,如果存在多个局部极小值,它会很好地工作,并且它连接到LikelihoodModels,并且可以使用fit中的方法参数进行选择。
发布于 2016-06-14 10:31:01
这是一个数学问题,简单的答案是你应该重新构造你的问题。
为了具体解决这个问题,您应该创建一个从原始模型派生出来的特例模型,其中固有地定义了约束。然后,计算出的特殊情况模型的MLE会给你你想要的估计。
但是,对于有约束的导出模型,估计值会增大,而对于一般情况下的模型,则不会像原来的模型那样,两个参数不受约束。
实际上,任何用于参数估计的方法,比如MCMC,ANNs,牛顿迭代法,以及其他的方法,都会给出一个关于导出和约束模型的估计。
发布于 2016-06-16 02:18:47
事实上,这是一道数学题,而不是编程题。我通过将带有约束的参数(即alpha和sigma )转换为alpha_hat和sigma_hat来解决这个问题,
alpha = 1/(1+np.exp(-alpha_hat))
sigma = 1/(1+np.exp(-sigma_hat))这样我们就可以在没有约束的情况下估计alpha_hat和sigma_hat。
https://stackoverflow.com/questions/37808793
复制相似问题