Ame*_*ina 6 python mathematical-optimization scipy cvxopt pymc
我试图结合cvxopt(优化求解器)和PyMC(采样器)来解决凸随机优化问题.
作为参考,安装两个软件包pip非常简单:
pip install cvxopt
pip install pymc
Run Code Online (Sandbox Code Playgroud)
两个包都可以很好地独立工作.以下是如何使用以下方法解决LP问题的示例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)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将它与PyMC一起使用时(例如,通过在其中一个系数上放置分布),PyMC会给出错误:
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)
Run Code Online (Sandbox Code Playgroud)
我收到以下PyMC错误:
<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
Run Code Online (Sandbox Code Playgroud)
为什么?有没有什么方法可以cvxopt很好地发挥PyMC?
如果有人想知道,PyMC允许您从您选择的任何功能中进行采样.在这种特殊情况下,我们采样的函数是将LP问题映射到解决方案的函数.我们正在从这个函数中提取样本,因为我们的LP问题包含随机系数,因此不能仅仅应用现成的LP求解器.
更具体地说,在这种情况下,单个PyMC输出样本只是LP问题的解决方案.由于LP问题的参数不同(根据您选择的分布),PyMC的输出样本会有所不同,希望得到后验分布.
c1生成的类型pm.Normal是numpy array,您只需将其剥离并将其转换为float(c1),然后它可以正常工作:
>>> @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.
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3301 次 |
| 最近记录: |