scipy.stats模块和numpy.random模块之间有什么区别,两个模块之间的类似方法有什么区别?

时间:2017-06-29 06:05:04

标签: python numpy scipy

我在python上查看了一些分发函数:

Uniform,Binomial,Bernoulli,normal distribution

我发现scipy和numpy都有相同的功能。

>>> from scipy.stats import binom
>>> rv = binom(n, p)

>>> import numpy as np
>>> s = np.random.binomial(n, p, 1000)

查看代码我发现scipy在内部使用numpy:

https://github.com/scipy/scipy/blob/master/scipy/stats/_discrete_distns.py

https://github.com/numpy/numpy/blob/master/numpy/random/mtrand/distributions.c

所以,我的问题是拥有2份相同分配函数的主要动机是什么?

scipy库提供了哪些附加功能?numpy中没有?

每个模块中的完整方法列表如下:

Numpy Random模块:https://docs.scipy.org/doc/numpy/reference/routines.random.html

Scipy stats模块:https://docs.scipy.org/doc/scipy/reference/stats.html

我发现了两个模块之间的一些基本区别:Difference between random draws from scipy.stats....rvs and numpy.random

2 个答案:

答案 0 :(得分:4)

scipy生成随机变量,而numpy生成随机数。当您使用np.random.binomial(n, p, 1)时,它只是随机变量realizationenter image description here

  

在概率和统计中,a的实现或观察值   随机变量是实际观察到的值(实际上是什么   发生过)。随机变量本身就是决定如何进行的过程   观察来了。从中计算的统计量   通常会调用未部署统计模型的实现   "经验",如经验分布函数或经验   概率。

一般来说,numpy的作用是多次掷骰子。另一方面,scipy告诉你连续获得两个六的概率是多少。如果您将硬币翻转一百次,那么预期的尾巴的数量是多少?

当然,您可以在numpy中运行模拟并近似这些值(翻转一百万次硬币,尾巴数量约为50万)。然而,这只是实验的结果。随机变量告诉你理论解决方案(对于二项式,这是 n p 其中n是试验次数,p是概率。所以你会得到500万。

这是一个小小的演示:

binom(n, p)

获取随机变量的平均值和标准差

import scipy.stats as ss
import numpy as np

n, p = 10**4, 0.3
rv  = ss.binom(n, p)

从该分发中生成100个随机数:

rv.mean()
Out: 3000.0

rv.std()
Out: 45.825756949558397

计算平均值和标准差:

prng = np.random.RandomState(0)    
random_numbers = prng.binomial(n, p, size=100)

生成另一个100:

random_numbers.mean()
Out: 3004.8099999999999
random_numbers.std()
Out: 47.336813369723146

不同的均值和标准差:

prng = np.random.RandomState(1)
random_numbers = prng.binomial(n, p, size=100)

进一步增加样本量,均值和标准差将接近分布均值和分布标准差:

random_numbers.mean()
Out: 2990.96

random_numbers.std()
Out: 46.245631145006548

答案 1 :(得分:3)

  

scipy库提供了哪些附加功能?numpy中没有?

如果您查看其中一个单独发行版的文档(例如beta),则可以看到其他功能。 numpy函数只允许绘制随机值。 scipy发行版有许多额外的方法可用于其他事物,如百分位数,累积分布函数以及平均值和标准差等统计数据。

scipy给你的一些信息不能直接从numpy函数中计算出来。 numpy函数仅为您提供随机绘制的单个值,但scipy以数学方式表示分布,并且可以在不实际绘制任何值的情况下计算某些内容。例如,scipy分布返回的许多统计数据都是用精确的数学公式计算的。您可以在链接到的源中看到,例如,binom_gen._stats直接计算均值,stdev等。要使用numpy找到平均值,你必须绘制一堆值(理论上是无限数)并计算它们的平均值; scipy抽象地抽象而不绘制任何值。 scipy发行版揭示了numpy无法获得的分布的数学细节。