请考虑以下代码:
import scipy
print(scipy.__version__) # gives 0.19.1
# Scipy.stats.uniform
unif = scipy.stats.uniform(1, 2)
print(unif.a, unif.b, unif.args) # gives a=0, b=1, args=(1,2)
看来,无论我为loc
和scale
提供的价值如何,uniform
- 函数都会返回a=0,b=1
。
将其与例如randint
:
# Scipy.stats.randint
randi = scipy.stats.randint(1, 10)
print(randi.a, randi.b, randi.args) # gives a=1, b=9, args=(1,10)
...返回我期望的内容。
所以我的问题变成了:这是scipy
中的错误,还是我误解了某些内容?但是unif.args
值设置正确。
干杯!
答案 0 :(得分:2)
据我了解,a
和b
是内部参数,未在scipy.stats.uniform
中使用,因为它们的正常功能基本上与loc
重复scale
和{ {1}}参数。
正如scipy.stats.uniform
documentation&#34中所述;此分布在loc
和loc
+ scale
之间保持不变。"
所以我不认为这是一个错误,因为a
和b
的值应该被视为实现细节,而不是面向用户的功能。
答案 1 :(得分:2)
相关来源是here,略有删节:
class uniform_gen(rv_continuous):
"""A uniform continuous random variable.
This distribution is constant between `loc` and ``loc + scale``.
# ...
"""
def _rvs(self):
return self._random_state.uniform(0.0, 1.0, self._size)
# ....
uniform = uniform_gen(a=0.0, b=1.0, name='uniform')
因此a
和b
将始终分别为0和1。
我猜你的困惑(我的偶然地用这种表示法)是大多数教科书将统一分布定义为between a and b。但在这种情况下,a
和b
有点different,正如@jakevdp所说,
此分布在
loc
和loc + scale
之间保持不变。
因此,将此与传统定义联系起来,将 a 视为loc
,将 b 视为loc + scale
。
(如果您有兴趣,则将父类rv_continuous
定义为here。)