我正在尝试结合cvxopt http://cvxopt.org/(优化求解器)和PyMC https://github.com/pymc-devs/pymc(采样器)解决凸问题随机优化问题.
作为参考,安装这两个软件包pip
很简单:
pip install cvxopt
pip install pymc
两个包都独立工作得很好。这是如何解决 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)
然而,当我尝试将它与 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)
我收到以下 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
为什么?有什么办法可以使cvxopt
玩得很开心PyMC
?
背景:
如果有人想知道,PyMC 允许您从您选择的任何函数中进行采样。在这种特殊情况下,我们采样的函数是将 LP 问题映射到解决方案的函数。我们从此函数中进行采样,因为我们的 LP 问题包含随机系数,因此不能仅应用现成的 LP 求解器。
更具体地说,在这种情况下,单个 PyMC 输出样本只是 LP 问题的解决方案。由于 LP 问题的参数不同(根据您选择的分布),PyMC 的输出样本会不同,希望得到后验分布。
上述解决方案的灵感来自这个答案 https://stats.stackexchange.com/a/110063/30802,唯一的区别是我希望使用真正的通用求解器(在本例中cvxopt http://cvxopt.org/)