我正在做一些物理学研究,我需要使用马尔可夫链蒙特卡罗(MCMC)来分析一些数据。我试着自己写一个,但是当python / numpy将非常小的数字减少到零时,我会不断遇到错误。特别是当我需要做numpy.exp(-1000)
之类的事情时。那个表达式本身就是一个更大的数学方程式的一部分,所以我不能只记录它。
我知道有一些MCMC模块可用于python,我已经看过其中的一些,但我很难理解他们应用它们的文档。谁能推荐一个人?我所拥有的是我插入概率分布的一列数据。这个分布还有另外两个变量,我将随机进行并记录马尔可夫链中的每一步。然后,我需要根据马尔可夫链对这两个变量中的每一个进行直方图。如果这个问题太模糊,我道歉。任何想法或建议都非常感谢,谢谢!
答案 0 :(得分:2)
如果您的系统可用,请使用更高精度的浮动。例如,如果您有float128
:
import numpy as np
print(np.exp(np.float128(-1000))) # 5.07595889755e-435
print(np.exp(np.float128(-10000))) # 1.13548386531e-4343
另见longdouble
。这实际上取决于您的操作系统支持的内容和方式。
您可以转换需要此精度的数组,并使用Numpy函数处理它们:
# Example array with 3 dimensions
d = np.random.uniform(-10000, -100, 24)
d.shape = (2, 3, 4)
# Cast to a higher precision
D = d.astype(np.float128)
np.exp(D[:,2]) # array([[4.263772e-4326, 4.3465066e-1474, ...
答案 1 :(得分:0)
使用PyMC - 非常棒。完成教程,您很快就会了解如何构建模型。