问题描述
我正在尝试将 cvxopt
(优化求解器)和 PyMC (采样器)来解决凸的随机优化问题.
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
为什么?有什么方法可以使cvxopt
与PyMC
完美搭配?
Why? Is there any way to make cvxopt
play 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中的随机优化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!