Python中的随机优化 [英] Stochastic Optimization in Python

查看:167
本文介绍了Python中的随机优化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试将 cvxopt (优化求解器)和

I am trying to combine cvxopt (an optimization solver) and PyMC (a sampler) to solve convex stochastic optimization problems.

作为参考,使用pip安装两个软件包都很简单:

For reference, installing both packages with pip is straightforward:

pip install cvxopt
pip install pymc 

两个程序包都可以很好地独立运行.这是一个如何使用cvxopt解决LP问题的示例:

Both packages work independently perfectly well. Here is an example of how to solve an LP problem with cvxopt:

# Testing that cvxopt works
from cvxopt import matrix, solvers

# Example from http://cvxopt.org/userguide/coneprog.html#linear-programming

c = matrix([-4., -5.])
G = matrix([[2., 1., -1., 0.], [1., 2., 0., -1.]])
h = matrix([3., 3., 0., 0.])
sol = solvers.lp(c, G, h)
# The solution sol['x'] is correct: (1,1)

但是,当我尝试将其与PyMC配合使用时(例如,通过将分布分配到一个系数上),PyMC会出现错误:

However, when I try using it with PyMC (e.g. by putting a distribution on one of the coefficients), PyMC gives an error:

import pymc as pm
import cvxopt

c1 = pm.Normal('c1', mu=-4, tau=.5**-2)

@pm.deterministic
def my_lp_solver(c1=c1):
    c = matrix([c1, -5.])
    G = matrix([[2., 1., -1., 0.], [1., 2., 0., -1.]])
    h = matrix([3., 3., 0., 0.])
    sol = solvers.lp(c, G, h)
    solution = np.array(sol['x'],dtype=float).flatten()
    return solution

m = pm.MCMC(dict(c1=c1, x=x))
m.sample(20000, 10000, 10)

我收到以下PyMC错误:

I get the following PyMC error:

<ipython-input-21-5ce2909be733> in x(c1)
     14 @pm.deterministic
     15 def x(c1=c1):
---> 16     c = matrix([c1, -5.])
     17     G = matrix([[2., 1., -1., 0.], [1., 2., 0., -1.]])
     18     h = matrix([3., 3., 0., 0.])

TypeError: invalid type in list

为什么?有什么方法可以使cvxoptPyMC完美搭配?

Why? Is there any way to make cvxoptplay nicely with PyMC?

万一有人想知道,PyMC允许您从您选择的任何功能中进行采样.在这种特殊情况下,我们从中采样的函数是将LP问题映射到解决方案的函数.我们正在从此函数中进行采样,因为我们的LP问题包含随机系数,因此不能仅采用现成的LP解算器.

In case anyone wonders, PyMC allows you to sample from any function of your choice. In this particular case, the function from which we sample is one that maps an LP problem to a solution. We are sampling from this function because our LP problem contains stochastic coefficients, so one cannot just apply an LP solver off-the-shelf.

在这种情况下,更具体地说,单个PyMC输出样本仅是LP问题的解决方案.随着LP问题的参数变化(根据您选择的分布),PyMC的输出样本将有所不同,希望是后验分布.

More specifically in this case, a single PyMC output sample is simply a solution to the LP problem. As parameters of the LP problem vary (according to distributions of your choice), the output samples from PyMC would be different, and the hope is to get a posterior distribution.

上述解决方案的灵感来自此答案,唯一的不同是我希望使用一个真实的一般求解器(在这种情况下为 cvxopt )

The solution above is inspired by this answer, the only difference is that I am hoping to use a true general solver (in this case cvxopt)

推荐答案

pm.Normal生成的c1的类型是numpy array,您只需要将其剥离并转换为float(c1),然后效果很好:

The type of c1 generated with pm.Normal is numpy array, you just need to strip it out and convert it to float(c1), then it works finely:

>>> @pm.deterministic
... def my_lp_solver(c1=c1):
...     c = matrix([float(c1), -5.])
...     G = matrix([[2., 1., -1., 0.], [1., 2., 0., -1.]])
...     h = matrix([3., 3., 0., 0.])
...     sol = solvers.lp(c, G, h)
...     solution = np.array(sol['x'],dtype=float).flatten()
...     return solution
... 
     pcost       dcost       gap    pres   dres   k/t
 0: -8.1223e+00 -1.8293e+01  4e+00  0e+00  7e-01  1e+00
 1: -8.8301e+00 -9.4605e+00  2e-01  1e-16  4e-02  3e-02
 2: -9.0229e+00 -9.0297e+00  2e-03  2e-16  5e-04  4e-04
 3: -9.0248e+00 -9.0248e+00  2e-05  3e-16  5e-06  4e-06
 4: -9.0248e+00 -9.0248e+00  2e-07  2e-16  5e-08  4e-08
Optimal solution found.

这篇关于Python中的随机优化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆