实现边际分布模型(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关闭应用程序按钮Listener   Java中的多线程同步在Java示例中的思考   java如何查看Tomcat正在使用/访问的JAR?   java My代码在调用垃圾收集器后不会终止   多线程Java连接线程池和connectionfactory?   java在运行时修改JAR文件   java Android:使用光标时引发IllegaleException   在Netbeans中测试不可执行库的java?   泛型在参数上强制子类Java类型   spring Java:继承与依赖注入“自动连线”   javascript如何解析这个xml元素   java打印特定序列中的数组   带有ProcessingTimeSessionWindow的java Apache Flink自定义触发器   java如何配置消息驱动的Bean应用程序和Glassfish来使用来自远程MessageBroker的消息?