Python 3.x 用python计算自定义概率分布(数值)

Python 3.x 用python计算自定义概率分布(数值),python-3.x,floating-point,precision,bayesian,probability-distribution,Python 3.x,Floating Point,Precision,Bayesian,Probability Distribution,我有一个自定义的(离散的)概率分布,它的定义形式是:f(x)/(给定离散集合x中x'的和(f(x'))。此外,0通过使用日志,您可以很好地进行计算。关键是,虽然分子和分母都可能下溢到0,但它们的日志不会,除非你的数字真的非常小 你说 f(x) = x^s*(1-x)^t 所以 你想计算,比如说 p = f(x) / Sum{ y in X | f(y)} 所以 唯一的困难是计算第二项,但这是一个常见的问题,例如 另一方面,手工计算logsumexp非常容易 我们想要 S = log( sum

我有一个自定义的(离散的)概率分布,它的定义形式是:f(x)/(给定离散集合x中x'的和(f(x'))。此外,0通过使用日志,您可以很好地进行计算。关键是,虽然分子和分母都可能下溢到0,但它们的日志不会,除非你的数字真的非常小

你说

f(x) = x^s*(1-x)^t
所以

你想计算,比如说

p = f(x) / Sum{ y in X | f(y)}
所以

唯一的困难是计算第二项,但这是一个常见的问题,例如

另一方面,手工计算logsumexp非常容易

我们想要

S = log( sum{ i | exp(l[i])})
如果L是L[i]的最大值,则

S = log( exp(L)*sum{ i | exp(l[i]-L)})
  = L + log( sum{ i | exp( l[i]-L)})
最后一个和可以按写入方式计算,因为每个项现在都在0和1之间,因此没有溢出的危险,其中一个项(其中l[i]==l)为1,因此如果其他项下溢,这是无害的

然而,这可能会失去一点准确性。一种改进是识别一组索引,其中

l[i]>=L-eps (eps a user set parameter, eg 1)
然后计算

N = Sum{ i in A | exp(l[i]-L)}
B = log1p( Sum{ i not in A | exp(l[i]-L)}/N)
S = L + log( N) + B

通过使用日志,您可以很好地进行计算。关键是,虽然分子和分母都可能下溢到0,但它们的日志不会,除非你的数字真的非常小

你说

f(x) = x^s*(1-x)^t
所以

你想计算,比如说

p = f(x) / Sum{ y in X | f(y)}
所以

唯一的困难是计算第二项,但这是一个常见的问题,例如

另一方面,手工计算logsumexp非常容易

我们想要

S = log( sum{ i | exp(l[i])})
如果L是L[i]的最大值,则

S = log( exp(L)*sum{ i | exp(l[i]-L)})
  = L + log( sum{ i | exp( l[i]-L)})
最后一个和可以按写入方式计算,因为每个项现在都在0和1之间,因此没有溢出的危险,其中一个项(其中l[i]==l)为1,因此如果其他项下溢,这是无害的

然而,这可能会失去一点准确性。一种改进是识别一组索引,其中

l[i]>=L-eps (eps a user set parameter, eg 1)
然后计算

N = Sum{ i in A | exp(l[i]-L)}
B = log1p( Sum{ i not in A | exp(l[i]-L)}/N)
S = L + log( N) + B

这似乎是一个合理的答案,但我不允许使用scipy,只允许使用Numpy和其他基本库。@AdityaAgarwal我编辑了我的答案,以包括如何计算LogsumExp这似乎是一个合理的答案,但我不允许使用scipy,唯一允许使用的库是Numpy和其他基本库。@AdityaAgarwal我编辑了我的答案,包括如何计算logsumexp