我试图结合
安装这两个包只需要使用
我得到了以下的PyMC错误:
为什么?有没有办法让
背景:
以防有人好奇,PyMC允许您从任何函数中采样。在这种特殊情况下,我们采样的函数是将LP问题映射到解决方案的函数。我们从该函数中采样,因为我们的LP问题包含随机系数,因此不能直接应用现成的LP求解器。
更具体地说,在这种情况下,单个PyMC输出样本只是LP问题的解决方案。随着LP问题的参数变化(根据您选择的分布),来自PyMC的输出样本将不同,并且希望获得后验分布。
上述解决方案受this answer启发,唯一的区别在于我希望使用真正的通用求解器(在这种情况下为
cvxopt
(一个优化求解器)和 PyMC(一个采样器)来解决凸性 随机优化问题。安装这两个包只需要使用
pip
十分简单。pip install cvxopt
pip install pymc
这两个包都可以独立完美地工作。以下是使用 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的输出样本将不同,并且希望获得后验分布。
上述解决方案受this answer启发,唯一的区别在于我希望使用真正的通用求解器(在这种情况下为
cvxopt
)。
cvxopt.solvers.options['show_progress'] = False
来抑制cvxopt
的输出。 这里有一个笔记本,其中包含整个解决方案。 - Abraham D Flaxman