实现边际分布模型(MDM)的包

mdmp的Python项目详细描述


MDM PY

Documentation StatusCodacy BadgePyPI versionProject Status: WIP – Initial development is in progress, but there has not yet been a stable, usable release suitable for the public.

此包是Marginal Distribution Models(mdms)的Python实现,可用于离散选择建模。

文档

文档由Read The Docs托管。

安装

此包已上载到PyPI。因此,

pip install mdmpy

应该有用。

如何使用

最简单的情况

梯度下降

在最简单的情况下,我们将使用作为默认值的多项式logit(mnl)模型。假设numpyscipypandas已安装,我们在假设随机实用新型的情况下生成选择数据:

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]

待办事项

  1. 添加文档和更有意义的注释

    • 添加更多类型提示,特别是那些涉及python内置的提示
  2. 添加测试。

  3. pandas放入setup.pyextras_require中,并移除依赖项。

    • 输入的MDM类将变成一个NumPy数组,而不是一个数据帧。

    • 数据帧转换将变成一个实用函数, 可能对导入使用try except块

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何计算以下代码片段的复杂性?   java他们怎样才能使“瓶子”和“瓶子”这样的词被认为是同一个词呢?这就是我目前所拥有的   用于在不同编码之间转换字符的Java库   Java为什么我输入的每个输入都会忽略我的While循环?   (Java)通过socket发送和映像时出错:Java。木卫一。StreamCorruptedException:无效类型代码:3B   java错误:在camel XML文件中,解组对象是不受支持的类型   springboot+kafka应用程序中的java错误管理   java如何从地图中的值中获取一组值?   二维向量Java   java如果我从未使用ThreadSafeClientConnManager调用closeExpiredConnections,会发生什么   if语句如何在if-else循环中对同一数据使用多个条件?java/安卓   java我如何在安卓中放慢速度?   javaee:需要更好的部署系统   如何使用java将XML文件加载到Oracle18c上的XMLType列   用于连接两个表的java Hibernate查询   在更新数据库之前,java JSP需要使用用户给定的值检查数据库中的值   java无法使用Jersey从rest服务获取数据字段