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