cvxopt
(最適化ソルバー) と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 で使用しようとすると (たとえば、係数の 1 つに分布を配置することによって)、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 からの出力サンプルは異なるため、事後分布を取得することが望まれます。
上記のソリューションは、この回答に触発されたものです。唯一の違いは、真の一般的なソルバーを使用することを望んでいることです (この場合cvxopt
)