2014-01-18 78 views
1

我正在使用statsmodels庫進行通用似然模型。由於我有一個相當複雜的似然函數,我用sympy來爲我計算梯度和粗麻布。這工作正常,但對我的需求來說太慢了,因爲似然函數包含術語b0*x0 + b1*x1 + ... + bn*xn。這樣,粗麻布尺寸增加了N^2,複雜性也增加了。黑森州的如何在sympy中優化hessian的評估?

元素往往相當類似像expensive_operation * x0expensive_operation * x1等,這意味着,如果我可以預先計算expensive_operation,並用它在功能麻袋,我會急劇增加性能。

所以問題是 - 是否有一個工具,將採取功能列表,優化它們,然後有效地評估它們?像numexpr這將採取功能列表?

+0

SymPy具有'cse'。那是你在找什麼? – asmeurer

+0

正是我在找的東西。如果你把它寫成普通郵件,我會接受它。 – Marigold

+0

您還應該看看Theano以及Theano/SymPy集成。 – asmeurer

回答

1

SymPy有cse,表示消除常見的子表達式。見the docs

一個簡單的例子:

>>> print(cse(sin(x**2)*cos(x**2) + 2*sin(x**2) - cos(x**2))) 
([(x0, x**2), (x1, sin(x0)), (x2, cos(x0))], [x1*x2 + 2*x1 - x2])