蟒蛇同情Luce的统治

时间:2014-01-25 16:25:58

标签: python integration sympy

我想使用Luce's axiom计算二元决策的概率。相似度函数使用指数定义如下;

sA = b+exp(-|x-xA|)
sB = b+exp(-|x-xB|)
pA = 1/(1+(sB/sA))

为了弥补损失,我们需要在各自的范围内将pA和1-pA整合到x上。

loss = integrate(pA, (x,0,0.5)) + integrate(1-pA, (x,0.5,1))

当使用sympy写的时候,当b = 0(0.5075)时我会得到损失但是当b> 0时会出现以下错误;

  

提高PolynomialDivisionFailed(f,g,K)   sympy.polys.polyerrors.PolynomialDivisionFailed:在分割时无法减少多项式>除法算法的度数   [-0.426881219248826 * _z + 0.0106631460069606] by [_z - 0.0249791874803424]。这可以在不可能发生时发生   在系数域中取0。计算域是RR(_z)。在该系数中保证零检测>   域名。这可能表示SymPy中存在错误,或者该域是用户定义的,并且未正确实施零检测。

我不确定这个错误意味着什么。

python代码是(错误不依赖于特定的xA和xB);

from sympy import *

var('x')
xA = 0.8
xB = 0.9
#this works
b = 0
sA = b+exp(-abs(x-xA))
sB = b+exp(-abs(x-xB))
pA = 1/(1+(sB/sA))
print pA
loss = integrate(pA, (x,0,0.5)) + integrate(1-pA, (x,0.5,1))
print loss.evalf()
#this doesn't
b = 1
sA = b+exp(-abs(x-xA))
sB = b+exp(-abs(x-xB))
pA = 1/(1+(sB/sA))
print pA
loss = integrate(pA, (x,0,0.5)) + integrate(1-pA, (x,0.5,1)) #fails here
print loss.evalf()

作为一个注释,工作部分需要几分钟来计算,有没有办法加快速度?

我将不胜感激任何帮助/建议。

由于

编辑:编辑了代码中的拼写错误

1 个答案:

答案 0 :(得分:2)

当您实际评估积分时,将pA整合到第二个积分中。 在描述中你说它应该是1 - pA,所以我认为这就是你想要的。

积分未评估的事实似乎是SymPy中的错误。 这是一个适用于我的机器的修改。

import sympy as sy
x = sy.symbols('x')
b = 1
sA = b + sy.exp(- sy.Abs(x - xA))
sB = b + sy.exp(- sy.Abs(x - xB))
pA = 1 / (1 + (sB / sA))
sy.N(sy.Integral(pA, (x, 0, 0.5)) + sy.Integral(1 - pA, (x, 0.5, 1)))

不幸的是,这仍然非常缓慢。 由于我定期安装sympy的开发版本,因此这项工作以及需要很长时间的事实可能是我的安装的特性。

我真的建议使用某种形式的数值积分,除非你特别需要一个符号表达式。 鉴于上面的初始化和导入相同(但不是积分),可以这样做:

from sympy.mpmath import quad
# Make the expression into a callable function.
pA_func = sy.lambdify([x], pA)
quad(pA_func, [0, .5]) + quad(lambda x: 1 - pA_func(x), [.5, 1])

SciPy也有一些集成例程。 以下是上述两行的替代方案。

from scipy.integrate import quad
# Make the expression into a callable function.
pA_func = sy.lambdify([x], pA)
quad(pA_func, 0, .5)[0] + quad(lambda x: 1 - pA_func(x), .5, 1)[0]

希望这有帮助!