Python mod的条件溢出问题

2024-06-25 23:49:33 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一篇关于堆栈溢出的帖子,所以请宽容!在

我正在尝试开发一个多项式(或条件)logit模型的代码(如http://data.princeton.edu/wws509/notes/c6s3.html中所述) 这种模型可以看作是经典二元logistic回归的一个推广。多项式logit模型常用于离散选择建模。在

在下面的代码中,我描述了一个模型,它解释了当所有参与者(N)面对相同的选择问题(T)时,在两个选项(J)之间的选择。我已经为R开发了一段类似的代码,它运行得非常好,但是速度很慢(因为“optim”例程)。由于溢出问题,用PYTHON开发这种类型的代码似乎更加困难。第一次手术(即。,纽普西.dot(X,beta))会导致非常大/很小的值,然后这些值与数字经验(). 如https://lingpipe-blog.com/2012/02/16/howprevent-overflow-underflow-logistic-regression/所示,溢出问题往往发生在:abs(美国运输部(X,β)大于500。初始溢出问题具有重要的后果,因为它们将导致其余代码中的0、NaN和Inf值,从而产生其他问题(例如。,np.日志(0)或number/Inf)。我花了很多时间试图用decimal模块、bigfoat模块等来修复这个问题,但似乎没有起作用(Deal with overflow in exp using numpy)。在

第二个最佳选择似乎是修改似然函数,包括一些舍入运算(例如num[num>;400]=400),然后使用“Nelder-Mead”算法最小化对数似然。理想情况下,我会使用“BFGS”算法,但它与舍入操作不兼容。在

关于如何修复代码中的溢出问题有什么想法吗?在

备注:非常大美国运输部(X,beta)值在R,MATLAB和STATA中似乎不是问题。在

非常感谢你的帮助!在

PYTHON代码

N = len(set(data[:,0]))
T = 20
J = 2
Y = np.reshape(data[:,12],(N*T,J))
X = np.matrix(data[:,[33,10,5,6,7,8,9]])

def fn_mnl(beta):
    num = np.dot(X,beta)
    num[num >  400] =  400 # to avoid overflow  with np.exp()
    num[num < -400] = -400 # to avoid underflow with np.exp()
    num = np.exp(num)
    num = num.reshape(N*T,J)
    den = np.sum(num, axis=1)
    prbj = num/den
    prbi = prbj[Y==1]
    prbi[prbi <= 0] = 0.0000001 # to avoid issue with np.log()
    llik = np.sum(np.log(prbi))
    return(-llik)

sv = [0]*X.shape[1]
res = sc.minimize(fn_mnl, sv, method='Nelder-Mead')

R代码

^{pr2}$

Tags: to代码模型datawithnpnumdot