来自scipy.stats.uniform的`a`和`b`属性的混淆

时间:2017-10-20 10:02:14

标签: python python-3.x scipy distribution

请考虑以下代码:

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)

看来,无论我为locscale提供的价值如何,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值设置正确。

干杯!

2 个答案:

答案 0 :(得分:2)

据我了解,ab是内部参数,未在scipy.stats.uniform中使用,因为它们的正常功能基本上与loc重复scale和{ {1}}参数。

正如scipy.stats.uniform documentation&#34中所述;此分布在locloc + scale之间保持不变。"

所以我不认为这是一个错误,因为ab的值应该被视为实现细节,而不是面向用户的功能。

答案 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')

因此ab将始终分别为0和1。

我猜你的困惑(我的偶然地用这种表示法)是大多数教科书将统一分布定义为between a and b。但在这种情况下,ab有点different,正如@jakevdp所说,

  

此分布在locloc + scale之间保持不变。

因此,将此与传统定义联系起来,将 a 视为loc,将 b 视为loc + scale

(如果您有兴趣,则将父类rv_continuous定义为here。)