这是我第一篇关于堆栈溢出的帖子,所以请宽容!在
我正在尝试开发一个多项式(或条件)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中似乎不是问题。在
非常感谢你的帮助!在
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')
目前没有回答
相关问题 更多 >
编程相关推荐