Python中AB测试的数值稳定性

时间:2019-05-22 06:01:29

标签: python precision numeric ab-testing

给出X~Beta(a1, b1)Y~Beta(a2, b2),我想计算E[f(x, y)],以便以数值稳定的方式在python中进行AB测试。

要获得第一印象,我使用f(x, y) = I(x>y)和(约)0.5的期望值用于对称分布,即a1=b1a2=b2。该代码似乎适用于较小的值,但适用于较大的值。

因此,问题是:

  1. 为什么下面的代码仅适用于较小的值?
  2. 数值上更稳定的解决方案会是什么样子?

我还尝试过密度的版本不适用于对数和this one之类的直接解决方案,但从未实现数值稳定性。

from scipy.special import betaln
from math import exp, log
from scipy.integrate import dblquad

def loss(x, y):
    return 1 if x>y else 0


def density(x, y, a1, b1, a2, b2):
    return exp((a1-1) * log(x) + (b1-1) * log(1-x) + (a2-1) * log(y) + (b2-1) * log(1-y) - lbeta(a1, b1) - lbeta(a2, b2))


def expected_loss_dblquad(a1, b1, a2, b2, *args, **kwargs):
    return dblquad(lambda x, y: loss(x, y) * density(x, y, a1, b1, a2, b2),
                   0, 1, lambda x: 0, lambda x: 1, *args, **kwargs)

expected_loss_dblquad(1, 1, 1, 1)  # returns (0.499997642156207, 1.4849469934935522e-08)

expected_loss_dblquad(10, 10, 100, 100)  # returns (0.17088036863463973, 8.33972164867105e-08)

0 个答案:

没有答案