实现边际分布模型(MDM)的包
mdmp的Python项目详细描述
MDM PY
此包是Marginal Distribution Models(mdms)的Python
实现,可用于离散选择建模。
文档
文档由Read The Docs托管。
安装
此包已上载到PyPI。因此,
pip install mdmpy
应该有用。
如何使用
最简单的情况
梯度下降
在最简单的情况下,我们将使用作为默认值的多项式logit(mnl)模型。假设numpy
、scipy
和pandas
已安装,我们在假设随机实用新型的情况下生成选择数据:
fromstringimportascii_uppercaseaslettersimportpandasaspdimportscipy.statsasstatsimportnumpyasnpNUM_INDIV=57NUM_CHOICES=3NUM_ATTR=4np.random.seed(2019)X=np.random.random((NUM_ATTR,NUM_INDIV*NUM_CHOICES))true_beta=np.random.random(NUM_ATTR)V=np.dot(true_beta.T,X)V=np.reshape(V,(NUM_INDIV,NUM_CHOICES))eps=stats.gumbel_r.rvs(size=NUM_INDIV*NUM_CHOICES)eps=np.reshape(eps,(NUM_INDIV,NUM_CHOICES))U=V+epshighest_util=np.argmax(U,1)df=pd.DataFrame(X.T)df['choice']=[1ifidx==xelse0foridxinhighest_utilforxinrange(NUM_CHOICES)]df['individual']=[indivforindivinrange(NUM_INDIV)for_inrange(NUM_CHOICES)]df['altvar']=[altlvlfor_inrange(NUM_INDIV)foraltlvlinletters[:NUM_CHOICES]]
有了这个包,我们将假设df
是简单地提供给我们的数据帧。与其让代码本身找出有多少个个体、选项、系数或属性,不如简单地将它们输入到类中。为了对这个类执行梯度下降,我们将使用grad_desc
方法,使用上面的df
作为输入,
importmdmpy# In a typical case one would load df before this linemdm=mdmpy.MDM(df,4,3,[0,1,2,3])np.random.seed(4)init_beta=np.random.random(4)grad_beta=mdm.grad_desc(init_beta)print(grad_beta)# expected output [0.30238122 0.07955214 0.86779824 0.50951981]
解算器
MDM
类充当包装器并添加必要的pyomo
变量和集合来建模问题,但需要一个解算器。IPOPT建议使用内部点解算器。如果你有这样一个解算器,它可以被调用。假设正在使用ipopt:
importmdmpyipopt_exec_path=/path/to/ipopt# Replace with proper pathmdm=mdmpy.MDM(df,4,3,[0,1,2,3])mdm.model_init()mdm.model_solve("ipopt",ipopt_exec_path)print([mdm.m.beta[idx].valueforidxinmdm.m.beta])# expected output [0.30238834989235025, 0.07953888508425154, 0.8678050334295714, 0.5095096796373667]
待办事项
添加文档和更有意义的注释
- 添加更多类型提示,特别是那些涉及python内置的提示
添加测试。
将
pandas
放入setup.py
的extras_require
中,并移除依赖项。输入的
MDM
类将变成一个NumPy
数组,而不是一个数据帧。数据帧转换将变成一个实用函数, 可能对导入使用try except块