【问题标题】:python sympy for Luce's rulepython 同情卢斯的规则
【发布时间】:2014-02-16 15:38:41
【问题描述】:

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

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

为了得到损失,我们需要在各自的范围内对 pA 和 1-pA over x 进行积分。

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

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

raise PolynomialDivisionFailed(f, g, K) sympy.polys.polyerrors.PolynomialDivisionFailed:在除法时无法减少多项式>除法算法中的度数 [-0.426881219248826*_z + 0.0106631460069606] 由 [_z - 0.0249791874803424]。这可能 > 在无法解决时发生 系数域中的 tect 零。计算域是 RR(_z)。零检测 > 在这个系数中得到保证 nt 域。这可能表明 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()

请注意,计算工作部分需要几分钟,有什么方法可以加快速度吗?

如果有任何帮助/建议,我将不胜感激。

谢谢

编辑:编辑代码中的错字

【问题讨论】:

    标签: python integration sympy


    【解决方案1】:

    当您实际评估积分时,您会将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]
    

    希望这会有所帮助!

    【讨论】:

    • 数值积分解决方案非常适合我,谢谢! (我已经编辑了我的帖子以纠正错字)
    • 是的,调用integrate 是没有意义的,然后在输出上立即调用evalfintegrate 将尝试找到一个封闭形式的符号解决方案,但随后 evalf 只会将其转换为数字解决方案。因此,您不妨从一开始就进行数字积分。另一种方法的唯一优点是,在某些情况下,对封闭形式的解进行数值计算比数值计算积分要快。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多