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

标签 python numpy scipy

我正在复习 python 的一些分布函数:

均匀分布、二项分布、伯努利分布、正态分布

我发现 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 随机模块:https://docs.scipy.org/doc/numpy/reference/routines.random.html

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

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

最佳答案

scipy 生成一个随机变量,而 numpy 生成随机数。当你使用np.random.binomial(n, p, 1)时,它只是随机变量的一个realization (binom(n, p)):

In probability and statistics, a realization, or observed value, of a random variable is the value that is actually observed (what actually happened). The random variable itself is the process dictating how the observation comes about. Statistical quantities computed from realizations without deploying a statistical model are often called "empirical", as in empirical distribution function or empirical probability.

一般来说,numpy 所做的就是多次掷骰子。另一方面,scipy 告诉您连续获得两个 6 的概率是多少。如果抛硬币一百次,预期的反面数是多少。

当然,您可以在 numpy 中运行模拟并估算这些值(掷一百万次硬币,反面的数量将约为 50 万次)。然而,这只是实验的结果。一个随机变量告诉你理论解(对于二项式,这是 n 乘以 p,其中 n 是试验次数,p 是概率。所以你会得到恰好 500千。


这是一个小演示:

import scipy.stats as ss
import numpy as np

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

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

rv.mean()
Out: 3000.0

rv.std()
Out: 45.825756949558397

从该分布生成 100 个随机数:

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

计算均值和标准差:

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

再生成 100:

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

样本量越大,均值和标准差将越接近分布均值和分布标准差:

random_numbers = prng.binomial(n, p, size=10**7)

random_numbers.mean()
Out: 2999.9639155

random_numbers.std()
Out: 45.854409513250303

关于python - scipy.stats 模块和 numpy.random 模块之间的区别是什么,两个模块都有类似的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44817444/

相关文章:

python - numpy 屏蔽不规则数组

python - 在 scipy 中删除/设置稀疏矩阵的非零对角线元素

python - scipy.cluster.vq.kmeans2 中的 "Matrix is not positive definite"错误

Python Atom Hydrogen,逐行或一次性单步执行代码

python - 使用 numpy 进行 MXNet 参数序列化

python - ValueError : Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=4, 发现 ndim=3。收到的完整形状 : [8, 28, 28]

python - 属性错误: type object 'pandana.cyaccess.cyaccess' has no attribute '__reduce_cython__'

python - 多维ndarray集合运算

python - 如何初始化空列表?

python - Scipy:收敛指标