我正在使用scipy的stats模块来尝试确定上尾概率达到某个小值的分布值,但是我得到了一些非常不切实际的结果。例如:
我将β分布拟合到用于信号匹配操作的归一化相关系数的平方数组(相关系数总是在-1和1之间,因此其平方在0和1之间)。使用
import scipy, numpy as np
bd=scipy.beta.fit(np.square(data),floc=0,fscale=1) #fitted beta dist
它给了我的β分布参数 (0.42119596435034012,16939.046996018118,0,1)数据阵列长约300万个元素。
现在,当我绘制分布时,很明显分布的大部分区域在x轴上非常接近0
import matplotlib.pyplot as plt
x=x=np.linspace(0,1,num=1000000)
plt.plot(x,scipy.stats.beta.pdf(x,betaparams[0],betaparams[1]))
plt.xlim([0,.0001])
现在当我试图找到一些上尾概率仍然存在的x值时,我得到一些意想不到的行为。例如
for expon in [-1,-2,-3,-4,-5,-6,-7,-8,-9,-10]:
print (expon,scipy.stats.beta.isf(10**expon,betaparams[0],betaparams[1]))
yeilds:
(-1, 6.9580465891063448e-05)
(-2, 0.00018124328968143608)
(-3, 0.00030250611696189104)
(-4, 0.00042796070123291116)
(-5, 0.0005557482540313166)
(-6, 0.00068501413697673774)
(-7, 0.99999966996999767)
(-8, 0.99999996699699967)
(-9, 0.99999999669970008)
(-10, 0.99999999966997)
显然,scipy估计会在10 ** - 7左右回归。我的问题是为什么,为什么它会默默地表达这种行为,以及如何解决它。
由于
答案 0 :(得分:2)
这似乎是scipy.special.btdtri
中的一个错误,它应该计算β分布的分位数。也许您可以提交错误报告。
>>> from scipy import special
>>> special.btdtri (betaparams[0],betaparams[1], 1-1e-6)
0.00068501413697504238
>>> special.btdtri (betaparams[0],betaparams[1], 1-1e-7)
0.99999966996999767
我无法确定btdtri
的定义位置。
编辑:为了记录,这里是SciPy错误报告:https://github.com/scipy/scipy/issues/4677