2024-10-09 20:24:50 发布
网友
我在等着呢
scipy.stats.norm.expect(loc = 55, scale = 1)
返回分布55的平均值,而不是返回3.9096876333292135e-108。 我用错了吗?谁能给我解释一下这个函数是怎么工作的吗。谢谢
我想这应该是个虫子。您已经正确地理解了手册,但是事实证明,如果"loc"大于35.6,那么情况就会变得异常。否则,它将按预期工作。在
"loc"
问题是:
import scipy.stats #expect(func, loc=0, scale=1, lb=None, ub=None, conditional=False, **kwds) for i in range(26, 55): print scipy.stats.norm.expect(loc=i,scale=1),
输出:
对于更大的scale(标准偏差),行为的“截止点”会进一步向外移动,正如您所预期的那样。在
scale
problem can be 'fixed' by setting the lower and upper bounds explicitly,如下所示:
problem can be 'fixed' by setting the lower and upper bounds explicitly
import numpy as np for i in np.arange(5,100,5): print i,scipy.stats.norm.expect(loc=55,lb=-i,ub=i,scale=1)
5 0.0 10 0.0 15 0.0 20 2.01210143973e-267 25 1.05364770562e-196 30 7.87517644756e-137 35 8.61623210583e-88 40 1.40277331283e-49 45 3.46495136419e-22 50 1.42791169386e-05 55 27.1010577196 60 54.9999827474 65 55.0 70 55.0 75 55.0 80 55.0 85 55.0 90 55.0 95 55.0
但一定有一个微妙的缺陷。如果你看一下source(参见类rv_continous的init方法),你会发现默认限制是作为Numpy的“inf”导入的。 如果以+/-np.inf公司你会得到与OP描述的相同的行为:
rv_continous
for i in np.arange(5,60,5): print i,scipy.stats.norm.expect(loc=i,lb=-np.inf,ub=np.inf,scale=1)
5 5.0 10 10.0 15 15.0 20 20.0 25 25.0000000007 30 30.0 35 35.0 40 1.57463854604e-26 45 1.03158350625e-56 50 9.38568238273e-98 55 3.90968763333e-108
还请注意,在source中的expect的定义中,集成警告被静音:
expect
# Silence floating point warnings from integration. olderr = np.seterr(all='ignore') vals = integrate.quad(fun, lb, ub, **kwds)[0] / invfac
问题的根源很可能在于integrate.quad如何处理给定为+/-np.inf的限制。实际的source for the integration is in Fortran,但对无限区间的数值积分是如何进行的(映射到有限的范围,就像黎曼球的情况一样)在Wikipedia中给出。在
integrate.quad
np.inf
我想这应该是个虫子。您已经正确地理解了手册,但是事实证明,如果
"loc"
大于35.6,那么情况就会变得异常。否则,它将按预期工作。在问题是:
输出:
^{pr2}$对于更大的
scale
(标准偏差),行为的“截止点”会进一步向外移动,正如您所预期的那样。在problem can be 'fixed' by setting the lower and upper bounds explicitly
,如下所示:输出:
但一定有一个微妙的缺陷。如果你看一下source(参见类
rv_continous
的init方法),你会发现默认限制是作为Numpy的“inf”导入的。 如果以+/-np.inf公司你会得到与OP描述的相同的行为:输出:
还请注意,在source中的
expect
的定义中,集成警告被静音:问题的根源很可能在于
integrate.quad
如何处理给定为+/-np.inf
的限制。实际的source for the integration is in Fortran,但对无限区间的数值积分是如何进行的(映射到有限的范围,就像黎曼球的情况一样)在Wikipedia中给出。在相关问题 更多 >
编程相关推荐