给出X~Beta(a1, b1)
和Y~Beta(a2, b2)
,我想计算E[f(x, y)]
,以便以数值稳定的方式在python中进行AB测试。
要获得第一印象,我使用f(x, y) = I(x>y)
和(约)0.5的期望值用于对称分布,即a1=b1
和a2=b2
。该代码似乎适用于较小的值,但适用于较大的值。
因此,问题是:
我还尝试过密度的版本不适用于对数和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)